module ZkFold.Symbolic.Data.Conditional where

import           Prelude                   hiding (Bool, Num (..), (/))

import           ZkFold.Symbolic.Data.Bool (BoolType (..))

class BoolType b => Conditional b a where
    bool :: a -> a -> b -> a

    gif :: b -> a -> a -> a
    gif b
b a
x a
y = a -> a -> b -> a
forall b a. Conditional b a => a -> a -> b -> a
bool a
y a
x b
b

    (?) :: b -> a -> a -> a
    (?) = b -> a -> a -> a
forall b a. Conditional b a => b -> a -> a -> a
gif

instance {-# OVERLAPPABLE #-} (BoolType b, Eq b) => Conditional b x where
    bool :: x -> x -> b -> x
bool x
f x
t b
b = if b
b b -> b -> Bool
forall a. Eq a => a -> a -> Bool
== b
forall b. BoolType b => b
true then x
t else x
f