{-# LANGUAGE InstanceSigs #-}
module Geometry.VertexEnum.Constraint
  ( Sense (..)
  , Constraint (..)
  , toRationalConstraint
  , (.>=.)
  , (.<=.)
  , (.>=)
  , (.<=) )
  where
import Geometry.VertexEnum.LinearCombination ( LinearCombination, constant, toRationalLinearCombination )

data Sense = Gt | Lt
  deriving Sense -> Sense -> Bool
(Sense -> Sense -> Bool) -> (Sense -> Sense -> Bool) -> Eq Sense
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Sense -> Sense -> Bool
== :: Sense -> Sense -> Bool
$c/= :: Sense -> Sense -> Bool
/= :: Sense -> Sense -> Bool
Eq

instance Show Sense where
  show :: Sense -> String
  show :: Sense -> String
show Sense
Gt = String
">="
  show Sense
Lt = String
"<="

data Constraint a = Constraint (LinearCombination a) Sense (LinearCombination a)

toRationalConstraint :: Real a => Constraint a -> Constraint Rational
toRationalConstraint :: forall a. Real a => Constraint a -> Constraint Rational
toRationalConstraint (Constraint LinearCombination a
lhs Sense
sense LinearCombination a
rhs) = 
  LinearCombination Rational
-> Sense -> LinearCombination Rational -> Constraint Rational
forall a.
LinearCombination a -> Sense -> LinearCombination a -> Constraint a
Constraint (LinearCombination a -> LinearCombination Rational
forall a.
Real a =>
LinearCombination a -> LinearCombination Rational
toRationalLinearCombination LinearCombination a
lhs) Sense
sense (LinearCombination a -> LinearCombination Rational
forall a.
Real a =>
LinearCombination a -> LinearCombination Rational
toRationalLinearCombination LinearCombination a
rhs)

instance Show a => Show (Constraint a) where 
  show :: Constraint a -> String
  show :: Constraint a -> String
show (Constraint LinearCombination a
lhs Sense
sense LinearCombination a
rhs) = LinearCombination a -> String
forall a. Show a => a -> String
show LinearCombination a
lhs String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" " String -> ShowS
forall a. [a] -> [a] -> [a]
++ Sense -> String
forall a. Show a => a -> String
show Sense
sense String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" " String -> ShowS
forall a. [a] -> [a] -> [a]
++ LinearCombination a -> String
forall a. Show a => a -> String
show LinearCombination a
rhs 

(.>=.) :: LinearCombination a -> LinearCombination a -> Constraint a
.>=. :: forall a.
LinearCombination a -> LinearCombination a -> Constraint a
(.>=.) LinearCombination a
lhs = LinearCombination a -> Sense -> LinearCombination a -> Constraint a
forall a.
LinearCombination a -> Sense -> LinearCombination a -> Constraint a
Constraint LinearCombination a
lhs Sense
Gt

(.<=.) :: LinearCombination a -> LinearCombination a -> Constraint a
.<=. :: forall a.
LinearCombination a -> LinearCombination a -> Constraint a
(.<=.) LinearCombination a
lhs = LinearCombination a -> Sense -> LinearCombination a -> Constraint a
forall a.
LinearCombination a -> Sense -> LinearCombination a -> Constraint a
Constraint LinearCombination a
lhs Sense
Lt

(.>=) :: LinearCombination a -> a -> Constraint a
.>= :: forall a. LinearCombination a -> a -> Constraint a
(.>=) LinearCombination a
lhs a
x = LinearCombination a -> LinearCombination a -> Constraint a
forall a.
LinearCombination a -> LinearCombination a -> Constraint a
(.>=.) LinearCombination a
lhs (a -> LinearCombination a
forall a. a -> LinearCombination a
constant a
x)

(.<=) :: LinearCombination a -> a -> Constraint a
.<= :: forall a. LinearCombination a -> a -> Constraint a
(.<=) LinearCombination a
lhs a
x = LinearCombination a -> LinearCombination a -> Constraint a
forall a.
LinearCombination a -> LinearCombination a -> Constraint a
(.<=.) LinearCombination a
lhs (a -> LinearCombination a
forall a. a -> LinearCombination a
constant a
x)

infix 4 .<=., .>=., .<=, .>=