module Euler.Util.Foldable
( allEqual
) where
import Euler.Prelude
allEqual :: (Foldable f, Eq a) => f a -> Bool
allEqual = foldMap Aeq_same >>> not . aeq_different
data Aeq a = Aeq_nothing
| Aeq_different
| Aeq_same a
instance Eq a => Semigroup (Aeq a)
where
(<>) (Aeq_same x) (Aeq_same y)
| x == y = Aeq_same x
| otherwise = Aeq_different
(<>) Aeq_different _ = Aeq_different
(<>) _ Aeq_different = Aeq_different
(<>) Aeq_nothing x = x
(<>) x Aeq_nothing = x
instance (Eq a) => Monoid (Aeq a)
where
mempty = Aeq_nothing
aeq_different :: Aeq a -> Bool
aeq_different Aeq_different = True
aeq_different _ = False