packages feed

lol-0.3.0.0: utils/Apply/Zq.hs

{-# LANGUAGE ConstraintKinds, DataKinds, FlexibleContexts, FlexibleInstances,
             GADTs, MultiParamTypeClasses, NoImplicitPrelude, RankNTypes,
             RebindableSyntax, ScopedTypeVariables, TypeFamilies, TypeOperators,
             UndecidableInstances #-}

module Apply.Zq
(applyBasic
,LiftedMod(..)
,LiftedInvertible(..)
,Invertible(..)) where

import Apply
import GenArgs
import GenArgs.Zq
import Utils

import Control.Monad.Random

import Crypto.Lol
import Crypto.Lol.CRTrans

data BasicCtxD
type BasicCtx r =
  (Field r, Eq r, Random r, Random (ModRep r), ToInteger (ModRep r),
   PID (ModRep r), ShowType r, CRTEmbed r, Mod r)
data instance ArgsCtx BasicCtxD where
    BC :: (BasicCtx r) => Proxy r -> ArgsCtx BasicCtxD
instance (params `Satisfy` BasicCtxD, BasicCtx r)
  => ( r ': params) `Satisfy` BasicCtxD where
  run _ f = f (BC (Proxy::Proxy r)) : run (Proxy::Proxy params) f

applyBasic :: (params `Satisfy` BasicCtxD, MonadRandom rnd) =>
  Proxy params
  -> (forall r . (BasicCtx r, Generatable rnd r, Generatable rnd (Invertible r))
       => Proxy r -> rnd res)
  -> [rnd res]
applyBasic params g = run params $ \(BC p) -> g p