module Satyros.QFIDL.Expressed where

import           Data.Set               (Set)
import qualified Data.Set               as Set
import           GHC.Generics           (Generic)
import           Satyros.QFIDL.Variable (Variable)

data Expressed
  = LessThanEqualTo Variable Variable Int
  deriving stock ((forall x. Expressed -> Rep Expressed x)
-> (forall x. Rep Expressed x -> Expressed) -> Generic Expressed
forall x. Rep Expressed x -> Expressed
forall x. Expressed -> Rep Expressed x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Expressed x -> Expressed
$cfrom :: forall x. Expressed -> Rep Expressed x
Generic, Expressed -> Expressed -> Bool
(Expressed -> Expressed -> Bool)
-> (Expressed -> Expressed -> Bool) -> Eq Expressed
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Expressed -> Expressed -> Bool
$c/= :: Expressed -> Expressed -> Bool
== :: Expressed -> Expressed -> Bool
$c== :: Expressed -> Expressed -> Bool
Eq, Eq Expressed
Eq Expressed
-> (Expressed -> Expressed -> Ordering)
-> (Expressed -> Expressed -> Bool)
-> (Expressed -> Expressed -> Bool)
-> (Expressed -> Expressed -> Bool)
-> (Expressed -> Expressed -> Bool)
-> (Expressed -> Expressed -> Expressed)
-> (Expressed -> Expressed -> Expressed)
-> Ord Expressed
Expressed -> Expressed -> Bool
Expressed -> Expressed -> Ordering
Expressed -> Expressed -> Expressed
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Expressed -> Expressed -> Expressed
$cmin :: Expressed -> Expressed -> Expressed
max :: Expressed -> Expressed -> Expressed
$cmax :: Expressed -> Expressed -> Expressed
>= :: Expressed -> Expressed -> Bool
$c>= :: Expressed -> Expressed -> Bool
> :: Expressed -> Expressed -> Bool
$c> :: Expressed -> Expressed -> Bool
<= :: Expressed -> Expressed -> Bool
$c<= :: Expressed -> Expressed -> Bool
< :: Expressed -> Expressed -> Bool
$c< :: Expressed -> Expressed -> Bool
compare :: Expressed -> Expressed -> Ordering
$ccompare :: Expressed -> Expressed -> Ordering
$cp1Ord :: Eq Expressed
Ord, Int -> Expressed -> ShowS
[Expressed] -> ShowS
Expressed -> String
(Int -> Expressed -> ShowS)
-> (Expressed -> String)
-> ([Expressed] -> ShowS)
-> Show Expressed
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Expressed] -> ShowS
$cshowList :: [Expressed] -> ShowS
show :: Expressed -> String
$cshow :: Expressed -> String
showsPrec :: Int -> Expressed -> ShowS
$cshowsPrec :: Int -> Expressed -> ShowS
Show)

variablesInExpressed :: Expressed -> Set Variable
variablesInExpressed :: Expressed -> Set Variable
variablesInExpressed (LessThanEqualTo Variable
x1 Variable
x2 Int
_) = [Variable] -> Set Variable
forall a. Ord a => [a] -> Set a
Set.fromList [Variable
x1, Variable
x2]