{-# LANGUAGE UndecidableInstances #-}
module Internal.Data.Basic.Compare where

import Internal.Interlude

import Internal.Data.Basic.Types
import Internal.Data.Basic.Sql.Types

class ComparableInDbExp (a :: *) (b :: *) where
    compareInDbExp :: Comparison -> a -> b -> ConditionExp
instance {-# INCOHERENT #-} (ValueAsDbExp b a, Ord a)
    => ComparableInDbExp (DbExp k a) b where
    compareInDbExp comp a b = Compare comp a (valueAsDbExp b)
instance {-# INCOHERENT #-} (ValueAsDbExp a b, Ord b)
    => ComparableInDbExp a (DbExp k b) where
    compareInDbExp comp a = Compare comp (valueAsDbExp a)

infix 4 ==.
infix 4 >.
infix 4 /=.
infix 4 <.
infix 4 <=.
infix 4 >=.
infixr 3 &&.
infixr 2 ||.

(>.), (==.), (/=.), (<.), (<=.), (>=.) :: ComparableInDbExp a b => a -> b -> ConditionExp
(>.) = compareInDbExp GreaterThan
(==.) = compareInDbExp Equal
(/=.) = compareInDbExp NotEqual
(<.) = compareInDbExp LessThan
(<=.) = compareInDbExp LessOrEqual
(>=.) = compareInDbExp GreaterOrEqual

(&&.) :: ConditionExp -> ConditionExp -> ConditionExp
(&&.) = BoolOp And

(||.) :: ConditionExp -> ConditionExp -> ConditionExp
(||.) = BoolOp Or