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