{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE Safe #-}
module Data.Order.Syntax (
(<),
(>),
Order,
(==),
(/=),
(<=),
(>=),
Total,
min,
max,
compare,
comparing,
Eq.Eq (),
Ord.Ord (),
) where
import safe Control.Exception
import safe qualified Data.Eq as Eq
import safe qualified Data.Ord as Ord
import safe Data.Order
import Prelude hiding (Eq (..), Ord (..))
infix 4 <, >
(<) :: Preorder a => a -> a -> Bool
< :: a -> a -> Bool
(<) = a -> a -> Bool
forall a. Preorder a => a -> a -> Bool
plt
(>) :: Preorder a => a -> a -> Bool
> :: a -> a -> Bool
(>) = (a -> a -> Bool) -> a -> a -> Bool
forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> a -> Bool
forall a. Preorder a => a -> a -> Bool
(<)
infix 4 ==, /=, <=, >=
(==) :: Eq.Eq a => a -> a -> Bool
== :: a -> a -> Bool
(==) a
x a
y = if a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
Eq./= a
x Bool -> Bool -> Bool
&& a
y a -> a -> Bool
forall a. Eq a => a -> a -> Bool
Eq./= a
y then Bool
True else a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
Eq.== a
y
(/=) :: Eq.Eq a => a -> a -> Bool
/= :: a -> a -> Bool
(/=) a
x a
y = Bool -> Bool
not (a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
y)
(<=) :: Order a => a -> a -> Bool
<= :: a -> a -> Bool
(<=) a
x a
y = a
x a -> a -> Bool
forall a. Preorder a => a -> a -> Bool
< a
y Bool -> Bool -> Bool
|| a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
y
(>=) :: Order a => a -> a -> Bool
>= :: a -> a -> Bool
(>=) a
x a
y = a
x a -> a -> Bool
forall a. Preorder a => a -> a -> Bool
> a
y Bool -> Bool -> Bool
|| a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
y
infix 4 `min`, `max`, `compare`, `comparing`
min :: Total a => a -> a -> a
min :: a -> a -> a
min a
x a
y = case a -> a -> Ordering
forall a. Total a => a -> a -> Ordering
compare a
x a
y of
Ordering
GT -> a
y
Ordering
_ -> a
x
max :: Total a => a -> a -> a
max :: a -> a -> a
max a
x a
y = case a -> a -> Ordering
forall a. Total a => a -> a -> Ordering
compare a
x a
y of
Ordering
LT -> a
y
Ordering
_ -> a
x
compare :: Total a => a -> a -> Ordering
compare :: a -> a -> Ordering
compare a
x a
y = case a -> a -> Maybe Ordering
forall a. Preorder a => a -> a -> Maybe Ordering
pcompare a
x a
y of
Just Ordering
o -> Ordering
o
Maybe Ordering
Nothing -> ArithException -> Ordering
forall a e. Exception e => e -> a
throw ArithException
DivideByZero
comparing :: Total a => (b -> a) -> b -> b -> Ordering
comparing :: (b -> a) -> b -> b -> Ordering
comparing b -> a
p b
x b
y = a -> a -> Ordering
forall a. Total a => a -> a -> Ordering
compare (b -> a
p b
x) (b -> a
p b
y)