packages feed

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