{-# LANGUAGE Safe #-}
module Data.List.Group (
groupWith, groupWith'
) where
import Data.List.NonEmpty(NonEmpty((:|)))
groupWith'
:: (b -> b -> Bool)
-> (a -> b)
-> [a]
-> [(b, NonEmpty a)]
groupWith' :: (b -> b -> Bool) -> (a -> b) -> [a] -> [(b, NonEmpty a)]
groupWith' eq :: b -> b -> Bool
eq f :: a -> b
f = [a] -> [(b, NonEmpty a)]
go
where go :: [a] -> [(b, NonEmpty a)]
go [] = []
go ~(x :: a
x:xs :: [a]
xs) = (b
fx, a
x a -> [a] -> NonEmpty a
forall a. a -> [a] -> NonEmpty a
:| [a]
ys) (b, NonEmpty a) -> [(b, NonEmpty a)] -> [(b, NonEmpty a)]
forall a. a -> [a] -> [a]
: [a] -> [(b, NonEmpty a)]
go [a]
zs
where ~(ys :: [a]
ys, zs :: [a]
zs) = (a -> Bool) -> [a] -> ([a], [a])
forall a. (a -> Bool) -> [a] -> ([a], [a])
span (b -> b -> Bool
eq b
fx (b -> Bool) -> (a -> b) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> b
f) [a]
xs
fx :: b
fx = a -> b
f a
x
groupWith :: Eq b
=> (a -> b)
-> [a]
-> [(b, NonEmpty a)]
groupWith :: (a -> b) -> [a] -> [(b, NonEmpty a)]
groupWith = (b -> b -> Bool) -> (a -> b) -> [a] -> [(b, NonEmpty a)]
forall b a.
(b -> b -> Bool) -> (a -> b) -> [a] -> [(b, NonEmpty a)]
groupWith' b -> b -> Bool
forall a. Eq a => a -> a -> Bool
(==)