import Control.Arrow
import Data.List

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

encode :: Eq a => [a] -> [(a,Int)]
encode xs = map (head &&& length) $ group xs

encodeModified :: Eq a => [a] -> [ListItem a]
encodeModified = map helper . encode
    where
        helper (a,1) = Single a
        helper (a,c) = Multiple a c