data ListItem a = Single a | Multiple a Int
    deriving (Show)

encode :: Eq a => [a] -> [(a,Int)]
encode = foldr encodeHelper [] 
    where 
        encodeHelper a p@((x,c):ps) | x==a = (a,c+1):ps
        encodeHelper a p = (a,1):p

encodeDirect :: Eq a => [a] -> [ListItem a]
encodeDirect = map encodeHelper . encode
    where
        encodeHelper (a,c)
            | c>1 = Multiple a c
            | otherwise = Single a