sdp-0.2: src/SDP/Comparing.hs
{-# LANGUAGE Safe #-}
{- |
Module : SDP.Comparing
Copyright : (c) Andrey Mulik 2019
License : BSD-style
Maintainer : work.a.mulik@gmail.com
Portability : portable
"SDP.Comparing" provide common comparators and combinators.
-}
module SDP.Comparing
(
-- * Exports
module Data.Ord,
module Data.Eq,
-- * Type synonyms
Equal, Compare,
-- * Common comparators
(<=>), eqfst, eqsnd, cmpfst, cmpsnd, invertcmp
)
where
import Data.Function
import Data.Ord
import Data.Eq
default ()
infixl 4 <=>
--------------------------------------------------------------------------------
{- Type synonyms. -}
-- | 'Equal' is just synonym of @(e -> e -> Bool)@.
type Equal e = e -> e -> Bool
-- | 'Compare' is just synonym of @(e -> e -> Ordering)@.
type Compare e = e -> e -> Ordering
--------------------------------------------------------------------------------
-- | Spaceship operator - infix version of compare.
(<=>) :: (Ord o) => Compare o
(<=>) = compare
-- | Compare tuples by first elements.
eqfst :: (Eq e) => Equal (e, s)
eqfst = (==) `on` fst
-- | Compare tuples by second elements.
eqsnd :: (Eq e) => Equal (f, e)
eqsnd = (==) `on` snd
-- | Compare tuples by first elements.
cmpfst :: (Ord o) => Compare (o, s)
cmpfst = comparing fst
-- | Compare tuples by second elements.
cmpsnd :: (Ord o) => Compare (f, o)
cmpsnd = comparing snd
-- | Common compare combinator
invertcmp :: Compare e -> Compare e
invertcmp = flip