{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ >=704
{-# LANGUAGE Safe #-}
#elif __GLASGOW_HASKELL__ >=702
{-# LANGUAGE Trustworthy #-}
#endif
module Data.Universe.Instances.Ord (
-- | An 'Ord' instance for functions, given the input is 'Finite' and the
-- output is 'Ord'. Compares pointwise, with higher priority to inputs
-- that appear earlier in 'universeF'.
Ord(..)
) where
import qualified Data.Monoid as Mon
import Data.Universe.Class (Finite (..))
import Data.Universe.Instances.Eq
instance (Finite a, Ord b) => Ord (a -> b) where
f `compare` g = Mon.mconcat [f x `compare` g x | x <- universeF]
instance (Finite a, Ord a) => Ord (Mon.Endo a) where
compare (Mon.Endo f) (Mon.Endo g) = compare f g