{-# LANGUAGE UnicodeSyntax #-}
-- | Provides a couple of convenience functions to be used for forming predicates.
module Data.Function.Predicate
(is,isn't,equals)
where
-- |An example will explain this more than anything:
--
-- > listsLongerThan3Elements :: [[a]] -> [[a]]
-- > listsLongerThan3Elements = filter (length `is` (>3))
is :: (a → b) → (b → Bool) → (a → Bool)
is = flip (.)
-- |The inverse of 'is'.
--
-- > listsShorterThanFourElements = filter (length `isn't` (>3))
isn't :: (a → b) → (b → Bool) → (a → Bool)
isn't p x y = not $ (p `is` x) y
-- |This is 'is' with a fixed equality condition.
--
-- Example:
--
-- > data Color = White | Black deriving (Eq)
-- > data ChessPiece = { color :: Color, name :: String }
-- > whitePieces = filter (color `equals` White)
equals :: (Eq b) ⇒ (a → b) → b → a → Bool
equals p y x = p x == y