{-# LANGUAGE DerivingStrategies #-}

module ZkFold.Base.Algebra.Basic.Sources where

import           Data.Set                        (Set)
import           Prelude                         hiding (replicate)

import           ZkFold.Base.Algebra.Basic.Class
import           ZkFold.Prelude

newtype Sources a i = Sources { forall {k} (a :: k) i. Sources a i -> Set i
runSources :: Set i }
    deriving newtype (NonEmpty (Sources a i) -> Sources a i
Sources a i -> Sources a i -> Sources a i
(Sources a i -> Sources a i -> Sources a i)
-> (NonEmpty (Sources a i) -> Sources a i)
-> (forall b. Integral b => b -> Sources a i -> Sources a i)
-> Semigroup (Sources a i)
forall b. Integral b => b -> Sources a i -> Sources a i
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
forall k (a :: k) i. Ord i => NonEmpty (Sources a i) -> Sources a i
forall k (a :: k) i.
Ord i =>
Sources a i -> Sources a i -> Sources a i
forall k (a :: k) i b.
(Ord i, Integral b) =>
b -> Sources a i -> Sources a i
$c<> :: forall k (a :: k) i.
Ord i =>
Sources a i -> Sources a i -> Sources a i
<> :: Sources a i -> Sources a i -> Sources a i
$csconcat :: forall k (a :: k) i. Ord i => NonEmpty (Sources a i) -> Sources a i
sconcat :: NonEmpty (Sources a i) -> Sources a i
$cstimes :: forall k (a :: k) i b.
(Ord i, Integral b) =>
b -> Sources a i -> Sources a i
stimes :: forall b. Integral b => b -> Sources a i -> Sources a i
Semigroup, Semigroup (Sources a i)
Sources a i
Semigroup (Sources a i) =>
Sources a i
-> (Sources a i -> Sources a i -> Sources a i)
-> ([Sources a i] -> Sources a i)
-> Monoid (Sources a i)
[Sources a i] -> Sources a i
Sources a i -> Sources a i -> Sources a i
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
forall k (a :: k) i. Ord i => Semigroup (Sources a i)
forall k (a :: k) i. Ord i => Sources a i
forall k (a :: k) i. Ord i => [Sources a i] -> Sources a i
forall k (a :: k) i.
Ord i =>
Sources a i -> Sources a i -> Sources a i
$cmempty :: forall k (a :: k) i. Ord i => Sources a i
mempty :: Sources a i
$cmappend :: forall k (a :: k) i.
Ord i =>
Sources a i -> Sources a i -> Sources a i
mappend :: Sources a i -> Sources a i -> Sources a i
$cmconcat :: forall k (a :: k) i. Ord i => [Sources a i] -> Sources a i
mconcat :: [Sources a i] -> Sources a i
Monoid)

instance MultiplicativeSemigroup c => Exponent (Sources a i) c where
  ^ :: Sources a i -> c -> Sources a i
(^) = Sources a i -> c -> Sources a i
forall a b. a -> b -> a
const

instance MultiplicativeMonoid c => Scale c (Sources a i) where
  scale :: c -> Sources a i -> Sources a i
scale = (Sources a i -> Sources a i) -> c -> Sources a i -> Sources a i
forall a b. a -> b -> a
const Sources a i -> Sources a i
forall a. a -> a
id

instance Ord i => AdditiveSemigroup (Sources a i) where
  + :: Sources a i -> Sources a i -> Sources a i
(+) = Sources a i -> Sources a i -> Sources a i
forall a. Semigroup a => a -> a -> a
(<>)

instance Ord i => AdditiveMonoid (Sources a i) where
  zero :: Sources a i
zero = Sources a i
forall a. Monoid a => a
mempty

instance Ord i => AdditiveGroup (Sources a i) where
  negate :: Sources a i -> Sources a i
negate = Sources a i -> Sources a i
forall a. a -> a
id

instance Finite a => Finite (Sources a i) where
  type Order (Sources a i) = Order a

instance Ord i => MultiplicativeSemigroup (Sources a i) where
  * :: Sources a i -> Sources a i -> Sources a i
(*) = Sources a i -> Sources a i -> Sources a i
forall a. Semigroup a => a -> a -> a
(<>)

instance Ord i => MultiplicativeMonoid (Sources a i) where
  one :: Sources a i
one = Sources a i
forall a. Monoid a => a
mempty

instance Ord i => MultiplicativeGroup (Sources a i) where
  invert :: Sources a i -> Sources a i
invert = Sources a i -> Sources a i
forall a. a -> a
id

instance Ord i => FromConstant c (Sources a i) where
  fromConstant :: c -> Sources a i
fromConstant c
_ = Sources a i
forall a. Monoid a => a
mempty

instance Ord i => Semiring (Sources a i)

instance Ord i => Ring (Sources a i)

instance Ord i => Field (Sources a i) where
    finv :: Sources a i -> Sources a i
finv = Sources a i -> Sources a i
forall a. a -> a
id
    rootOfUnity :: Natural -> Maybe (Sources a i)
rootOfUnity Natural
_ = Sources a i -> Maybe (Sources a i)
forall a. a -> Maybe a
Just (Set i -> Sources a i
forall {k} (a :: k) i. Set i -> Sources a i
Sources Set i
forall a. Monoid a => a
mempty)

instance (Finite a, Ord i) => BinaryExpansion (Sources a i) where
  binaryExpansion :: Sources a i -> [Sources a i]
binaryExpansion = Natural -> Sources a i -> [Sources a i]
forall a. Natural -> a -> [a]
replicate (forall a. KnownNat (NumberOfBits a) => Natural
numberOfBits @a)