data ListItem a = Single a | Multiple Int a deriving (Show) getListItem :: (Int, a) -> ListItem a getListItem (1, x) = Single x getListItem (n, x) = Multiple n x encode :: (Eq a) => [a] -> [(Int, a)] encode = foldr ( \x acc -> case acc of [] -> [(1, x)] (hd@(hd_n, hd_a) : tl) -> if x == hd_a then (hd_n + 1, hd_a) : tl else (1, x) : hd : tl ) [] encodeModified :: (Eq a) => [a] -> [ListItem a] encodeModified = map getListItem <$> encode