{-# LANGUAGE NoImplicitPrelude #-} {-# OPTIONS_GHC -fno-warn-tabs #-} module Hcompta.Expr.Ord where import Data.Bool import Data.Ord (Ord(..)) import Hcompta.Expr.Bool import Hcompta.Expr.Eq import Hcompta.Expr.Dup -- * Class 'Expr_Ord' class ( Expr_Bool repr , Expr_Eq repr ) => Expr_Ord repr where lt :: Ord a => repr a -> repr a -> repr Bool le :: Ord a => repr a -> repr a -> repr Bool le x y = (x `lt` y) `or` (x `eq` y) ge :: Ord a => repr a -> repr a -> repr Bool ge x y = neg (x `lt` y) gt :: Ord a => repr a -> repr a -> repr Bool gt x y = neg (x `le` y) instance -- Expr_Ord Dup ( Expr_Ord r1 , Expr_Ord r2 ) => Expr_Ord (Dup r1 r2) where lt (x1 `Dup` x2) (y1 `Dup` y2) = lt x1 y1 `Dup` lt x2 y2 le (x1 `Dup` x2) (y1 `Dup` y2) = le x1 y1 `Dup` le x2 y2 ge (x1 `Dup` x2) (y1 `Dup` y2) = ge x1 y1 `Dup` ge x2 y2 gt (x1 `Dup` x2) (y1 `Dup` y2) = gt x1 y1 `Dup` gt x2 y2