module Solutions.P09 (pack, pack') where
import Data.List (group)
pack :: Eq a => [a] -> [[a]]
pack :: forall a. Eq a => [a] -> [[a]]
pack [] = []
pack [a]
xs = [a]
duplicates [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [a] -> [[a]]
forall a. Eq a => [a] -> [[a]]
pack [a]
remainder
where ([a]
duplicates, [a]
remainder) = [a] -> ([a], [a])
forall a. Eq a => [a] -> ([a], [a])
extract [a]
xs
extract :: Eq a => [a] -> ([a], [a])
(a
x : ys :: [a]
ys@(a
y : [a]
_))
| a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
y = let ([a]
d, [a]
r) = [a] -> ([a], [a])
forall a. Eq a => [a] -> ([a], [a])
extract [a]
ys in (a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
d, [a]
r)
| Bool
otherwise = ([a
x], [a]
ys)
extract [a]
l = ([a]
l, [])
pack' :: Eq a => [a] -> [[a]]
pack' :: forall a. Eq a => [a] -> [[a]]
pack' = [a] -> [[a]]
forall a. Eq a => [a] -> [[a]]
group