import Data.List (sortBy)

myLen :: Num a => [b] -> a
myLen (x:xs) = 1 + myLen xs
myLen [] = 0

mySum :: Num a => [a] -> a
mySum (x:xs) = x + mySum xs
mySum [] = 0

myAvg :: Fractional a => [a] -> a
myAvg x = mySum x / myLen x

toPalindrome x = x ++ reverse x

splitListInHalf :: [a] -> ([a],[a])
splitListInHalf x = splitAt (floor ((fromIntegral (myLen x)) / 2)) x

-- A palindrome always have an even number of characters
isPalindrome :: Eq a => [a] -> Bool
isPalindrome x
    | (mod (myLen x) 2) /= 0 = False
    | firstpart == secondpart = True
    | otherwise = False
    where firstpart = fst (splitListInHalf x)
          secondpart = reverse (snd (splitListInHalf x))

-- Task 6
-- Create a function that sorts a list of lists based on the length of each sublist.

myOrderFunc :: a -> a -> Ordering
myOrderFunc x y
    | myLen x < myLen y = LT
    | myLen x == myLen y = EQ
    | myLen x > myLen y = GT

sortListOfLists :: [[a]] -> [[a]]
sortListOfLists x = sortBy myOrderFunc x
