module OpTypes where

type EqOp a     = a -> a -> Bool
type OrdOp a    = a -> a -> Bool
type CmpOp a    = a -> a -> Ordering


eqBy :: Eq a => (b -> a) -> EqOp b
eqBy f x y      = f x == f y

ordBy :: Ord a => (b -> a) -> OrdOp b
ordBy f x y      = f x <= f y

cmpBy :: Ord a => (b -> a) -> CmpOp b
cmpBy f x y      = f x `compare` f y