module ZkFold.Symbolic.Data.DiscreteField where

import           Data.Bool                        (bool)
import           Prelude                          hiding (Bool)
import qualified Prelude                          as Haskell

import           ZkFold.Base.Algebra.Basic.Class
import           ZkFold.Base.Algebra.Basic.Field  (Zp)
import           ZkFold.Base.Algebra.Basic.Number (Prime)
import           ZkFold.Symbolic.Data.Bool        (Bool (..), BoolType (..))

class (BoolType b, Field a) => DiscreteField b a where
    isZero :: a -> b

instance (Field a, Eq a) => DiscreteField Haskell.Bool a where
    isZero :: a -> Bool
isZero = (a -> a -> Bool
forall a. Eq a => a -> a -> Bool
== a
forall a. AdditiveMonoid a => a
zero)

instance (Prime p, Field x, Eq x) => DiscreteField (Bool (Zp p)) x where
    isZero :: x -> Bool (Zp p)
isZero = Zp p -> Bool (Zp p)
forall x. x -> Bool x
Bool (Zp p -> Bool (Zp p)) -> (x -> Zp p) -> x -> Bool (Zp p)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Zp p -> Zp p -> Bool -> Zp p
forall a. a -> a -> Bool -> a
bool Zp p
forall a. AdditiveMonoid a => a
zero Zp p
forall a. MultiplicativeMonoid a => a
one (Bool -> Zp p) -> (x -> Bool) -> x -> Zp p
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (x -> x -> Bool
forall a. Eq a => a -> a -> Bool
== x
forall a. AdditiveMonoid a => a
zero)