{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ViewPatterns #-}
module Test.Cardano.Ledger.Constrained.Ast where
import Cardano.Ledger.Coin (Coin (..), DeltaCoin (..))
import Cardano.Ledger.Core (Era, hashScript)
import Cardano.Ledger.Hashes (DataHash, ScriptHash (..))
import Cardano.Ledger.Plutus.Data (Data (..), hashData)
import Data.Char (toLower)
import Data.HashSet (HashSet)
import qualified Data.HashSet as HashSet
import Data.Hashable (Hashable)
import qualified Data.List as List
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as Map
import Data.Set (Set)
import qualified Data.Set as Set
import Data.Text (Text, pack)
import qualified Data.Universe as Univ (Any (..))
import Data.Void (Void)
import Data.Word (Word64)
import Lens.Micro
import Test.Cardano.Ledger.Constrained.Classes (
Adds (..),
Count (..),
OrdCond (..),
ScriptF (..),
Sizeable (..),
)
import Test.Cardano.Ledger.Constrained.Env (
Access (..),
AnyF (..),
Env (..),
Field (..),
Name (..),
Payload (..),
V (..),
findVar,
storeVar,
)
import Test.Cardano.Ledger.Constrained.Monad (HasConstraint (With), Typed (..), failT, monadTyped)
import Test.Cardano.Ledger.Constrained.Size (Size (..), runSize, seps)
import Test.Cardano.Ledger.Constrained.TypeRep (
Rep (..),
format,
hasEq,
synopsis,
testEql,
(:~:) (Refl),
)
import Test.Cardano.Ledger.Generic.PrettyCore (PDoc, ppRecord, ppString)
import Test.Cardano.Ledger.Generic.Proof (Reflect)
import Test.QuickCheck (Gen, oneof)
import Type.Reflection (TypeRep, Typeable, typeRep)
class (Eq a, Eq ts) => FromList ts a | ts -> a where
makeFromList :: [a] -> ts
getList :: ts -> [a]
tsRep :: Rep era ts -> Rep era a
instance Eq a => FromList [a] a where
makeFromList :: [a] -> [a]
makeFromList [a]
xs = [a]
xs
getList :: [a] -> [a]
getList [a]
xs = [a]
xs
tsRep :: forall era. Rep era [a] -> Rep era a
tsRep (ListR Rep era a
z) = Rep era a
z
instance Eq a => FromList (Maybe a) a where
makeFromList :: [a] -> Maybe a
makeFromList [] = forall a. Maybe a
Nothing
makeFromList (a
x : [a]
_) = forall a. a -> Maybe a
Just a
x
getList :: Maybe a -> [a]
getList Maybe a
Nothing = []
getList (Just a
x) = [a
x]
tsRep :: forall era. Rep era (Maybe a) -> Rep era a
tsRep (MaybeR Rep era t1
z) = Rep era t1
z
instance (Ord k, Eq a) => FromList (Map k a) (k, a) where
makeFromList :: [(k, a)] -> Map k a
makeFromList = forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
getList :: Map k a -> [(k, a)]
getList = forall k a. Map k a -> [(k, a)]
Map.toList
tsRep :: forall era. Rep era (Map k a) -> Rep era (k, a)
tsRep (MapR Rep era a
k Rep era b
v) = forall era a b. Rep era a -> Rep era b -> Rep era (a, b)
PairR Rep era a
k Rep era b
v
instance Ord a => FromList (Set a) a where
makeFromList :: [a] -> Set a
makeFromList = forall a. Ord a => [a] -> Set a
Set.fromList
getList :: Set a -> [a]
getList = forall a. Set a -> [a]
Set.toList
tsRep :: forall era. Rep era (Set a) -> Rep era a
tsRep (SetR Rep era a
x) = Rep era a
x
type Direct a = Either a a
direct :: Direct a -> a
direct :: forall a. Direct a -> a
direct (Left a
a) = a
a
direct (Right a
a) = a
a
data Term era t where
Lit :: Rep era t -> t -> Term era t
Var :: V era t -> Term era t
Dom :: Ord a => Term era (Map a b) -> Term era (Set a)
Rng :: (Ord a, Ord b) => Term era (Map a b) -> Term era (Set b)
Elems :: (Ord a, Eq b) => Term era (Map a b) -> Term era [b]
ProjM :: Ord a => Lens' b t -> Rep era t -> Term era (Map a b) -> Term era (Map a t)
ProjS :: (Ord b, Ord t) => Lens' b t -> Rep era t -> Term era (Set b) -> Term era (Set t)
Proj :: Lens' b t -> Rep era t -> Term era b -> Term era t
Delta :: Term era Coin -> Term era DeltaCoin
Negate :: Term era DeltaCoin -> Term era DeltaCoin
Restrict :: Ord a => Term era (Set a) -> Term era (Map a b) -> Term era (Map a b)
HashD :: Era era => Term era (Data era) -> Term era DataHash
HashS :: Reflect era => Term era (ScriptF era) -> Term era ScriptHash
Pair :: Term era a -> Term era b -> Term era (a, b)
infix 4 :=:
infix 4 :<-:
data Pred era where
MetaSize :: Size -> Term era Size -> Pred era
Sized :: Sizeable t => Term era Size -> Term era t -> Pred era
(:=:) :: Eq a => Term era a -> Term era a -> Pred era
Subset :: Ord a => Term era (Set a) -> Term era (Set a) -> Pred era
Disjoint :: Ord a => Term era (Set a) -> Term era (Set a) -> Pred era
SumsTo :: (Era era, Adds c) => (Direct c) -> Term era c -> OrdCond -> [Sum era c] -> Pred era
SumSplit :: (Era era, Adds c) => c -> Term era c -> OrdCond -> [Sum era c] -> Pred era
Random :: Term era t -> Pred era
Component :: Direct (Term era t) -> [AnyF era t] -> Pred era
CanFollow :: Count n => Term era n -> Term era n -> Pred era
Member :: Ord a => Direct (Term era a) -> Term era (Set a) -> Pred era
NotMember :: Ord a => Term era a -> Term era (Set a) -> Pred era
MapMember ::
(Ord k, Eq v, Ord v) => Term era k -> Term era v -> (Direct (Term era (Map k v))) -> Pred era
(:<-:) :: Term era t -> RootTarget era r t -> Pred era
GenFrom :: Term era t -> RootTarget era r (Gen t) -> Pred era
List :: FromList fs t => Term era fs -> [Term era t] -> Pred era
Choose ::
(Era era, Eq t) => Term era Size -> Term era [t] -> [(Int, Target era t, [Pred era])] -> Pred era
ForEach ::
(Era era, FromList fs t, Eq t) =>
Term era Size ->
Term era fs ->
Pat era t ->
[Pred era] ->
Pred era
Maybe ::
forall r era t.
(Era era, Typeable r) =>
Term era (Maybe t) ->
RootTarget era r t ->
[Pred era] ->
Pred era
Oneof :: (Eq t, Era era) => Term era t -> [(Int, RootTarget era t t, [Pred era])] -> Pred era
SubMap :: (Ord k, Eq v, Ord v) => Term era (Map k v) -> Term era (Map k v) -> Pred era
If :: RootTarget era r Bool -> Pred era -> Pred era -> Pred era
Before :: Term era a -> Term era b -> Pred era
ListWhere ::
(Era era, Eq t) => Term era Size -> Term era [t] -> RootTarget era t t -> [Pred era] -> Pred era
data Sum era c where
SumMap :: Adds c => Term era (Map a c) -> Sum era c
SumList :: Adds c => Term era [c] -> Sum era c
One :: Term era c -> Sum era c
ProjOne :: forall x c era. Lens' x c -> Rep era c -> Term era x -> Sum era c
ProjMap :: forall x c a era. Adds c => Rep era c -> Lens' x c -> Term era (Map a x) -> Sum era c
infix 4 :⊆:
pattern (:⊆:) :: forall era. (forall a. Ord a => Term era (Set a) -> Term era (Set a) -> Pred era)
pattern x $b:⊆: :: forall era a.
Ord a =>
Term era (Set a) -> Term era (Set a) -> Pred era
$m:⊆: :: forall {r} {era}.
Pred era
-> (forall {a}. Ord a => Term era (Set a) -> Term era (Set a) -> r)
-> ((# #) -> r)
-> r
:⊆: y = Subset x y
pattern ExactSize :: Era era => Int -> Term era Size
pattern $bExactSize :: forall era. Era era => Int -> Term era Size
$mExactSize :: forall {r} {era}.
Era era =>
Term era Size -> (Int -> r) -> ((# #) -> r) -> r
ExactSize x <- (sameRng -> Just x)
where
ExactSize Int
x = forall era t. Rep era t -> t -> Term era t
Lit forall era. Rep era Size
SizeR (Int -> Int -> Size
SzRng Int
x Int
x)
pattern AtLeast :: Era era => Int -> Term era Size
pattern $bAtLeast :: forall era. Era era => Int -> Term era Size
$mAtLeast :: forall {r} {era}.
Era era =>
Term era Size -> (Int -> r) -> ((# #) -> r) -> r
AtLeast n = Lit SizeR (SzLeast n)
pattern Size :: Era era => Size -> Term era Size
pattern $bSize :: forall era. Era era => Size -> Term era Size
$mSize :: forall {r} {era}.
Era era =>
Term era Size -> (Size -> r) -> ((# #) -> r) -> r
Size n = Lit SizeR n
pattern AtMost :: Era era => Int -> Term era Size
pattern $bAtMost :: forall era. Era era => Int -> Term era Size
$mAtMost :: forall {r} {era}.
Era era =>
Term era Size -> (Int -> r) -> ((# #) -> r) -> r
AtMost n = Lit SizeR (SzMost n)
pattern Range :: Era era => Int -> Int -> Term era Size
pattern $bRange :: forall era. Era era => Int -> Int -> Term era Size
$mRange :: forall {r} {era}.
Era era =>
Term era Size -> (Int -> Int -> r) -> ((# #) -> r) -> r
Range i j <- Lit SizeR (SzRng i j)
where
Range Int
i Int
j =
if Int
i forall a. Ord a => a -> a -> Bool
<= Int
j
then forall era t. Rep era t -> t -> Term era t
Lit forall era. Rep era Size
SizeR (Int -> Int -> Size
SzRng Int
i Int
j)
else
forall a. HasCallStack => [Char] -> a
error
( [Char]
"Bad call to "
forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show (Int -> Int -> Size
SzRng Int
i Int
j)
forall a. [a] -> [a] -> [a]
++ [Char]
". It is not the case that ("
forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Int
i
forall a. [a] -> [a] -> [a]
++ [Char]
" <= "
forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Int
j
forall a. [a] -> [a] -> [a]
++ [Char]
")."
)
sameRng :: Term era Size -> Maybe Int
sameRng :: forall era. Term era Size -> Maybe Int
sameRng (Lit Rep era Size
SizeR (SzRng Int
x Int
y)) = if Int
x forall a. Eq a => a -> a -> Bool
== Int
y then forall a. a -> Maybe a
Just Int
x else forall a. Maybe a
Nothing
sameRng Term era Size
_ = forall a. Maybe a
Nothing
pattern Word64 :: Era era => Word64 -> Term era Word64
pattern $bWord64 :: forall era. Era era => Word64 -> Term era Word64
$mWord64 :: forall {r} {era}.
Era era =>
Term era Word64 -> (Word64 -> r) -> ((# #) -> r) -> r
Word64 x = Lit Word64R x
var :: Era era => String -> Rep era t -> Term era t
var :: forall era t. Era era => [Char] -> Rep era t -> Term era t
var [Char]
s Rep era t
r = forall era t. V era t -> Term era t
Var (forall era t s.
Era era =>
[Char] -> Rep era t -> Access era s t -> V era t
V [Char]
s Rep era t
r forall era s t. Access era s t
No)
unVar :: Term era t -> V era t
unVar :: forall era t. Term era t -> V era t
unVar (Var V era t
v) = V era t
v
unVar Term era t
x = forall a. HasCallStack => [Char] -> a
error ([Char]
"Non Var in unVar: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era t
x)
fieldToTerm :: Field era rec field -> Term era field
fieldToTerm :: forall era rec field. Field era rec field -> Term era field
fieldToTerm (Field [Char]
nm Rep era field
rep Rep era rec
repx Lens' rec field
l) = forall era t. V era t -> Term era t
Var (forall era t s.
Era era =>
[Char] -> Rep era t -> Access era s t -> V era t
V [Char]
nm Rep era field
rep (forall era s t. Rep era s -> Lens' s t -> Access era s t
Yes Rep era rec
repx Lens' rec field
l))
fieldToTerm (FConst Rep era field
rep field
t Rep era rec
_ Lens' rec field
_) = forall era t. Rep era t -> t -> Term era t
Lit Rep era field
rep field
t
select :: (Eq t, Era era) => Term era t -> Term era big -> Lens' big t -> Pred era
select :: forall t era big.
(Eq t, Era era) =>
Term era t -> Term era big -> Lens' big t -> Pred era
select Term era t
small Term era big
big Lens' big t
lenz = forall s t era. Lens' s t -> Rep era t -> Term era s -> Term era t
Proj Lens' big t
lenz (forall era t. Era era => Term era t -> Rep era t
termRep Term era t
small) Term era big
big forall s era. Eq s => Term era s -> Term era s -> Pred era
:=: Term era t
small
select2 :: Era era => Term era t -> Term era big -> Lens' big t -> Pred era
select2 :: forall era t big.
Era era =>
Term era t -> Term era big -> Lens' big t -> Pred era
select2 (Var (V [Char]
nm Rep era t
t Access era s t
_)) Term era big
big Lens' big t
lenz = forall era s. Direct (Term era s) -> [AnyF era s] -> Pred era
Component (forall a b. a -> Either a b
Left Term era big
big) [forall era s t. Field era s t -> AnyF era s
AnyF (forall era t s.
Era era =>
[Char] -> Rep era t -> Rep era s -> Lens' s t -> Field era s t
Field [Char]
nm Rep era t
t (forall era t. Era era => Term era t -> Rep era t
termRep Term era big
big) Lens' big t
lenz)]
select2 Term era t
t1 Term era big
t2 Lens' big t
_ =
forall a. HasCallStack => [Char] -> a
error ([Char]
"In (select " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era t
t1 forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era big
t2 forall a. [a] -> [a] -> [a]
++ [Char]
" lens) " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era t
t1 forall a. [a] -> [a] -> [a]
++ [Char]
" is not a Var term.")
infixl 0 :$
data RootTarget era root t where
Simple :: Term era t -> RootTarget era Void t
(:$) :: RootTarget era r (a -> b) -> RootTarget era r a -> RootTarget era r b
Constr :: String -> (a -> b) -> RootTarget era Void (a -> b)
Invert :: String -> TypeRep root -> (a -> b) -> RootTarget era root (a -> b)
Lensed :: Term era t -> SimpleGetter root t -> RootTarget era root t
Partial ::
Term era t ->
(root -> Maybe t) ->
RootTarget era root t
Shift :: RootTarget era root2 a -> Lens' root1 root2 -> RootTarget era root1 a
Mask :: RootTarget era r a -> RootTarget era Void a
Virtual ::
Term era t ->
PDoc ->
Lens' root t ->
RootTarget era root t
type Target era t = RootTarget era Void t
infixl 0 ^$
(^$) :: Target era (a -> t) -> Term era a -> Target era t
^$ :: forall era a t. Target era (a -> t) -> Term era a -> Target era t
(^$) Target era (a -> t)
f Term era a
x = Target era (a -> t)
f forall era r s b.
RootTarget era r (s -> b)
-> RootTarget era r s -> RootTarget era r b
:$ forall era t. Term era t -> RootTarget era Void t
Simple Term era a
x
constTarget :: t -> Target era t
constTarget :: forall t era. t -> Target era t
constTarget t
t = forall s a era. [Char] -> (s -> a) -> RootTarget era Void (s -> a)
Constr [Char]
"constTarget" (forall a b. a -> b -> a
const t
t) forall era a t. Target era (a -> t) -> Term era a -> Target era t
^$ forall era t. Rep era t -> t -> Term era t
Lit forall era. Rep era ()
UnitR ()
constRootTarget :: forall era t. Typeable t => t -> RootTarget era t t
constRootTarget :: forall era t. Typeable t => t -> RootTarget era t t
constRootTarget t
t = forall root s a era.
[Char] -> TypeRep root -> (s -> a) -> RootTarget era root (s -> a)
Invert [Char]
"constRootTarget" (forall {k} (a :: k). Typeable a => TypeRep a
typeRep @t) (\() -> t
t) forall era r s b.
RootTarget era r (s -> b)
-> RootTarget era r s -> RootTarget era r b
:$ forall era t root.
Term era t -> SimpleGetter root t -> RootTarget era root t
Lensed (forall era t. Rep era t -> t -> Term era t
Lit forall era. Rep era ()
UnitR ()) (forall s a. (s -> a) -> SimpleGetter s a
to (forall a b. a -> b -> a
const ()))
emptyTarget :: Target era ()
emptyTarget :: forall era. Target era ()
emptyTarget = forall era t. Term era t -> RootTarget era Void t
Simple (forall era t. Rep era t -> t -> Term era t
Lit forall era. Rep era ()
UnitR ())
justTarget :: Term era t -> Target era (Maybe t)
justTarget :: forall era t. Term era t -> Target era (Maybe t)
justTarget Term era t
x = forall s a era. [Char] -> (s -> a) -> RootTarget era Void (s -> a)
Constr [Char]
"Just" forall a. a -> Maybe a
Just forall era a t. Target era (a -> t) -> Term era a -> Target era t
^$ Term era t
x
idTarget :: Term era t -> Target era t
idTarget :: forall era t. Term era t -> RootTarget era Void t
idTarget Term era t
x = forall s a era. [Char] -> (s -> a) -> RootTarget era Void (s -> a)
Constr [Char]
"id" forall a. a -> a
id forall era a t. Target era (a -> t) -> Term era a -> Target era t
^$ Term era t
x
maybeTarget :: Target era (t -> Gen (Maybe t))
maybeTarget :: forall era t. Target era (t -> Gen (Maybe t))
maybeTarget = forall s a era. [Char] -> (s -> a) -> RootTarget era Void (s -> a)
Constr [Char]
"maybeTarget" forall {a}. a -> Gen (Maybe a)
genMaybe
where
genMaybe :: a -> Gen (Maybe a)
genMaybe a
x = forall a. HasCallStack => [Gen a] -> Gen a
oneof [forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Maybe a
Nothing, forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a. a -> Maybe a
Just a
x)]
listToSetTarget :: Ord x => Term era [x] -> Target era (Set.Set x)
listToSetTarget :: forall x era. Ord x => Term era [x] -> Target era (Set x)
listToSetTarget Term era [x]
x = forall s a era. [Char] -> (s -> a) -> RootTarget era Void (s -> a)
Constr [Char]
"FromList" forall a. Ord a => [a] -> Set a
Set.fromList forall era a t. Target era (a -> t) -> Term era a -> Target era t
^$ Term era [x]
x
setToListTarget :: Term era (Set x) -> Target era [x]
setToListTarget :: forall era x. Term era (Set x) -> Target era [x]
setToListTarget Term era (Set x)
x = forall s a era. [Char] -> (s -> a) -> RootTarget era Void (s -> a)
Constr [Char]
"toList" forall a. Set a -> [a]
Set.toList forall era a t. Target era (a -> t) -> Term era a -> Target era t
^$ Term era (Set x)
x
showL :: (t -> String) -> [Char] -> [t] -> [Char]
showL :: forall t. (t -> [Char]) -> [Char] -> [t] -> [Char]
showL t -> [Char]
_f [Char]
_sep [] = [Char]
""
showL t -> [Char]
f [Char]
_sep [t
t] = t -> [Char]
f t
t
showL t -> [Char]
f [Char]
sep (t
t : [t]
ts) = t -> [Char]
f t
t forall a. [a] -> [a] -> [a]
++ [Char]
sep forall a. [a] -> [a] -> [a]
++ forall t. (t -> [Char]) -> [Char] -> [t] -> [Char]
showL t -> [Char]
f [Char]
sep [t]
ts
instance Show (Term era t) where
show :: Term era t -> [Char]
show (Lit Rep era t
r t
k) = forall e t. Rep e t -> t -> [Char]
synopsis Rep era t
r t
k
show (Var (V [Char]
nm Rep era t
_rep Access era s t
_)) = [Char]
nm
show (Dom Term era (Map a b)
x) = [Char]
"(Dom " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (Map a b)
x forall a. [a] -> [a] -> [a]
++ [Char]
")"
show (Rng Term era (Map a b)
x) = [Char]
"(Rng " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (Map a b)
x forall a. [a] -> [a] -> [a]
++ [Char]
")"
show (Elems Term era (Map a b)
x) = [Char]
"(Elems " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (Map a b)
x forall a. [a] -> [a] -> [a]
++ [Char]
")"
show (ProjM Lens' b t
_ Rep era t
r Term era (Map a b)
t) = [Char]
"(ProjM " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Rep era t
r forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (Map a b)
t forall a. [a] -> [a] -> [a]
++ [Char]
")"
show (ProjS Lens' b t
_ Rep era t
r Term era (Set b)
t) = [Char]
"(ProjS " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Rep era t
r forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (Set b)
t forall a. [a] -> [a] -> [a]
++ [Char]
")"
show (Proj Lens' b t
_ Rep era t
r Term era b
t) = [Char]
"(Proj " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Rep era t
r forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era b
t forall a. [a] -> [a] -> [a]
++ [Char]
")"
show (Delta Term era Coin
x) = [Char]
"(Delta " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era Coin
x forall a. [a] -> [a] -> [a]
++ [Char]
")"
show (Negate Term era DeltaCoin
x) = [Char]
"(Negate " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era DeltaCoin
x forall a. [a] -> [a] -> [a]
++ [Char]
")"
show (Restrict Term era (Set a)
r Term era (Map a b)
t) = [Char]
"(Restrict " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (Set a)
r forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (Map a b)
t forall a. [a] -> [a] -> [a]
++ [Char]
")"
show (HashS Term era (ScriptF era)
r) = [Char]
"(HashS " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (ScriptF era)
r forall a. [a] -> [a] -> [a]
++ [Char]
")"
show (HashD Term era (Data era)
r) = [Char]
"(HashD " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (Data era)
r forall a. [a] -> [a] -> [a]
++ [Char]
")"
show (Pair Term era a
r Term era b
t) = [Char]
"(Pair " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era a
r forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era b
t forall a. [a] -> [a] -> [a]
++ [Char]
")"
showList :: [Term era t] -> ShowS
showList [Term era t]
xs [Char]
ans = [[Char]] -> [Char]
unlines ([Char]
ans forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map forall a. Show a => a -> [Char]
show [Term era t]
xs)
instance Show (Sum era c) where
show :: Sum era c -> [Char]
show (SumMap Term era (Map a c)
t) = [Char]
"sum " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (Map a c)
t
show (SumList Term era [c]
t) = [Char]
"sum " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era [c]
t
show (One Term era c
t) = forall a. Show a => a -> [Char]
show Term era c
t
show (ProjOne Lens' x c
_ Rep era c
c Term era x
t) = [[Char]] -> [Char]
seps [[Char]
"ProjOne", forall a. Show a => a -> [Char]
show Rep era c
c, forall a. Show a => a -> [Char]
show Term era x
t]
show (ProjMap Rep era c
crep Lens' x c
_lens Term era (Map a x)
t) = [Char]
"ProjMap " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Rep era c
crep forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (Map a x)
t
instance Show (Pred era) where
show :: Pred era -> [Char]
show (MetaSize Size
n Term era Size
t) = [Char]
"MetaSize " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Size
n forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era Size
t
show (Sized Term era Size
n Term era t
t) = [Char]
"Sized " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era Size
n forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era t
t
show (Term era a
x :=: Term era a
y) = forall a. Show a => a -> [Char]
show Term era a
x forall a. [a] -> [a] -> [a]
++ [Char]
" :=: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era a
y
show (Subset Term era (Set a)
x Term era (Set a)
y) = forall a. Show a => a -> [Char]
show Term era (Set a)
x forall a. [a] -> [a] -> [a]
++ [Char]
" ⊆ " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (Set a)
y
show (Disjoint Term era (Set a)
x Term era (Set a)
y) = [Char]
"Disjoint " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (Set a)
x forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (Set a)
y
show (SumsTo Direct c
i Term era c
c OrdCond
cond [Sum era c]
m) = [Char]
"SumsTo (" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Direct c
i forall a. [a] -> [a] -> [a]
++ [Char]
") " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era c
c forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show OrdCond
cond forall a. [a] -> [a] -> [a]
++ forall t. (t -> [Char]) -> [Char] -> [t] -> [Char]
showL forall a. Show a => a -> [Char]
show [Char]
" + " [Sum era c]
m
show (SumSplit c
i Term era c
c OrdCond
cond [Sum era c]
m) = [Char]
"SumSplit (" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show c
i forall a. [a] -> [a] -> [a]
++ [Char]
") " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era c
c forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show OrdCond
cond forall a. [a] -> [a] -> [a]
++ forall t. (t -> [Char]) -> [Char] -> [t] -> [Char]
showL forall a. Show a => a -> [Char]
show [Char]
" + " [Sum era c]
m
show (Random Term era t
x) = [Char]
"Random " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era t
x
show (Component Direct (Term era t)
t [AnyF era t]
ws) = [Char]
"Component (" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Direct (Term era t)
t forall a. [a] -> [a] -> [a]
++ [Char]
") " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show [AnyF era t]
ws
show (CanFollow Term era n
x Term era n
y) = [Char]
"CanFollow " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era n
x forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era n
y
show (Member Direct (Term era a)
x Term era (Set a)
y) = [Char]
"Member (" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Direct (Term era a)
x forall a. [a] -> [a] -> [a]
++ [Char]
") " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (Set a)
y
show (NotMember Term era a
x Term era (Set a)
y) = [Char]
"NotMember " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era a
x forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (Set a)
y
show (MapMember Term era k
k Term era v
v Direct (Term era (Map k v))
m) = [Char]
"MapMember " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era k
k forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era v
v forall a. [a] -> [a] -> [a]
++ [Char]
" (" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Direct (Term era (Map k v))
m forall a. [a] -> [a] -> [a]
++ [Char]
")"
show (Term era t
x :<-: RootTarget era r t
y) = forall a. Show a => a -> [Char]
show Term era t
x forall a. [a] -> [a] -> [a]
++ [Char]
" :<-: " forall a. [a] -> [a] -> [a]
++ forall era t r. RootTarget era r t -> [Char]
showT RootTarget era r t
y
show (GenFrom Term era t
x RootTarget era r (Gen t)
y) = [Char]
"GenFrom " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era t
x forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall era t r. RootTarget era r t -> [Char]
showT RootTarget era r (Gen t)
y
show (List Term era fs
t [Term era t]
xs) = [Char]
"List " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era fs
t forall a. [a] -> [a] -> [a]
++ [Char]
" [" forall a. [a] -> [a] -> [a]
++ forall t. (t -> [Char]) -> [Char] -> [t] -> [Char]
showL forall a. Show a => a -> [Char]
show [Char]
", " [Term era t]
xs forall a. [a] -> [a] -> [a]
++ [Char]
"]"
show (Choose Term era Size
s Term era [t]
term [(Int, Target era t, [Pred era])]
xs) = [[Char]] -> [Char]
unlines (([Char]
"Choose " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era Size
s forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era [t]
term) forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map forall {a} {t} {era} {r} {t}.
(Show a, Show t) =>
(a, RootTarget era r t, [t]) -> [Char]
showchoices [(Int, Target era t, [Pred era])]
xs)
where
showchoices :: (a, RootTarget era r t, [t]) -> [Char]
showchoices (a
i, RootTarget era r t
target, [t]
ps) =
[Char]
"(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show a
i forall a. [a] -> [a] -> [a]
++ [Char]
", " forall a. [a] -> [a] -> [a]
++ forall era r t. RootTarget era r t -> [Char]
showAllTarget RootTarget era r t
target forall a. [a] -> [a] -> [a]
++ forall era t r. RootTarget era r t -> [Char]
showT RootTarget era r t
target forall a. [a] -> [a] -> [a]
++ [Char]
" | " forall a. [a] -> [a] -> [a]
++ forall t. (t -> [Char]) -> [Char] -> [t] -> [Char]
showL forall a. Show a => a -> [Char]
show [Char]
", " [t]
ps forall a. [a] -> [a] -> [a]
++ [Char]
")"
show (Oneof Term era t
term [(Int, RootTarget era t t, [Pred era])]
xs) = [[Char]] -> [Char]
unlines (([Char]
"Oneof " forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era t
term) forall a. a -> [a] -> [a]
: (forall a b. (a -> b) -> [a] -> [b]
map forall {a} {t} {era} {r} {t}.
(Show a, Show t) =>
(a, RootTarget era r t, [t]) -> [Char]
showchoices [(Int, RootTarget era t t, [Pred era])]
xs))
where
showchoices :: (a, RootTarget era r t, [t]) -> [Char]
showchoices (a
i, RootTarget era r t
target, [t]
ps) =
[Char]
"(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show a
i forall a. [a] -> [a] -> [a]
++ [Char]
", " forall a. [a] -> [a] -> [a]
++ forall era r t. RootTarget era r t -> [Char]
showAllTarget RootTarget era r t
target forall a. [a] -> [a] -> [a]
++ forall era t r. RootTarget era r t -> [Char]
showT RootTarget era r t
target forall a. [a] -> [a] -> [a]
++ [Char]
" | " forall a. [a] -> [a] -> [a]
++ forall t. (t -> [Char]) -> [Char] -> [t] -> [Char]
showL forall a. Show a => a -> [Char]
show [Char]
", " [t]
ps forall a. [a] -> [a] -> [a]
++ [Char]
")"
show (ForEach Term era Size
s Term era fs
term Pat era t
pat [Pred era]
ps) =
[[Char]] -> [Char]
unlines
[ [[Char]] -> [Char]
seps [[Char]
"ForEach", forall a. Show a => a -> [Char]
show Term era Size
s, forall a. Show a => a -> [Char]
show Term era fs
term]
, [Char]
"forall (" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Pat era t
pat forall a. [a] -> [a] -> [a]
++ [Char]
" | " forall a. [a] -> [a] -> [a]
++ forall t. (t -> [Char]) -> [Char] -> [t] -> [Char]
showL forall a. Show a => a -> [Char]
show [Char]
", " [Pred era]
ps
]
show (Maybe Term era (Maybe t)
term RootTarget era r t
target [Pred era]
ps) = [Char]
"Maybe " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (Maybe t)
term forall a. [a] -> [a] -> [a]
++ forall era r t. RootTarget era r t -> [Char]
showAllTarget RootTarget era r t
target forall a. [a] -> [a] -> [a]
++ [Char]
" | " forall a. [a] -> [a] -> [a]
++ forall t. (t -> [Char]) -> [Char] -> [t] -> [Char]
showL forall a. Show a => a -> [Char]
show [Char]
", " [Pred era]
ps
show (SubMap Term era (Map k v)
x Term era (Map k v)
y) = [Char]
"SubMap " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (Map k v)
x forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era (Map k v)
y
show (If RootTarget era r Bool
t Pred era
x Pred era
y) = [Char]
"If (" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show RootTarget era r Bool
t forall a. [a] -> [a] -> [a]
++ [Char]
") (" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Pred era
x forall a. [a] -> [a] -> [a]
++ [Char]
") (" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Pred era
y forall a. [a] -> [a] -> [a]
++ [Char]
")"
show (Before Term era a
x Term era b
y) = [Char]
"Before " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era a
x forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era b
y
show (ListWhere Term era Size
sz Term era [t]
t RootTarget era t t
tar [Pred era]
ps) =
[Char]
"(ListWhere " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era Size
sz forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era [t]
t forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show RootTarget era t t
tar forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall t. (t -> [Char]) -> [Char] -> [t] -> [Char]
showL forall a. Show a => a -> [Char]
show [Char]
", " [Pred era]
ps forall a. [a] -> [a] -> [a]
++ [Char]
")"
showList :: [Pred era] -> ShowS
showList [Pred era]
xs [Char]
ans = [[Char]] -> [Char]
unlines ([Char]
ans forall a. a -> [a] -> [a]
: (forall a b. (a -> b) -> [a] -> [b]
map forall a. Show a => a -> [Char]
show [Pred era]
xs))
showAllTarget :: RootTarget era r t -> [Char]
showAllTarget :: forall era r t. RootTarget era r t -> [Char]
showAllTarget RootTarget era r t
tar = [Char]
" forall " forall a. [a] -> [a] -> [a]
++ forall t. (t -> [Char]) -> [Char] -> [t] -> [Char]
showL forall a. Show a => a -> [Char]
show [Char]
" " (forall a. HashSet a -> [a]
HashSet.toList (forall era r t.
HashSet (Name era) -> RootTarget era r t -> HashSet (Name era)
varsOfTarget forall a. HashSet a
HashSet.empty RootTarget era r t
tar)) forall a. [a] -> [a] -> [a]
++ [Char]
". "
instance Show (RootTarget era r t) where
show :: RootTarget era r t -> [Char]
show (Constr [Char]
nm a -> b
_f) = [Char]
nm
show (Simple Term era t
x) = forall a. Show a => a -> [Char]
show Term era t
x
show (Lensed Term era t
x SimpleGetter r t
_) = forall a. Show a => a -> [Char]
show Term era t
x
show (Partial Term era t
x r -> Maybe t
_) = forall a. Show a => a -> [Char]
show Term era t
x
show (RootTarget era r (a -> t)
f :$ RootTarget era r a
x) = [Char]
"(" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show RootTarget era r (a -> t)
f forall a. [a] -> [a] -> [a]
++ [Char]
" :$ " forall a. [a] -> [a] -> [a]
++ forall t. (t -> [Char]) -> [Char] -> [t] -> [Char]
showL Any (RootTarget era r) -> [Char]
pp [Char]
" :$ " (forall era r t. RootTarget era r t -> [Any (RootTarget era r)]
args RootTarget era r a
x) forall a. [a] -> [a] -> [a]
++ [Char]
")"
where
pp :: Univ.Any (RootTarget era r) -> String
pp :: Any (RootTarget era r) -> [Char]
pp (Univ.Any RootTarget era r i
spec) = forall a. Show a => a -> [Char]
show RootTarget era r i
spec
show (Invert [Char]
nm TypeRep r
_ a -> b
_) = [Char]
nm
show (Shift RootTarget era root2 t
x Lens' r root2
_) = [Char]
"(Shift " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show RootTarget era root2 t
x forall a. [a] -> [a] -> [a]
++ [Char]
" lens)"
show (Mask RootTarget era r t
x) = forall a. Show a => a -> [Char]
show RootTarget era r t
x
show (Virtual Term era t
x PDoc
y Lens' r t
_) = [Char]
"(Virtual " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era t
x forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show PDoc
y forall a. [a] -> [a] -> [a]
++ [Char]
")"
showT :: forall era t r. RootTarget era r t -> String
showT :: forall era t r. RootTarget era r t -> [Char]
showT (Constr [Char]
nm a -> b
_f) = [Char]
nm
showT (Simple Term era t
x) = forall a. Show a => a -> [Char]
show Term era t
x
showT (Lensed Term era t
x SimpleGetter r t
_) = forall a. Show a => a -> [Char]
show Term era t
x
showT (Partial Term era t
x r -> Maybe t
_) = forall a. Show a => a -> [Char]
show Term era t
x
showT (RootTarget era r (a -> t)
f :$ RootTarget era r a
x) = [Char]
"(" forall a. [a] -> [a] -> [a]
++ forall era t r. RootTarget era r t -> [Char]
showT RootTarget era r (a -> t)
f forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall t. (t -> [Char]) -> [Char] -> [t] -> [Char]
showL Any (RootTarget era r) -> [Char]
pp [Char]
" " (forall era r t. RootTarget era r t -> [Any (RootTarget era r)]
args RootTarget era r a
x) forall a. [a] -> [a] -> [a]
++ [Char]
")"
where
pp :: Univ.Any (RootTarget era r) -> String
pp :: Any (RootTarget era r) -> [Char]
pp (Univ.Any RootTarget era r i
spec) = forall era t r. RootTarget era r t -> [Char]
showT RootTarget era r i
spec
showT (Invert [Char]
nm TypeRep r
_ a -> b
_) = [Char]
nm
showT (Shift RootTarget era root2 t
x Lens' r root2
_) = [Char]
"(Shift " forall a. [a] -> [a] -> [a]
++ forall era t r. RootTarget era r t -> [Char]
showT RootTarget era root2 t
x forall a. [a] -> [a] -> [a]
++ [Char]
")"
showT (Mask RootTarget era r t
x) = forall era t r. RootTarget era r t -> [Char]
showT RootTarget era r t
x
showT (Virtual Term era t
_ PDoc
y Lens' r t
_) = forall a. Show a => a -> [Char]
show PDoc
y
args :: RootTarget era r t -> [Univ.Any (RootTarget era r)]
args :: forall era r t. RootTarget era r t -> [Any (RootTarget era r)]
args (RootTarget era r (a -> t)
x :$ RootTarget era r a
xs) = forall {k} (t :: k -> *) (i :: k). t i -> Any t
Univ.Any RootTarget era r (a -> t)
x forall a. a -> [a] -> [a]
: forall era r t. RootTarget era r t -> [Any (RootTarget era r)]
args RootTarget era r a
xs
args RootTarget era r t
other = [forall {k} (t :: k -> *) (i :: k). t i -> Any t
Univ.Any RootTarget era r t
other]
ppTarget :: RootTarget era r t -> PDoc
ppTarget :: forall era r t. RootTarget era r t -> PDoc
ppTarget RootTarget era r t
x = forall era r t. RootTarget era r t -> [(Text, PDoc)] -> PDoc
targetRecord RootTarget era r t
x []
targetRecord :: RootTarget era r t -> [(Text, PDoc)] -> PDoc
targetRecord :: forall era r t. RootTarget era r t -> [(Text, PDoc)] -> PDoc
targetRecord (Constr [Char]
n a -> b
_) [(Text, PDoc)]
xs = Text -> [(Text, PDoc)] -> PDoc
ppRecord ([Char] -> Text
pack [Char]
n) [(Text, PDoc)]
xs
targetRecord (RootTarget era r (a -> t)
ts :$ RootTarget era r a
t) [(Text, PDoc)]
xs = forall era r t. RootTarget era r t -> [(Text, PDoc)] -> PDoc
targetRecord RootTarget era r (a -> t)
ts (forall era r t. RootTarget era r t -> (Text, PDoc)
targetPair RootTarget era r a
t forall a. a -> [a] -> [a]
: [(Text, PDoc)]
xs)
targetRecord (Simple Term era t
e) [] = forall a. [Char] -> Doc a
ppString (forall a. Show a => a -> [Char]
show Term era t
e)
targetRecord (Lensed Term era t
e SimpleGetter r t
_) [] = forall a. [Char] -> Doc a
ppString (forall a. Show a => a -> [Char]
show Term era t
e)
targetRecord (Partial Term era t
e r -> Maybe t
_) [] = forall a. [Char] -> Doc a
ppString (forall a. Show a => a -> [Char]
show Term era t
e)
targetRecord (Invert [Char]
n TypeRep r
_ a -> b
_) [(Text, PDoc)]
xs = Text -> [(Text, PDoc)] -> PDoc
ppRecord ([Char] -> Text
pack [Char]
n) [(Text, PDoc)]
xs
targetRecord (Shift RootTarget era root2 t
x Lens' r root2
_) [(Text, PDoc)]
xs = forall era r t. RootTarget era r t -> [(Text, PDoc)] -> PDoc
targetRecord RootTarget era root2 t
x [(Text, PDoc)]
xs
targetRecord (Mask RootTarget era r t
x) [(Text, PDoc)]
xs = forall era r t. RootTarget era r t -> [(Text, PDoc)] -> PDoc
targetRecord RootTarget era r t
x [(Text, PDoc)]
xs
targetRecord (Virtual Term era t
_ PDoc
e Lens' r t
_) [] = PDoc
e
targetRecord RootTarget era r t
other [(Text, PDoc)]
xs = Text -> [(Text, PDoc)] -> PDoc
ppRecord (forall era r t. RootTarget era r t -> Text
nameOf RootTarget era r t
other) [(Text, PDoc)]
xs
nameOf :: RootTarget era r t -> Text
nameOf :: forall era r t. RootTarget era r t -> Text
nameOf (Constr [Char]
cs a -> b
_) = [Char] -> Text
pack (forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower [Char]
cs forall a. [a] -> [a] -> [a]
++ [Char]
"T")
nameOf (Simple (Var (V [Char]
n Rep era t
_ Access era s t
_))) = [Char] -> Text
pack [Char]
n
nameOf (Lensed (Var (V [Char]
n Rep era t
_ Access era s t
_)) SimpleGetter r t
_) = [Char] -> Text
pack [Char]
n
nameOf (Partial (Var (V [Char]
n Rep era t
_ Access era s t
_)) r -> Maybe t
_) = [Char] -> Text
pack [Char]
n
nameOf (Simple Term era t
term) = [Char] -> Text
pack (forall a. Show a => a -> [Char]
show Term era t
term)
nameOf (Lensed Term era t
term SimpleGetter r t
_) = [Char] -> Text
pack (forall a. Show a => a -> [Char]
show Term era t
term)
nameOf (Partial Term era t
term r -> Maybe t
_) = [Char] -> Text
pack (forall a. Show a => a -> [Char]
show Term era t
term)
nameOf (RootTarget era r (a -> t)
x :$ RootTarget era r a
_) = forall era r t. RootTarget era r t -> Text
nameOf RootTarget era r (a -> t)
x
nameOf (Invert [Char]
cs TypeRep r
_ a -> b
_) = [Char] -> Text
pack (forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower [Char]
cs forall a. [a] -> [a] -> [a]
++ [Char]
"T")
nameOf (Shift RootTarget era root2 t
x Lens' r root2
_) = forall era r t. RootTarget era r t -> Text
nameOf RootTarget era root2 t
x
nameOf (Mask RootTarget era r t
x) = forall era r t. RootTarget era r t -> Text
nameOf RootTarget era r t
x
nameOf (Virtual Term era t
_ PDoc
x Lens' r t
_) = [Char] -> Text
pack (forall a. Show a => a -> [Char]
show PDoc
x)
targetPair :: RootTarget era r t -> (Text, PDoc)
targetPair :: forall era r t. RootTarget era r t -> (Text, PDoc)
targetPair (Simple (Var (V [Char]
n Rep era t
rep Access era s t
_))) = ([Char] -> Text
pack [Char]
n, forall a. [Char] -> Doc a
ppString (forall a. Show a => a -> [Char]
show Rep era t
rep))
targetPair (Lensed (Var (V [Char]
n Rep era t
rep Access era s t
_)) SimpleGetter r t
_) = ([Char] -> Text
pack [Char]
n, forall a. [Char] -> Doc a
ppString (forall a. Show a => a -> [Char]
show Rep era t
rep))
targetPair (Partial (Var (V [Char]
n Rep era t
rep Access era s t
_)) r -> Maybe t
_) = ([Char] -> Text
pack [Char]
n, forall a. [Char] -> Doc a
ppString (forall a. Show a => a -> [Char]
show Rep era t
rep))
targetPair (Virtual (Var (V [Char]
_ Rep era t
rep Access era s t
_)) PDoc
newname Lens' r t
_) = ([Char] -> Text
pack (forall a. Show a => a -> [Char]
show PDoc
newname), forall a. [Char] -> Doc a
ppString (forall a. Show a => a -> [Char]
show Rep era t
rep))
targetPair RootTarget era r t
x = (forall era r t. RootTarget era r t -> Text
nameOf RootTarget era r t
x, forall era r t. RootTarget era r t -> [(Text, PDoc)] -> PDoc
targetRecord RootTarget era r t
x [])
varsOfTerm :: HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm :: forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era t
s = case Term era t
s of
Lit Rep era t
_ t
_ -> HashSet (Name era)
ans
Var v :: V era t
v@(V [Char]
_ Rep era t
_ Access era s t
_) -> forall a. (Eq a, Hashable a) => a -> HashSet a -> HashSet a
HashSet.insert (forall era t. V era t -> Name era
Name V era t
v) HashSet (Name era)
ans
Dom Term era (Map a b)
x -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era (Map a b)
x
Rng Term era (Map a b)
x -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era (Map a b)
x
Elems Term era (Map a b)
x -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era (Map a b)
x
(ProjM Lens' b t
_ Rep era t
_ Term era (Map a b)
x) -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era (Map a b)
x
(ProjS Lens' b t
_ Rep era t
_ Term era (Set b)
x) -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era (Set b)
x
(Proj Lens' b t
_ Rep era t
_ Term era b
x) -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era b
x
Delta Term era Coin
x -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era Coin
x
Negate Term era DeltaCoin
x -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era DeltaCoin
x
Restrict Term era (Set a)
st Term era (Map a b)
mp -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era (Set a)
st) Term era (Map a b)
mp
HashS Term era (ScriptF era)
st -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era (ScriptF era)
st
HashD Term era (Data era)
st -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era (Data era)
st
Pair Term era a
a Term era b
b -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era a
a) Term era b
b
vars :: Term era t -> HashSet (Name era)
vars :: forall era t. Term era t -> HashSet (Name era)
vars Term era t
x = forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm forall a. HashSet a
HashSet.empty Term era t
x
varsOfTarget :: HashSet (Name era) -> RootTarget era r t -> HashSet (Name era)
varsOfTarget :: forall era r t.
HashSet (Name era) -> RootTarget era r t -> HashSet (Name era)
varsOfTarget HashSet (Name era)
ans RootTarget era r t
s = case RootTarget era r t
s of
(RootTarget era r (a -> t)
a :$ RootTarget era r a
b) -> forall era r t.
HashSet (Name era) -> RootTarget era r t -> HashSet (Name era)
varsOfTarget (forall era r t.
HashSet (Name era) -> RootTarget era r t -> HashSet (Name era)
varsOfTarget HashSet (Name era)
ans RootTarget era r (a -> t)
a) RootTarget era r a
b
(Simple Term era t
x) -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era t
x
(Lensed Term era t
x SimpleGetter r t
_) -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era t
x
(Partial Term era t
x r -> Maybe t
_) -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era t
x
(Constr [Char]
_ a -> b
_) -> HashSet (Name era)
ans
(Invert [Char]
_ TypeRep r
_ a -> b
_) -> HashSet (Name era)
ans
(Shift RootTarget era root2 t
x Lens' r root2
_) -> forall era r t.
HashSet (Name era) -> RootTarget era r t -> HashSet (Name era)
varsOfTarget HashSet (Name era)
ans RootTarget era root2 t
x
(Mask RootTarget era r t
x) -> forall era r t.
HashSet (Name era) -> RootTarget era r t -> HashSet (Name era)
varsOfTarget HashSet (Name era)
ans RootTarget era r t
x
(Virtual Term era t
x PDoc
_ Lens' r t
_) -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era t
x
varsOfPred :: forall era. HashSet (Name era) -> Pred era -> HashSet (Name era)
varsOfPred :: forall era. HashSet (Name era) -> Pred era -> HashSet (Name era)
varsOfPred HashSet (Name era)
ans Pred era
s = case Pred era
s of
MetaSize Size
_ Term era Size
term -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era Size
term
Sized Term era Size
a Term era t
b -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era Size
a) Term era t
b
Term era a
a :=: Term era a
b -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era a
a) Term era a
b
Subset Term era (Set a)
a Term era (Set a)
b -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era (Set a)
a) Term era (Set a)
b
Disjoint Term era (Set a)
a Term era (Set a)
b -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era (Set a)
a) Term era (Set a)
b
SumsTo Direct c
_ Term era c
x OrdCond
_ [Sum era c]
xs -> forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' forall era r. HashSet (Name era) -> Sum era r -> HashSet (Name era)
varsOfSum (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era c
x) [Sum era c]
xs
SumSplit c
_ Term era c
x OrdCond
_ [Sum era c]
xs -> forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' forall era r. HashSet (Name era) -> Sum era r -> HashSet (Name era)
varsOfSum (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era c
x) [Sum era c]
xs
Random Term era t
x -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era t
x
Component Direct (Term era t)
t [AnyF era t]
cs -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' forall z. HashSet (Name era) -> AnyF era z -> HashSet (Name era)
varsOfComponent HashSet (Name era)
ans [AnyF era t]
cs) (forall a. Direct a -> a
direct Direct (Term era t)
t)
where
varsOfComponent :: forall z. HashSet (Name era) -> AnyF era z -> HashSet (Name era)
varsOfComponent :: forall z. HashSet (Name era) -> AnyF era z -> HashSet (Name era)
varsOfComponent HashSet (Name era)
l (AnyF (Field [Char]
n Rep era t
r Rep era z
rx Lens' z t
l2)) = forall a. (Eq a, Hashable a) => a -> HashSet a -> HashSet a
HashSet.insert (forall era t. V era t -> Name era
Name forall a b. (a -> b) -> a -> b
$ forall era t s.
Era era =>
[Char] -> Rep era t -> Access era s t -> V era t
V [Char]
n Rep era t
r (forall era s t. Rep era s -> Lens' s t -> Access era s t
Yes Rep era z
rx Lens' z t
l2)) HashSet (Name era)
l
varsOfComponent HashSet (Name era)
l (AnyF (FConst Rep era t
_ t
_ Rep era z
_ Lens' z t
_)) = HashSet (Name era)
l
CanFollow Term era n
a Term era n
b -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era n
a) Term era n
b
Member Direct (Term era a)
a Term era (Set a)
b -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans (forall a. Direct a -> a
direct Direct (Term era a)
a)) Term era (Set a)
b
NotMember Term era a
a Term era (Set a)
b -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era a
a) Term era (Set a)
b
MapMember Term era k
k Term era v
v Direct (Term era (Map k v))
m -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era k
k) Term era v
v) (forall a. Direct a -> a
direct Direct (Term era (Map k v))
m)
Term era t
a :<-: RootTarget era r t
b -> forall era r t.
HashSet (Name era) -> RootTarget era r t -> HashSet (Name era)
varsOfTarget (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era t
a) RootTarget era r t
b
GenFrom Term era t
a RootTarget era r (Gen t)
b -> forall era r t.
HashSet (Name era) -> RootTarget era r t -> HashSet (Name era)
varsOfTarget (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era t
a) RootTarget era r (Gen t)
b
List Term era fs
a [Term era t]
bs -> forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era fs
a) [Term era t]
bs
Choose Term era Size
sz Term era [t]
term [(Int, Target era t, [Pred era])]
pairs -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era r t2.
Era era =>
HashSet (Name era)
-> [(Int, RootTarget era r t2, [Pred era])] -> HashSet (Name era)
varsOfTrips HashSet (Name era)
ans [(Int, Target era t, [Pred era])]
pairs) Term era [t]
term) Term era Size
sz
Oneof Term era t
term [(Int, RootTarget era t t, [Pred era])]
pairs -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era r t2.
Era era =>
HashSet (Name era)
-> [(Int, RootTarget era r t2, [Pred era])] -> HashSet (Name era)
varsOfTrips HashSet (Name era)
ans [(Int, RootTarget era t t, [Pred era])]
pairs) Term era t
term
ForEach Term era Size
sz Term era fs
term Pat era t
pat [Pred era]
ps -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era t2.
Era era =>
HashSet (Name era)
-> [(Pat era t2, [Pred era])] -> HashSet (Name era)
varsOfPats HashSet (Name era)
ans [(Pat era t
pat, [Pred era]
ps)]) Term era fs
term) Term era Size
sz
Maybe Term era (Maybe t)
term RootTarget era r t
target [Pred era]
ps -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era r t2.
Era era =>
HashSet (Name era)
-> [(RootTarget era r t2, [Pred era])] -> HashSet (Name era)
varsOfPairs HashSet (Name era)
ans [(RootTarget era r t
target, [Pred era]
ps)]) Term era (Maybe t)
term
SubMap Term era (Map k v)
a Term era (Map k v)
b -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era (Map k v)
a) Term era (Map k v)
b
If RootTarget era r Bool
t Pred era
x Pred era
y -> forall era r t.
HashSet (Name era) -> RootTarget era r t -> HashSet (Name era)
varsOfTarget (forall era. HashSet (Name era) -> Pred era -> HashSet (Name era)
varsOfPred (forall era. HashSet (Name era) -> Pred era -> HashSet (Name era)
varsOfPred HashSet (Name era)
ans Pred era
x) Pred era
y) RootTarget era r Bool
t
Before Term era a
a Term era b
b -> forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era a
a) Term era b
b
ListWhere Term era Size
sz Term era [t]
t RootTarget era t t
tar [Pred era]
ps -> forall a. Eq a => HashSet a -> HashSet a -> HashSet a
HashSet.union HashSet (Name era)
vs HashSet (Name era)
others
where
vs :: HashSet (Name era)
vs = forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm (forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era [t]
t) Term era Size
sz
bound :: HashSet (Name era)
bound = forall era r t.
HashSet (Name era) -> RootTarget era r t -> HashSet (Name era)
varsOfTarget forall a. HashSet a
HashSet.empty RootTarget era t t
tar
pvs :: HashSet (Name era)
pvs = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' forall era. HashSet (Name era) -> Pred era -> HashSet (Name era)
varsOfPred forall a. HashSet a
HashSet.empty [Pred era]
ps
others :: HashSet (Name era)
others = forall a. (Eq a, Hashable a) => HashSet a -> HashSet a -> HashSet a
HashSet.difference HashSet (Name era)
pvs HashSet (Name era)
bound
varsOfTrips ::
Era era => HashSet (Name era) -> [(Int, RootTarget era r t2, [Pred era])] -> HashSet (Name era)
varsOfTrips :: forall era r t2.
Era era =>
HashSet (Name era)
-> [(Int, RootTarget era r t2, [Pred era])] -> HashSet (Name era)
varsOfTrips HashSet (Name era)
ans1 [] = HashSet (Name era)
ans1
varsOfTrips HashSet (Name era)
ans1 ((Int
_, RootTarget era r t2
t, [Pred era]
ps) : [(Int, RootTarget era r t2, [Pred era])]
more) = forall era r t2.
Era era =>
HashSet (Name era)
-> [(Int, RootTarget era r t2, [Pred era])] -> HashSet (Name era)
varsOfTrips (forall {era} {t :: * -> *} {r} {t}.
(Era era, Foldable t) =>
HashSet (Name era)
-> RootTarget era r t -> t (Pred era) -> HashSet (Name era)
act HashSet (Name era)
ans1 RootTarget era r t2
t [Pred era]
ps) [(Int, RootTarget era r t2, [Pred era])]
more
where
act :: HashSet (Name era)
-> RootTarget era r t -> t (Pred era) -> HashSet (Name era)
act HashSet (Name era)
ans2 RootTarget era r t
tar t (Pred era)
preds =
forall a. Eq a => HashSet a -> HashSet a -> HashSet a
HashSet.union
( forall a. (Eq a, Hashable a) => HashSet a -> HashSet a -> HashSet a
HashSet.difference
(forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' forall era. HashSet (Name era) -> Pred era -> HashSet (Name era)
varsOfPred forall a. HashSet a
HashSet.empty t (Pred era)
preds)
(forall era r t.
HashSet (Name era) -> RootTarget era r t -> HashSet (Name era)
varsOfTarget forall a. HashSet a
HashSet.empty RootTarget era r t
tar)
)
HashSet (Name era)
ans2
varsOfPairs ::
Era era => HashSet (Name era) -> [(RootTarget era r t2, [Pred era])] -> HashSet (Name era)
varsOfPairs :: forall era r t2.
Era era =>
HashSet (Name era)
-> [(RootTarget era r t2, [Pred era])] -> HashSet (Name era)
varsOfPairs HashSet (Name era)
ans1 [] = HashSet (Name era)
ans1
varsOfPairs HashSet (Name era)
ans1 ((RootTarget era r t2
t, [Pred era]
ps) : [(RootTarget era r t2, [Pred era])]
more) = forall era r t2.
Era era =>
HashSet (Name era)
-> [(RootTarget era r t2, [Pred era])] -> HashSet (Name era)
varsOfPairs (forall {era} {t :: * -> *} {r} {t}.
(Era era, Foldable t) =>
HashSet (Name era)
-> RootTarget era r t -> t (Pred era) -> HashSet (Name era)
act HashSet (Name era)
ans1 RootTarget era r t2
t [Pred era]
ps) [(RootTarget era r t2, [Pred era])]
more
where
act :: HashSet (Name era)
-> RootTarget era r t -> t (Pred era) -> HashSet (Name era)
act HashSet (Name era)
ans2 RootTarget era r t
tar t (Pred era)
preds =
forall a. Eq a => HashSet a -> HashSet a -> HashSet a
HashSet.union
( forall a. (Eq a, Hashable a) => HashSet a -> HashSet a -> HashSet a
HashSet.difference
(forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' forall era. HashSet (Name era) -> Pred era -> HashSet (Name era)
varsOfPred forall a. HashSet a
HashSet.empty t (Pred era)
preds)
(forall era r t.
HashSet (Name era) -> RootTarget era r t -> HashSet (Name era)
varsOfTarget forall a. HashSet a
HashSet.empty RootTarget era r t
tar)
)
HashSet (Name era)
ans2
varsOfPats :: Era era => HashSet (Name era) -> [(Pat era t2, [Pred era])] -> HashSet (Name era)
varsOfPats :: forall era t2.
Era era =>
HashSet (Name era)
-> [(Pat era t2, [Pred era])] -> HashSet (Name era)
varsOfPats HashSet (Name era)
ans1 [] = HashSet (Name era)
ans1
varsOfPats HashSet (Name era)
ans1 ((Pat era t2
pat0, [Pred era]
ps) : [(Pat era t2, [Pred era])]
more) = forall era t2.
Era era =>
HashSet (Name era)
-> [(Pat era t2, [Pred era])] -> HashSet (Name era)
varsOfPats (forall {era} {t :: * -> *} {t}.
(Era era, Foldable t) =>
HashSet (Name era)
-> Pat era t -> t (Pred era) -> HashSet (Name era)
act HashSet (Name era)
ans1 Pat era t2
pat0 [Pred era]
ps) [(Pat era t2, [Pred era])]
more
where
act :: HashSet (Name era)
-> Pat era t -> t (Pred era) -> HashSet (Name era)
act HashSet (Name era)
ans2 Pat era t
pat t (Pred era)
preds =
forall a. Eq a => HashSet a -> HashSet a -> HashSet a
HashSet.union
( forall a. (Eq a, Hashable a) => HashSet a -> HashSet a -> HashSet a
HashSet.difference
(forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' forall era. HashSet (Name era) -> Pred era -> HashSet (Name era)
varsOfPred forall a. HashSet a
HashSet.empty t (Pred era)
preds)
(forall era t. HashSet (Name era) -> Pat era t -> HashSet (Name era)
varsOfPat forall a. HashSet a
HashSet.empty Pat era t
pat)
)
HashSet (Name era)
ans2
varsOfSum :: HashSet (Name era) -> Sum era r -> HashSet (Name era)
varsOfSum :: forall era r. HashSet (Name era) -> Sum era r -> HashSet (Name era)
varsOfSum HashSet (Name era)
ans (SumMap Term era (Map a r)
y) = forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era (Map a r)
y
varsOfSum HashSet (Name era)
ans (SumList Term era [r]
y) = forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era [r]
y
varsOfSum HashSet (Name era)
ans (One Term era r
y) = forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era r
y
varsOfSum HashSet (Name era)
ans (ProjOne Lens' x r
_ Rep era r
_ Term era x
y) = forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era x
y
varsOfSum HashSet (Name era)
ans (ProjMap Rep era r
_ Lens' x r
_ Term era (Map a x)
x) = forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm HashSet (Name era)
ans Term era (Map a x)
x
expandSum :: Sum era c -> [Int] -> [Sum era c]
expandSum :: forall era c. Sum era c -> [Int] -> [Sum era c]
expandSum (One (Var (V [Char]
n Rep era c
r Access era s c
a))) [Int]
ns = forall a b. (a -> b) -> [a] -> [b]
map (\Int
i -> forall era c. Term era c -> Sum era c
One (forall era t. V era t -> Term era t
Var (forall era t s.
Era era =>
[Char] -> Rep era t -> Access era s t -> V era t
V ([Char]
n forall a. [a] -> [a] -> [a]
++ [Char]
"." forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Int
i) Rep era c
r Access era s c
a))) [Int]
ns
expandSum (ProjOne Lens' x c
l Rep era c
rep (Var (V [Char]
n Rep era x
r Access era s x
a))) [Int]
ns = forall a b. (a -> b) -> [a] -> [b]
map (\Int
i -> forall s c era. Lens' s c -> Rep era c -> Term era s -> Sum era c
ProjOne Lens' x c
l Rep era c
rep (forall era t. V era t -> Term era t
Var (forall era t s.
Era era =>
[Char] -> Rep era t -> Access era s t -> V era t
V ([Char]
n forall a. [a] -> [a] -> [a]
++ [Char]
"." forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Int
i) Rep era x
r Access era s x
a))) [Int]
ns
expandSum Sum era c
x [Int]
_ = forall a. HasCallStack => [Char] -> a
error ([Char]
"Bad Sum in expandSum: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Sum era c
x)
pad :: Int -> String -> String
pad :: Int -> ShowS
pad Int
n [Char]
x = [Char]
x forall a. [a] -> [a] -> [a]
++ forall a. Int -> a -> [a]
replicate (Int
n forall a. Num a => a -> a -> a
- forall (t :: * -> *) a. Foldable t => t a -> Int
length [Char]
x) Char
' '
data SubstElem era where
SubstElem :: Rep era t -> Term era t -> Access era s t -> SubstElem era
instance Show (SubstElem era) where
show :: SubstElem era -> [Char]
show (SubstElem Rep era t
rep Term era t
t Access era s t
_) = forall a. Show a => a -> [Char]
show Term era t
t forall a. [a] -> [a] -> [a]
++ [Char]
" :: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Rep era t
rep
newtype Subst era = Subst (Map String (SubstElem era))
extend :: V era t -> Term era t -> Subst era -> Subst era
extend :: forall era t. V era t -> Term era t -> Subst era -> Subst era
extend (V [Char]
nm Rep era t
rep Access era s t
access) Term era t
term (Subst Map [Char] (SubstElem era)
m) = forall era. Map [Char] (SubstElem era) -> Subst era
Subst (forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert [Char]
nm (forall era s a.
Rep era s -> Term era s -> Access era a s -> SubstElem era
SubstElem Rep era t
rep Term era t
term Access era s t
access) Map [Char] (SubstElem era)
m)
instance Show (Subst era) where
show :: Subst era -> [Char]
show (Subst Map [Char] (SubstElem era)
m) = [[Char]] -> [Char]
unlines (forall a b. (a -> b) -> [a] -> [b]
map forall {era}. ([Char], SubstElem era) -> [Char]
f (forall k a. Map k a -> [(k, a)]
Map.toList Map [Char] (SubstElem era)
m))
where
f :: ([Char], SubstElem era) -> [Char]
f ([Char]
nm, SubstElem Rep era t
_ Term era t
t Access era s t
_) = [Char]
nm forall a. [a] -> [a] -> [a]
++ [Char]
" -> " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era t
t
emptySubst :: Subst era
emptySubst :: forall era. Subst era
emptySubst = forall era. Map [Char] (SubstElem era) -> Subst era
Subst forall k a. Map k a
Map.empty
substToEnv :: Subst era -> Env era -> Typed (Env era)
substToEnv :: forall era. Subst era -> Env era -> Typed (Env era)
substToEnv (Subst Map [Char] (SubstElem era)
m) Env era
env = forall a k b. (a -> k -> b -> a) -> a -> Map k b -> a
Map.foldlWithKey' forall {era}.
Typed (Env era) -> [Char] -> SubstElem era -> Typed (Env era)
accum (forall (f :: * -> *) a. Applicative f => a -> f a
pure Env era
env) Map [Char] (SubstElem era)
m
where
accum :: Typed (Env era) -> [Char] -> SubstElem era -> Typed (Env era)
accum Typed (Env era)
ansM [Char]
key (SubstElem Rep era t
r (Lit Rep era t
_ t
v) Access era s t
access) = do
Env Map [Char] (Payload era)
ans <- Typed (Env era)
ansM
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall era. Map [Char] (Payload era) -> Env era
Env forall a b. (a -> b) -> a -> b
$ forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert [Char]
key (forall era t s. Rep era t -> t -> Access era s t -> Payload era
Payload Rep era t
r t
v Access era s t
access) Map [Char] (Payload era)
ans
accum Typed (Env era)
_ [Char]
_ (SubstElem Rep era t
_ Term era t
e Access era s t
_) = forall a. [[Char]] -> Typed a
failT [[Char]
"Not Literal expr in substToEnv: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era t
e]
envToSubst :: Env era -> Subst era
envToSubst :: forall era. Env era -> Subst era
envToSubst (Env Map [Char] (Payload era)
env) = forall era. Map [Char] (SubstElem era) -> Subst era
Subst (forall a b k. (a -> b) -> Map k a -> Map k b
Map.map forall {era}. Payload era -> SubstElem era
f Map [Char] (Payload era)
env)
where
f :: Payload era -> SubstElem era
f (Payload Rep era t
rep t
t Access era s t
access) = forall era s a.
Rep era s -> Term era s -> Access era a s -> SubstElem era
SubstElem Rep era t
rep (forall era t. Rep era t -> t -> Term era t
Lit Rep era t
rep t
t) Access era s t
access
findV :: Subst era -> V era t -> Term era t
findV :: forall era t. Subst era -> V era t -> Term era t
findV (Subst Map [Char] (SubstElem era)
m) v :: V era t
v@(V [Char]
n1 Rep era t
rep1 Access era s t
_) = case forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup [Char]
n1 Map [Char] (SubstElem era)
m of
Maybe (SubstElem era)
Nothing -> forall era t. V era t -> Term era t
Var V era t
v
Just (SubstElem Rep era t
rep2 Term era t
term Access era s t
_) -> case forall {k} (t :: k -> *) (i :: k) (j :: k).
Singleton t =>
t i -> t j -> Maybe (i :~: j)
testEql Rep era t
rep1 Rep era t
rep2 of
Just t :~: t
Refl -> Term era t
term
Maybe (t :~: t)
Nothing ->
forall a. HasCallStack => [Char] -> a
error
( [Char]
"In findV, we found: "
forall a. [a] -> [a] -> [a]
++ [Char]
n1
forall a. [a] -> [a] -> [a]
++ [Char]
", but the types did not match. "
forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Rep era t
rep1
forall a. [a] -> [a] -> [a]
++ [Char]
" =/= "
forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Rep era t
rep2
)
composeSubst :: Subst era -> Subst era -> Subst era
composeSubst :: forall era. Subst era -> Subst era -> Subst era
composeSubst (Subst Map [Char] (SubstElem era)
sub1) (Subst Map [Char] (SubstElem era)
sub2) = forall era. Map [Char] (SubstElem era) -> Subst era
Subst (forall k a b. (k -> a -> b -> b) -> b -> Map k a -> b
Map.foldrWithKey' forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert Map [Char] (SubstElem era)
sub2 Map [Char] (SubstElem era)
sub1)
singleSubst :: V era t -> Term era t -> Subst era
singleSubst :: forall era t. V era t -> Term era t -> Subst era
singleSubst (V [Char]
n Rep era t
r Access era s t
access) Term era t
expr = forall era. Map [Char] (SubstElem era) -> Subst era
Subst (forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert [Char]
n (forall era s a.
Rep era s -> Term era s -> Access era a s -> SubstElem era
SubstElem Rep era t
r Term era t
expr Access era s t
access) forall k a. Map k a
Map.empty)
substFromNames :: forall era. HashSet (Name era) -> Subst era
substFromNames :: forall era. HashSet (Name era) -> Subst era
substFromNames HashSet (Name era)
names = forall era. Map [Char] (SubstElem era) -> Subst era
Subst (forall a b. (a -> b -> a) -> a -> HashSet b -> a
HashSet.foldl' Map [Char] (SubstElem era)
-> Name era -> Map [Char] (SubstElem era)
accum forall k a. Map k a
Map.empty HashSet (Name era)
names)
where
accum :: Map String (SubstElem era) -> Name era -> Map String (SubstElem era)
accum :: Map [Char] (SubstElem era)
-> Name era -> Map [Char] (SubstElem era)
accum Map [Char] (SubstElem era)
ans (Name v :: V era t
v@(V [Char]
n Rep era t
r Access era s t
access)) = forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert [Char]
n (forall era s a.
Rep era s -> Term era s -> Access era a s -> SubstElem era
SubstElem Rep era t
r (forall era t. V era t -> Term era t
Var V era t
v) Access era s t
access) Map [Char] (SubstElem era)
ans
data SubItem era where
SubItem :: V era t -> Term era t -> SubItem era
instance Show (SubItem era) where
show :: SubItem era -> [Char]
show (SubItem V era t
x Term era t
y) = [Char]
"(SubItem " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show V era t
x forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era t
y forall a. [a] -> [a] -> [a]
++ [Char]
")"
itemsToSubst :: [SubItem era] -> Subst era
itemsToSubst :: forall era. [SubItem era] -> Subst era
itemsToSubst [SubItem era]
ss = forall era. Map [Char] (SubstElem era) -> Subst era
Subst (forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
List.foldr forall era.
SubItem era
-> Map [Char] (SubstElem era) -> Map [Char] (SubstElem era)
accum forall k a. Map k a
Map.empty [SubItem era]
ss)
where
accum :: SubItem era -> Map String (SubstElem era) -> Map String (SubstElem era)
accum :: forall era.
SubItem era
-> Map [Char] (SubstElem era) -> Map [Char] (SubstElem era)
accum (SubItem (V [Char]
nm Rep era t
rep Access era s t
access) Term era t
term) !Map [Char] (SubstElem era)
ans = forall k a. Ord k => k -> a -> Map k a -> Map k a
Map.insert [Char]
nm (forall era s a.
Rep era s -> Term era s -> Access era a s -> SubstElem era
SubstElem Rep era t
rep Term era t
term Access era s t
access) Map [Char] (SubstElem era)
ans
substTerm :: Subst era -> Term era t -> Term era t
substTerm :: forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub (Var V era t
v) = forall era t. Subst era -> V era t -> Term era t
findV Subst era
sub V era t
v
substTerm Subst era
_ (Lit Rep era t
r t
k) = forall era t. Rep era t -> t -> Term era t
Lit Rep era t
r t
k
substTerm Subst era
sub (Dom Term era (Map a b)
x) = forall s era a. Ord s => Term era (Map s a) -> Term era (Set s)
Dom (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Map a b)
x)
substTerm Subst era
sub (Rng Term era (Map a b)
x) = forall s a era.
(Ord s, Ord a) =>
Term era (Map s a) -> Term era (Set a)
Rng (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Map a b)
x)
substTerm Subst era
sub (Elems Term era (Map a b)
x) = forall s a era. (Ord s, Eq a) => Term era (Map s a) -> Term era [a]
Elems (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Map a b)
x)
substTerm Subst era
sub (ProjM Lens' b t
l Rep era t
r Term era (Map a b)
x) = forall s a t era.
Ord s =>
Lens' a t -> Rep era t -> Term era (Map s a) -> Term era (Map s t)
ProjM Lens' b t
l Rep era t
r (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Map a b)
x)
substTerm Subst era
sub (ProjS Lens' b t
l Rep era t
r Term era (Set b)
x) = forall s a era.
(Ord s, Ord a) =>
Lens' s a -> Rep era a -> Term era (Set s) -> Term era (Set a)
ProjS Lens' b t
l Rep era t
r (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Set b)
x)
substTerm Subst era
sub (Proj Lens' b t
l Rep era t
r Term era b
x) = forall s t era. Lens' s t -> Rep era t -> Term era s -> Term era t
Proj Lens' b t
l Rep era t
r (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era b
x)
substTerm Subst era
sub (Delta Term era Coin
x) = forall era. Term era Coin -> Term era DeltaCoin
Delta (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era Coin
x)
substTerm Subst era
sub (Negate Term era DeltaCoin
x) = forall era. Term era DeltaCoin -> Term era DeltaCoin
Negate (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era DeltaCoin
x)
substTerm Subst era
sub (Restrict Term era (Set a)
s Term era (Map a b)
m) = forall s era a.
Ord s =>
Term era (Set s) -> Term era (Map s a) -> Term era (Map s a)
Restrict (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Set a)
s) (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Map a b)
m)
substTerm Subst era
sub (HashS Term era (ScriptF era)
s) = forall era.
Reflect era =>
Term era (ScriptF era) -> Term era ScriptHash
HashS (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (ScriptF era)
s)
substTerm Subst era
sub (HashD Term era (Data era)
s) = forall era.
Era era =>
Term era (Data era) -> Term era (SafeHash EraIndependentData)
HashD (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Data era)
s)
substTerm Subst era
sub (Pair Term era a
a Term era b
b) = forall era s a. Term era s -> Term era a -> Term era (s, a)
Pair (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era a
a) (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era b
b)
substPred :: Subst era -> Pred era -> Pred era
substPred :: forall era. Subst era -> Pred era -> Pred era
substPred Subst era
sub (MetaSize Size
a Term era Size
b) = forall era. Size -> Term era Size -> Pred era
MetaSize Size
a (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era Size
b)
substPred Subst era
sub (Sized Term era Size
a Term era t
b) = forall s era. Sizeable s => Term era Size -> Term era s -> Pred era
Sized (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era Size
a) (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era t
b)
substPred Subst era
sub (Term era a
a :=: Term era a
b) = forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era a
a forall s era. Eq s => Term era s -> Term era s -> Pred era
:=: forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era a
b
substPred Subst era
sub (Term era (Set a)
a `Subset` Term era (Set a)
b) = forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Set a)
a forall s era.
Ord s =>
Term era (Set s) -> Term era (Set s) -> Pred era
`Subset` forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Set a)
b
substPred Subst era
sub (Disjoint Term era (Set a)
a Term era (Set a)
b) = forall s era.
Ord s =>
Term era (Set s) -> Term era (Set s) -> Pred era
Disjoint (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Set a)
a) (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Set a)
b)
substPred Subst era
sub (SumsTo Direct c
i Term era c
a OrdCond
cond [Sum era c]
b) = forall era s.
(Era era, Adds s) =>
Direct s -> Term era s -> OrdCond -> [Sum era s] -> Pred era
SumsTo Direct c
i (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era c
a) OrdCond
cond (forall a b. (a -> b) -> [a] -> [b]
map (forall era t. Subst era -> Sum era t -> Sum era t
substSum Subst era
sub) [Sum era c]
b)
substPred Subst era
sub (SumSplit c
i Term era c
a OrdCond
cond [Sum era c]
b) = forall era s.
(Era era, Adds s) =>
s -> Term era s -> OrdCond -> [Sum era s] -> Pred era
SumSplit c
i (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era c
a) OrdCond
cond (forall a b. (a -> b) -> [a] -> [b]
map (forall era t. Subst era -> Sum era t -> Sum era t
substSum Subst era
sub) [Sum era c]
b)
substPred Subst era
sub (Random Term era t
x) = forall era s. Term era s -> Pred era
Random (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era t
x)
substPred Subst era
sub (Component Direct (Term era t)
t [AnyF era t]
cs) = case Direct (Term era t)
t of
Left Term era t
x -> forall era s. Direct (Term era s) -> [AnyF era s] -> Pred era
Component (forall a b. a -> Either a b
Left (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era t
x)) (AnyF era t -> AnyF era t
substComp forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [AnyF era t]
cs)
Right Term era t
x -> forall era s. Direct (Term era s) -> [AnyF era s] -> Pred era
Component (forall a b. b -> Either a b
Right (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era t
x)) (AnyF era t -> AnyF era t
substComp forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [AnyF era t]
cs)
where
substComp :: AnyF era t -> AnyF era t
substComp (AnyF w :: Field era t t
w@(Field [Char]
n Rep era t
r Rep era t
rx Lens' t t
l)) = forall era s t. Field era s t -> AnyF era s
AnyF forall a b. (a -> b) -> a -> b
$ case forall era t. Subst era -> V era t -> Term era t
findV Subst era
sub (forall era t s.
Era era =>
[Char] -> Rep era t -> Access era s t -> V era t
V [Char]
n Rep era t
r (forall era s t. Rep era s -> Lens' s t -> Access era s t
Yes Rep era t
rx Lens' t t
l)) of
(Lit Rep era t
rep t
x) -> forall era t s.
Rep era t -> t -> Rep era s -> Lens' s t -> Field era s t
FConst Rep era t
rep t
x Rep era t
rx Lens' t t
l
(Var (V [Char]
n2 Rep era t
r2 Access era s t
_a2)) -> forall era t s.
Era era =>
[Char] -> Rep era t -> Rep era s -> Lens' s t -> Field era s t
Field [Char]
n2 Rep era t
r2 Rep era t
rx Lens' t t
l
Term era t
_ -> Field era t t
w
substComp x :: AnyF era t
x@(AnyF (FConst Rep era t
_ t
_ Rep era t
_ Lens' t t
_)) = AnyF era t
x
substPred Subst era
sub (CanFollow Term era n
a Term era n
b) = forall s era. Count s => Term era s -> Term era s -> Pred era
CanFollow (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era n
a) (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era n
b)
substPred Subst era
sub (Member Direct (Term era a)
dirA Term era (Set a)
b) = case Direct (Term era a)
dirA of
Left Term era a
a -> forall s era.
Ord s =>
Direct (Term era s) -> Term era (Set s) -> Pred era
Member (forall a b. a -> Either a b
Left (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era a
a)) (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Set a)
b)
Right Term era a
a -> forall s era.
Ord s =>
Direct (Term era s) -> Term era (Set s) -> Pred era
Member (forall a b. b -> Either a b
Right (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era a
a)) (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Set a)
b)
substPred Subst era
sub (NotMember Term era a
a Term era (Set a)
b) = forall s era. Ord s => Term era s -> Term era (Set s) -> Pred era
NotMember (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era a
a) (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Set a)
b)
substPred Subst era
sub (MapMember Term era k
k Term era v
v Direct (Term era (Map k v))
dirM) = case Direct (Term era (Map k v))
dirM of
Left Term era (Map k v)
m -> forall s a era.
(Ord s, Eq a, Ord a) =>
Term era s -> Term era a -> Direct (Term era (Map s a)) -> Pred era
MapMember (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era k
k) (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era v
v) (forall a b. a -> Either a b
Left (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Map k v)
m))
Right Term era (Map k v)
m -> forall s a era.
(Ord s, Eq a, Ord a) =>
Term era s -> Term era a -> Direct (Term era (Map s a)) -> Pred era
MapMember (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era k
k) (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era v
v) (forall a b. b -> Either a b
Right (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Map k v)
m))
substPred Subst era
sub (Term era t
a :<-: RootTarget era r t
b) = forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era t
a forall era s a. Term era s -> RootTarget era a s -> Pred era
:<-: forall era r t.
Subst era -> RootTarget era r t -> RootTarget era r t
substTarget Subst era
sub RootTarget era r t
b
substPred Subst era
sub (GenFrom Term era t
a RootTarget era r (Gen t)
b) = forall era s a. Term era s -> RootTarget era a (Gen s) -> Pred era
GenFrom (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era t
a) (forall era r t.
Subst era -> RootTarget era r t -> RootTarget era r t
substTarget Subst era
sub RootTarget era r (Gen t)
b)
substPred Subst era
sub (List Term era fs
a [Term era t]
b) = forall s a era.
FromList s a =>
Term era s -> [Term era a] -> Pred era
List (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era fs
a) (forall a b. (a -> b) -> [a] -> [b]
map (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub) [Term era t]
b)
substPred Subst era
sub (Choose Term era Size
sz Term era [t]
t [(Int, Target era t, [Pred era])]
pairs) = forall era s.
(Era era, Eq s) =>
Term era Size
-> Term era [s] -> [(Int, Target era s, [Pred era])] -> Pred era
Choose (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era Size
sz) (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era [t]
t) (forall a b. (a -> b) -> [a] -> [b]
map (forall {era} {a} {r} {t}.
Subst era
-> (a, RootTarget era r t, [Pred era])
-> (a, RootTarget era r t, [Pred era])
subPair Subst era
sub) [(Int, Target era t, [Pred era])]
pairs)
where
subPair :: Subst era
-> (a, RootTarget era r t, [Pred era])
-> (a, RootTarget era r t, [Pred era])
subPair Subst era
sub0 (a
i, RootTarget era r t
tar, [Pred era]
ps) = (a
i, RootTarget era r t
tar, forall a b. (a -> b) -> [a] -> [b]
map (forall era. Subst era -> Pred era -> Pred era
substPred (forall era. Subst era -> Subst era -> Subst era
composeSubst Subst era
sub1 Subst era
sub0)) [Pred era]
ps)
where
sub1 :: Subst era
sub1 = forall era r t. RootTarget era r t -> Subst era
substFromTarget RootTarget era r t
tar
substPred Subst era
sub (Oneof Term era t
t [(Int, RootTarget era t t, [Pred era])]
ps) = forall s era.
(Eq s, Era era) =>
Term era s -> [(Int, RootTarget era s s, [Pred era])] -> Pred era
Oneof (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era t
t) (forall a b. (a -> b) -> [a] -> [b]
map (\(Int
i, RootTarget era t t
tr, [Pred era]
p) -> (Int
i, forall era r t.
Subst era -> RootTarget era r t -> RootTarget era r t
substTarget Subst era
sub RootTarget era t t
tr, forall a b. (a -> b) -> [a] -> [b]
map (forall era. Subst era -> Pred era -> Pred era
substPred Subst era
sub) [Pred era]
p)) [(Int, RootTarget era t t, [Pred era])]
ps)
substPred Subst era
sub (ForEach Term era Size
sz Term era fs
t Pat era t
pat [Pred era]
ps) =
forall era s a.
(Era era, FromList s a, Eq a) =>
Term era Size -> Term era s -> Pat era a -> [Pred era] -> Pred era
ForEach
(forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era Size
sz)
(forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era fs
t)
Pat era t
pat
(forall a b. (a -> b) -> [a] -> [b]
map (forall era. Subst era -> Pred era -> Pred era
substPred Subst era
sub1) [Pred era]
ps)
where
sub1 :: Subst era
sub1 = forall era. Subst era -> Subst era -> Subst era
composeSubst (forall era t. Pat era t -> Subst era
substFromPat Pat era t
pat) Subst era
sub
substPred Subst era
sub (Maybe Term era (Maybe t)
term RootTarget era r t
target [Pred era]
ps) = forall s era a.
(Era era, Typeable s) =>
Term era (Maybe a) -> RootTarget era s a -> [Pred era] -> Pred era
Maybe (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Maybe t)
term) RootTarget era r t
target (forall a b. (a -> b) -> [a] -> [b]
map (forall era. Subst era -> Pred era -> Pred era
substPred (forall era. Subst era -> Subst era -> Subst era
composeSubst Subst era
sub1 Subst era
sub)) [Pred era]
ps)
where
sub1 :: Subst era
sub1 = forall era r t. RootTarget era r t -> Subst era
substFromTarget RootTarget era r t
target
substPred Subst era
sub (SubMap Term era (Map k v)
a Term era (Map k v)
b) = forall s a era.
(Ord s, Eq a, Ord a) =>
Term era (Map s a) -> Term era (Map s a) -> Pred era
SubMap (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Map k v)
a) (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Map k v)
b)
substPred Subst era
sub (If RootTarget era r Bool
t Pred era
x Pred era
y) = forall era s.
RootTarget era s Bool -> Pred era -> Pred era -> Pred era
If (forall era r t.
Subst era -> RootTarget era r t -> RootTarget era r t
substTarget Subst era
sub RootTarget era r Bool
t) (forall era. Subst era -> Pred era -> Pred era
substPred Subst era
sub Pred era
x) (forall era. Subst era -> Pred era -> Pred era
substPred Subst era
sub Pred era
y)
substPred Subst era
sub (Before Term era a
a Term era b
b) = forall era s a. Term era s -> Term era a -> Pred era
Before (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era a
a) (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era b
b)
substPred Subst era
sub (ListWhere Term era Size
sz Term era [t]
t RootTarget era t t
tar [Pred era]
ps) =
forall era s.
(Era era, Eq s) =>
Term era Size
-> Term era [s] -> RootTarget era s s -> [Pred era] -> Pred era
ListWhere (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era Size
sz) (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era [t]
t) RootTarget era t t
tar (forall a b. (a -> b) -> [a] -> [b]
map (forall era. Subst era -> Pred era -> Pred era
substPred Subst era
newsub) [Pred era]
ps)
where
newsub :: Subst era
newsub = forall era. Subst era -> Subst era -> Subst era
composeSubst (forall era r t. RootTarget era r t -> Subst era
substFromTarget RootTarget era t t
tar) Subst era
sub
substPredWithVarTest :: Subst era -> Pred era -> Pred era
substPredWithVarTest :: forall era. Subst era -> Pred era -> Pred era
substPredWithVarTest Subst era
sub Pred era
oldpred =
let newpred :: Pred era
newpred = forall era. Subst era -> Pred era -> Pred era
substPred Subst era
sub Pred era
oldpred
freevars :: HashSet (Name era)
freevars = forall era. HashSet (Name era) -> Pred era -> HashSet (Name era)
varsOfPred forall a. HashSet a
HashSet.empty Pred era
newpred
in case forall a. HashSet a -> Bool
HashSet.null HashSet (Name era)
freevars of
Bool
False -> Pred era
newpred
Bool
True ->
forall a. HasCallStack => [Char] -> a
error
( [[Char]] -> [Char]
unlines
[ [Char]
"When solving: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Pred era
oldpred forall a. [a] -> [a] -> [a]
++ [Char]
","
, [Char]
"we applied the Subst from earlier stages, and we obtain the pred:"
, [Char]
" " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Pred era
newpred
, [Char]
"with no free variables. This probably means an introductory pred like (Sized x)"
, [Char]
"or (Random x), appears both in an earlier stage, and the current stage."
]
)
where
substFromTarget :: RootTarget era r t -> Subst era
substFromTarget :: forall era r t. RootTarget era r t -> Subst era
substFromTarget RootTarget era r t
tar = forall era. HashSet (Name era) -> Subst era
substFromNames (forall era r t.
HashSet (Name era) -> RootTarget era r t -> HashSet (Name era)
varsOfTarget forall a. HashSet a
HashSet.empty RootTarget era r t
tar)
substFromPat :: Pat era t -> Subst era
substFromPat :: forall era t. Pat era t -> Subst era
substFromPat Pat era t
pat = forall era. HashSet (Name era) -> Subst era
substFromNames (forall era t. HashSet (Name era) -> Pat era t -> HashSet (Name era)
varsOfPat forall a. HashSet a
HashSet.empty Pat era t
pat)
substSum :: Subst era -> Sum era t -> Sum era t
substSum :: forall era t. Subst era -> Sum era t -> Sum era t
substSum Subst era
sub (SumMap Term era (Map a t)
x) = forall c era s. Adds c => Term era (Map s c) -> Sum era c
SumMap (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Map a t)
x)
substSum Subst era
sub (SumList Term era [t]
x) = forall c era. Adds c => Term era [c] -> Sum era c
SumList (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era [t]
x)
substSum Subst era
sub (One Term era t
x) = forall era c. Term era c -> Sum era c
One (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era t
x)
substSum Subst era
sub (ProjOne Lens' x t
l Rep era t
r Term era x
x) = forall s c era. Lens' s c -> Rep era c -> Term era s -> Sum era c
ProjOne Lens' x t
l Rep era t
r (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era x
x)
substSum Subst era
sub (ProjMap Rep era t
crep Lens' x t
l Term era (Map a x)
x) = forall s c a era.
Adds c =>
Rep era c -> Lens' s c -> Term era (Map a s) -> Sum era c
ProjMap Rep era t
crep Lens' x t
l (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era (Map a x)
x)
substTarget :: Subst era -> RootTarget era r t -> RootTarget era r t
substTarget :: forall era r t.
Subst era -> RootTarget era r t -> RootTarget era r t
substTarget Subst era
sub (Simple Term era t
e) = forall era t. Term era t -> RootTarget era Void t
Simple (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era t
e)
substTarget Subst era
sub (Lensed Term era t
e SimpleGetter r t
l) = forall era t root.
Term era t -> SimpleGetter root t -> RootTarget era root t
Lensed (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era t
e) SimpleGetter r t
l
substTarget Subst era
sub (Partial Term era t
e r -> Maybe t
l) = forall era t root.
Term era t -> (root -> Maybe t) -> RootTarget era root t
Partial (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era t
e) r -> Maybe t
l
substTarget Subst era
sub (RootTarget era r (a -> t)
a :$ RootTarget era r a
b) = forall era r t.
Subst era -> RootTarget era r t -> RootTarget era r t
substTarget Subst era
sub RootTarget era r (a -> t)
a forall era r s b.
RootTarget era r (s -> b)
-> RootTarget era r s -> RootTarget era r b
:$ forall era r t.
Subst era -> RootTarget era r t -> RootTarget era r t
substTarget Subst era
sub RootTarget era r a
b
substTarget Subst era
_ (Constr [Char]
n a -> b
f) = forall s a era. [Char] -> (s -> a) -> RootTarget era Void (s -> a)
Constr [Char]
n a -> b
f
substTarget Subst era
_ (Invert [Char]
x TypeRep r
l a -> b
f) = forall root s a era.
[Char] -> TypeRep root -> (s -> a) -> RootTarget era root (s -> a)
Invert [Char]
x TypeRep r
l a -> b
f
substTarget Subst era
sub (Shift RootTarget era root2 t
x Lens' r root2
l) = forall era s a root1.
RootTarget era s a -> Lens' root1 s -> RootTarget era root1 a
Shift (forall era r t.
Subst era -> RootTarget era r t -> RootTarget era r t
substTarget Subst era
sub RootTarget era root2 t
x) Lens' r root2
l
substTarget Subst era
sub (Mask RootTarget era r t
x) = forall era s a. RootTarget era s a -> RootTarget era Void a
Mask (forall era r t.
Subst era -> RootTarget era r t -> RootTarget era r t
substTarget Subst era
sub RootTarget era r t
x)
substTarget Subst era
sub (Virtual Term era t
x PDoc
y Lens' r t
l) = forall era t root.
Term era t -> PDoc -> Lens' root t -> RootTarget era root t
Virtual (forall era t. Subst era -> Term era t -> Term era t
substTerm Subst era
sub Term era t
x) PDoc
y Lens' r t
l
simplify :: Term era t -> Typed t
simplify :: forall era t. Term era t -> Typed t
simplify (Lit Rep era t
_ t
x) = forall (f :: * -> *) a. Applicative f => a -> f a
pure t
x
simplify (Dom (Lit Rep era (Map a b)
_ Map a b
x)) = forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall k a. Map k a -> Set k
Map.keysSet Map a b
x)
simplify (Dom (ProjM Lens' b t
_ Rep era t
_ Term era (Map a b)
t)) = forall era t. Term era t -> Typed t
simplify (forall s era a. Ord s => Term era (Map s a) -> Term era (Set s)
Dom Term era (Map a b)
t)
simplify (Dom Term era (Map a b)
x) = do
Map a b
m <- forall era t. Term era t -> Typed t
simplify Term era (Map a b)
x
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall k a. Map k a -> Set k
Map.keysSet Map a b
m)
simplify (Rng (Lit Rep era (Map a b)
_ Map a b
x)) = forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a. Ord a => [a] -> Set a
Set.fromList (forall k a. Map k a -> [a]
Map.elems Map a b
x))
simplify (Rng (ProjM Lens' b t
l Rep era t
_ (Lit Rep era (Map a b)
_ Map a b
m))) = forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a. Ord a => [a] -> Set a
Set.fromList (forall k a. Map k a -> [a]
Map.elems (forall a b k. (a -> b) -> Map k a -> Map k b
Map.map (\b
x -> b
x forall s a. s -> Getting a s a -> a
^. Lens' b t
l) Map a b
m)))
simplify (Rng Term era (Map a b)
x) = do
Map a b
m <- forall era t. Term era t -> Typed t
simplify Term era (Map a b)
x
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a. Ord a => [a] -> Set a
Set.fromList (forall k a. Map k a -> [a]
Map.elems Map a b
m))
simplify (Elems (Lit Rep era (Map a b)
_ Map a b
x)) = forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall k a. Map k a -> [a]
Map.elems Map a b
x)
simplify (Elems (ProjM Lens' b t
l Rep era t
_ (Lit Rep era (Map a b)
_ Map a b
m))) = forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall k a. Map k a -> [a]
Map.elems (forall a b k. (a -> b) -> Map k a -> Map k b
Map.map (\b
x -> b
x forall s a. s -> Getting a s a -> a
^. Lens' b t
l) Map a b
m))
simplify (Elems Term era (Map a b)
x) = do
Map a b
m <- forall era t. Term era t -> Typed t
simplify Term era (Map a b)
x
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall k a. Map k a -> [a]
Map.elems Map a b
m)
simplify (ProjM Lens' b t
l Rep era t
_ (Lit Rep era (Map a b)
_ Map a b
x)) = forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a b k. (a -> b) -> Map k a -> Map k b
Map.map (\b
z -> b
z forall s a. s -> Getting a s a -> a
^. Lens' b t
l) Map a b
x)
simplify (ProjM Lens' b t
l Rep era t
_ Term era (Map a b)
t) = do
Map a b
m <- forall era t. Term era t -> Typed t
simplify Term era (Map a b)
t
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a b k. (a -> b) -> Map k a -> Map k b
Map.map (\b
z -> b
z forall s a. s -> Getting a s a -> a
^. Lens' b t
l) Map a b
m)
simplify (ProjS Lens' b t
l Rep era t
_ (Lit Rep era (Set b)
_ Set b
x)) = forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map (\b
z -> b
z forall s a. s -> Getting a s a -> a
^. Lens' b t
l) Set b
x)
simplify (ProjS Lens' b t
l Rep era t
_ Term era (Set b)
t) = do
Set b
s <- forall era t. Term era t -> Typed t
simplify Term era (Set b)
t
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map (\b
z -> b
z forall s a. s -> Getting a s a -> a
^. Lens' b t
l) Set b
s)
simplify (Proj Lens' b t
l Rep era t
_ (Lit Rep era b
_ b
x)) = forall (f :: * -> *) a. Applicative f => a -> f a
pure (b
x forall s a. s -> Getting a s a -> a
^. Lens' b t
l)
simplify (Proj Lens' b t
l Rep era t
_ Term era b
t) = do
b
s <- forall era t. Term era t -> Typed t
simplify Term era b
t
forall (f :: * -> *) a. Applicative f => a -> f a
pure (b
s forall s a. s -> Getting a s a -> a
^. Lens' b t
l)
simplify (Delta (Lit Rep era Coin
CoinR (Coin Integer
n))) = forall (f :: * -> *) a. Applicative f => a -> f a
pure (Integer -> DeltaCoin
DeltaCoin Integer
n)
simplify (Negate (Lit Rep era DeltaCoin
DeltaCoinR (DeltaCoin Integer
n))) = forall (f :: * -> *) a. Applicative f => a -> f a
pure (Integer -> DeltaCoin
DeltaCoin (-Integer
n))
simplify (Restrict Term era (Set a)
s Term era (Map a b)
m) = do
Set a
sv <- forall era t. Term era t -> Typed t
simplify Term era (Set a)
s
Map a b
mv <- forall era t. Term era t -> Typed t
simplify Term era (Map a b)
m
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall k a. Ord k => Map k a -> Set k -> Map k a
Map.restrictKeys Map a b
mv Set a
sv)
simplify (HashS Term era (ScriptF era)
s) = do
ScriptF Proof era
_ Script era
sv <- forall era t. Term era t -> Typed t
simplify Term era (ScriptF era)
s
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall era. EraScript era => Script era -> ScriptHash
hashScript Script era
sv)
simplify (HashD Term era (Data era)
s) = do
Data era
sv <- forall era t. Term era t -> Typed t
simplify Term era (Data era)
s
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall era. Data era -> SafeHash EraIndependentData
hashData Data era
sv)
simplify (Pair Term era a
s Term era b
m) = do
a
sv <- forall era t. Term era t -> Typed t
simplify Term era a
s
b
mv <- forall era t. Term era t -> Typed t
simplify Term era b
m
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a
sv, b
mv)
simplify Term era t
x = forall a. [[Char]] -> Typed a
failT [[Char]
"Can't simplify term: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era t
x forall a. [a] -> [a] -> [a]
++ [Char]
", to a value."]
simplifySum :: Sum era c -> Typed c
simplifySum :: forall era c. Sum era c -> Typed c
simplifySum (One (Lit Rep era c
_ c
x)) = forall (f :: * -> *) a. Applicative f => a -> f a
pure c
x
simplifySum (One (Delta (Lit Rep era Coin
CoinR (Coin Integer
n)))) = forall (f :: * -> *) a. Applicative f => a -> f a
pure (Integer -> DeltaCoin
DeltaCoin Integer
n)
simplifySum (One (Negate (Lit Rep era DeltaCoin
DeltaCoinR (DeltaCoin Integer
n)))) = forall (f :: * -> *) a. Applicative f => a -> f a
pure (Integer -> DeltaCoin
DeltaCoin (-Integer
n))
simplifySum (ProjOne Lens' x c
l Rep era c
_ (Lit Rep era x
_ x
x)) = forall (f :: * -> *) a. Applicative f => a -> f a
pure (x
x forall s a. s -> Getting a s a -> a
^. Lens' x c
l)
simplifySum (SumMap (Lit Rep era (Map a c)
_ Map a c
m)) = forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a b k. (a -> b -> a) -> a -> Map k b -> a
Map.foldl' forall x. Adds x => x -> x -> x
add forall x. Adds x => x
zero Map a c
m)
simplifySum (SumList (Lit Rep era [c]
_ [c]
m)) = forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' forall x. Adds x => x -> x -> x
add forall x. Adds x => x
zero [c]
m)
simplifySum (ProjMap Rep era c
_ Lens' x c
l (Lit Rep era (Map a x)
_ Map a x
m)) = forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' (\c
ans x
x -> forall x. Adds x => x -> x -> x
add c
ans (x
x forall s a. s -> Getting a s a -> a
^. Lens' x c
l)) forall x. Adds x => x
zero Map a x
m)
simplifySum Sum era c
x = forall a. [[Char]] -> Typed a
failT [[Char]
"Can't simplify Sum: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Sum era c
x forall a. [a] -> [a] -> [a]
++ [Char]
", to a value."]
simplifyTarget :: forall era t root. RootTarget era root t -> Typed t
simplifyTarget :: forall era t root. RootTarget era root t -> Typed t
simplifyTarget (Invert [Char]
_ TypeRep root
_ a -> b
f) = forall (f :: * -> *) a. Applicative f => a -> f a
pure a -> b
f
simplifyTarget (Shift RootTarget era root2 t
x Lens' root root2
_) = forall era t root. RootTarget era root t -> Typed t
simplifyTarget RootTarget era root2 t
x
simplifyTarget (Mask RootTarget era r t
x) = forall era t root. RootTarget era root t -> Typed t
simplifyTarget RootTarget era r t
x
simplifyTarget (Virtual Term era t
x PDoc
_ Lens' root t
_) = forall era t. Term era t -> Typed t
simplify Term era t
x
simplifyTarget (Simple Term era t
t) = forall era t. Term era t -> Typed t
simplify Term era t
t
simplifyTarget (Lensed Term era t
t SimpleGetter root t
_) = forall era t. Term era t -> Typed t
simplify Term era t
t
simplifyTarget (Partial Term era t
t root -> Maybe t
_) = forall era t. Term era t -> Typed t
simplify Term era t
t
simplifyTarget (Constr [Char]
_ a -> b
f) = forall (f :: * -> *) a. Applicative f => a -> f a
pure a -> b
f
simplifyTarget (RootTarget era root (a -> t)
x :$ RootTarget era root a
y) = do
a -> t
f <- forall era t root. RootTarget era root t -> Typed t
simplifyTarget RootTarget era root (a -> t)
x
a
z <- forall era t root. RootTarget era root t -> Typed t
simplifyTarget RootTarget era root a
y
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> t
f a
z)
runTerm :: Env era -> Term era t -> Typed t
runTerm :: forall era t. Env era -> Term era t -> Typed t
runTerm Env era
_ (Lit Rep era t
_ t
x) = forall (f :: * -> *) a. Applicative f => a -> f a
pure t
x
runTerm Env era
env (Dom Term era (Map a b)
x) = forall k a. Map k a -> Set k
Map.keysSet forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Map a b)
x
runTerm Env era
env (Rng Term era (Map a b)
x) = forall a. Ord a => [a] -> Set a
Set.fromList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k a. Map k a -> [a]
Map.elems forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Map a b)
x
runTerm Env era
env (Elems Term era (Map a b)
x) = forall k a. Map k a -> [a]
Map.elems forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Map a b)
x
runTerm Env era
env (Var V era t
v) = forall era t. V era t -> Env era -> Typed t
findVar V era t
v Env era
env
runTerm Env era
env (ProjM Lens' b t
l Rep era t
_ Term era (Map a b)
x) = do
Map a b
m <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Map a b)
x
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a b k. (a -> b) -> Map k a -> Map k b
Map.map (\b
z -> b
z forall s a. s -> Getting a s a -> a
^. Lens' b t
l) Map a b
m)
runTerm Env era
env (ProjS Lens' b t
l Rep era t
_ Term era (Set b)
x) = do
Set b
m <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Set b)
x
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall b a. Ord b => (a -> b) -> Set a -> Set b
Set.map (\b
z -> b
z forall s a. s -> Getting a s a -> a
^. Lens' b t
l) Set b
m)
runTerm Env era
env (Proj Lens' b t
l Rep era t
_ Term era b
x) = do
b
m <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era b
x
forall (f :: * -> *) a. Applicative f => a -> f a
pure (b
m forall s a. s -> Getting a s a -> a
^. Lens' b t
l)
runTerm Env era
env (Delta Term era Coin
x) = do
Coin Integer
n <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era Coin
x
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Integer -> DeltaCoin
DeltaCoin Integer
n)
runTerm Env era
env (Negate Term era DeltaCoin
x) = do
DeltaCoin Integer
n <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era DeltaCoin
x
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Integer -> DeltaCoin
DeltaCoin (-Integer
n))
runTerm Env era
env (Restrict Term era (Set a)
s Term era (Map a b)
m) = do
Set a
sv <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Set a)
s
Map a b
mv <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Map a b)
m
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall k a. Ord k => Map k a -> Set k -> Map k a
Map.restrictKeys Map a b
mv Set a
sv)
runTerm Env era
env (HashD Term era (Data era)
x) = do
Data era
s <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Data era)
x
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall era. Data era -> SafeHash EraIndependentData
hashData Data era
s)
runTerm Env era
env (HashS Term era (ScriptF era)
x) = do
ScriptF Proof era
_ Script era
s <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (ScriptF era)
x
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall era. EraScript era => Script era -> ScriptHash
hashScript Script era
s)
runTerm Env era
env (Pair Term era a
s Term era b
m) =
do
a
sv <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era a
s
b
mv <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era b
m
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a
sv, b
mv)
runTarget :: Env era -> RootTarget era x t -> Typed t
runTarget :: forall era x t. Env era -> RootTarget era x t -> Typed t
runTarget Env era
_ (Invert [Char]
_ TypeRep x
_ a -> b
f) = forall (f :: * -> *) a. Applicative f => a -> f a
pure a -> b
f
runTarget Env era
env (Simple Term era t
t) = forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era t
t
runTarget Env era
env (Lensed Term era t
t SimpleGetter x t
_) = forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era t
t
runTarget Env era
env (Partial Term era t
t x -> Maybe t
_) = forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era t
t
runTarget Env era
env (Shift RootTarget era root2 t
x Lens' x root2
_) = forall era x t. Env era -> RootTarget era x t -> Typed t
runTarget Env era
env RootTarget era root2 t
x
runTarget Env era
env (Mask RootTarget era r t
x) = forall era x t. Env era -> RootTarget era x t -> Typed t
runTarget Env era
env RootTarget era r t
x
runTarget Env era
env (Virtual Term era t
x PDoc
_ Lens' x t
_) = forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era t
x
runTarget Env era
_ (Constr [Char]
_ a -> b
f) = forall (f :: * -> *) a. Applicative f => a -> f a
pure a -> b
f
runTarget Env era
env (RootTarget era x (a -> t)
x :$ RootTarget era x a
y) = do
a -> t
f <- forall era x t. Env era -> RootTarget era x t -> Typed t
runTarget Env era
env RootTarget era x (a -> t)
x
a
z <- forall era x t. Env era -> RootTarget era x t -> Typed t
runTarget Env era
env RootTarget era x a
y
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> t
f a
z)
getTarget :: forall era root t. root -> RootTarget era root t -> Env era -> Env era
getTarget :: forall era root t.
root -> RootTarget era root t -> Env era -> Env era
getTarget root
root (Lensed (Var V era t
v) SimpleGetter root t
l) Env era
env = forall era t. V era t -> t -> Env era -> Env era
storeVar V era t
v (root
root forall s a. s -> Getting a s a -> a
^. SimpleGetter root t
l) Env era
env
getTarget root
_ (Lensed Term era t
_ SimpleGetter root t
_) Env era
env = Env era
env
getTarget root
root (Partial (Var V era t
v) root -> Maybe t
f) Env era
env =
case root -> Maybe t
f root
root of
Just t
val -> forall era t. V era t -> t -> Env era -> Env era
storeVar V era t
v t
val Env era
env
Maybe t
Nothing ->
forall a. HasCallStack => [Char] -> a
error
( [Char]
"A Partial RootTarget returned Nothing: "
forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show V era t
v
forall a. [a] -> [a] -> [a]
++ [Char]
"\n Maybe use 'targetMaybeEnv' instead of 'getTarget' "
)
getTarget root
_ (Partial Term era t
_ root -> Maybe t
_) Env era
env = Env era
env
getTarget root
root (RootTarget era root (a -> t)
x :$ RootTarget era root a
y) Env era
env = forall era root t.
root -> RootTarget era root t -> Env era -> Env era
getTarget root
root RootTarget era root (a -> t)
x (forall era root t.
root -> RootTarget era root t -> Env era -> Env era
getTarget root
root RootTarget era root a
y Env era
env)
getTarget root
root (Shift RootTarget era root2 t
x Lens' root root2
l) Env era
env = forall era root t.
root -> RootTarget era root t -> Env era -> Env era
getTarget (root
root forall s a. s -> Getting a s a -> a
^. Lens' root root2
l) RootTarget era root2 t
x Env era
env
getTarget root
_ (Invert [Char]
_ TypeRep root
_ a -> b
_) Env era
env = Env era
env
getTarget root
_ (Constr [Char]
_ a -> b
_) Env era
env = Env era
env
getTarget root
_ (Simple Term era t
_) Env era
env = Env era
env
getTarget root
_ (Mask RootTarget era r t
_) Env era
env = Env era
env
getTarget root
root (Virtual (Var V era t
v) PDoc
_ Lens' root t
l) Env era
env = forall era t. V era t -> t -> Env era -> Env era
storeVar V era t
v (root
root forall s a. s -> Getting a s a -> a
^. Lens' root t
l) Env era
env
getTarget root
_ (Virtual {}) Env era
env = Env era
env
targetMaybeEnv :: forall era root t. root -> RootTarget era root t -> Env era -> Maybe (Env era)
targetMaybeEnv :: forall era root t.
root -> RootTarget era root t -> Env era -> Maybe (Env era)
targetMaybeEnv root
root (Lensed (Var V era t
v) SimpleGetter root t
l) Env era
env = forall a. a -> Maybe a
Just (forall era t. V era t -> t -> Env era -> Env era
storeVar V era t
v (root
root forall s a. s -> Getting a s a -> a
^. SimpleGetter root t
l) Env era
env)
targetMaybeEnv root
root (Virtual (Var V era t
v) PDoc
_ Lens' root t
l) Env era
env = forall a. a -> Maybe a
Just (forall era t. V era t -> t -> Env era -> Env era
storeVar V era t
v (root
root forall s a. s -> Getting a s a -> a
^. Lens' root t
l) Env era
env)
targetMaybeEnv root
root (Shift RootTarget era root2 t
x Lens' root root2
l) Env era
env = forall era root t.
root -> RootTarget era root t -> Env era -> Maybe (Env era)
targetMaybeEnv (root
root forall s a. s -> Getting a s a -> a
^. Lens' root root2
l) RootTarget era root2 t
x Env era
env
targetMaybeEnv root
root (Partial (Var V era t
v) root -> Maybe t
f) Env era
env =
case root -> Maybe t
f root
root of
Just t
val -> forall a. a -> Maybe a
Just (forall era t. V era t -> t -> Env era -> Env era
storeVar V era t
v t
val Env era
env)
Maybe t
Nothing -> forall a. Maybe a
Nothing
targetMaybeEnv root
root (RootTarget era root (a -> t)
x :$ RootTarget era root a
y) Env era
env =
forall era root t.
root -> RootTarget era root t -> Env era -> Maybe (Env era)
targetMaybeEnv root
root RootTarget era root a
y Env era
env forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall era root t.
root -> RootTarget era root t -> Env era -> Maybe (Env era)
targetMaybeEnv root
root RootTarget era root (a -> t)
x
targetMaybeEnv root
_ RootTarget era root t
_ Env era
_ = forall a. Maybe a
Nothing
runPred :: Env era -> Pred era -> Typed Bool
runPred :: forall era. Env era -> Pred era -> Typed Bool
runPred Env era
env (MetaSize Size
w Term era Size
x) = do
Size
sz <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era Size
x
case Size
sz of
SzExact Int
n -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ Int -> Size -> Bool
runSize Int
n Size
w
Size
_ -> forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ Bool
False
runPred Env era
env (Sized Term era Size
szt Term era t
tt) = do
Size
sz <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era Size
szt
t
t <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era t
tt
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ Int -> Size -> Bool
runSize (forall t. Sizeable t => t -> Int
getSize t
t) Size
sz
runPred Env era
env (Term era a
x :=: Term era a
y) = do
a
x2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era a
x
a
y2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era a
y
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a
x2 forall a. Eq a => a -> a -> Bool
== a
y2)
runPred Env era
env (Disjoint Term era (Set a)
x Term era (Set a)
y) = do
Set a
x2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Set a)
x
Set a
y2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Set a)
y
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a. Ord a => Set a -> Set a -> Bool
Set.disjoint Set a
x2 Set a
y2)
runPred Env era
env (Subset Term era (Set a)
x Term era (Set a)
y) = do
Set a
x2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Set a)
x
Set a
y2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Set a)
y
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a. Ord a => Set a -> Set a -> Bool
Set.isSubsetOf Set a
x2 Set a
y2)
runPred Env era
env (SumsTo Direct c
_ Term era c
x OrdCond
cond [Sum era c]
ys) = do
c
x2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era c
x
[c]
is <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall era c. Env era -> Sum era c -> Typed c
runSum Env era
env) [Sum era c]
ys
let y2 :: c
y2 = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' forall x. Adds x => x -> x -> x
add forall x. Adds x => x
zero [c]
is
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall x. Adds x => OrdCond -> x -> x -> Bool
runOrdCondition OrdCond
cond c
x2 c
y2)
runPred Env era
env (SumSplit c
_ Term era c
x OrdCond
cond [Sum era c]
ys) = do
c
x2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era c
x
[c]
is <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall era c. Env era -> Sum era c -> Typed c
runSum Env era
env) [Sum era c]
ys
let y2 :: c
y2 = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' forall x. Adds x => x -> x -> x
add forall x. Adds x => x
zero [c]
is
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall x. Adds x => OrdCond -> x -> x -> Bool
runOrdCondition OrdCond
cond c
x2 c
y2)
runPred Env era
_ (Random Term era t
_) = forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
runPred Env era
env (Component Direct (Term era t)
t [AnyF era t]
cs) = do
t
t' <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env (forall a. Direct a -> a
direct Direct (Term era t)
t)
forall (t :: * -> *). Foldable t => t Bool -> Bool
and forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall era s. Env era -> s -> AnyF era s -> Typed Bool
runComp Env era
env t
t') [AnyF era t]
cs
runPred Env era
env (CanFollow Term era n
x Term era n
y) = do
n
x2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era n
x
n
y2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era n
y
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall t. Count t => t -> t -> Bool
canFollow n
x2 n
y2)
runPred Env era
env (Member Direct (Term era a)
x Term era (Set a)
y) = do
a
x2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env (forall a. Direct a -> a
direct Direct (Term era a)
x)
Set a
y2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Set a)
y
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a. Ord a => a -> Set a -> Bool
Set.member a
x2 Set a
y2)
runPred Env era
env (NotMember Term era a
x Term era (Set a)
y) = do
a
x2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era a
x
Set a
y2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Set a)
y
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a. Ord a => a -> Set a -> Bool
Set.notMember a
x2 Set a
y2)
runPred Env era
env (MapMember Term era k
k Term era v
v Direct (Term era (Map k v))
m) = do
k
k' <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era k
k
v
v' <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era v
v
Map k v
m' <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env (forall a. Direct a -> a
direct Direct (Term era (Map k v))
m)
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall k a. (Ord k, Eq a) => Map k a -> Map k a -> Bool
Map.isSubmapOf (forall k a. k -> a -> Map k a
Map.singleton k
k' v
v') Map k v
m'
runPred Env era
env (Term era t
x :<-: RootTarget era r t
y) = do
t
_x2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era t
x
t
_y2 <- forall era x t. Env era -> RootTarget era x t -> Typed t
runTarget Env era
env RootTarget era r t
y
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
runPred Env era
env (GenFrom Term era t
x RootTarget era r (Gen t)
y) = do
t
_x2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era t
x
Gen t
_y2 <- forall era x t. Env era -> RootTarget era x t -> Typed t
runTarget Env era
env RootTarget era r (Gen t)
y
forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
runPred Env era
env (List Term era fs
x [Term era t]
y) = do
fs
x2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era fs
x
[t]
y2 <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env) [Term era t]
y
forall (f :: * -> *) a. Applicative f => a -> f a
pure (fs
x2 forall a. Eq a => a -> a -> Bool
== forall ts a. FromList ts a => [a] -> ts
makeFromList [t]
y2)
runPred Env era
env (Maybe Term era (Maybe t)
x RootTarget era r t
tar [Pred era]
ps) = do
Maybe t
m <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Maybe t)
x
case Maybe t
m of
Maybe t
Nothing -> forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
(Just t
y) -> do
[Bool]
ans <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall era. Env era -> Pred era -> Typed Bool
runPred (forall era r t. RootTarget era r t -> t -> Env era -> Env era
bind RootTarget era r t
tar t
y Env era
env)) [Pred era]
ps
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall (t :: * -> *). Foldable t => t Bool -> Bool
and [Bool]
ans)
runPred Env era
_ (Choose Term era Size
_ Term era [t]
_ [(Int, Target era t, [Pred era])]
_) = forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
runPred Env era
env (ForEach Term era Size
_sz Term era fs
term Pat era t
pat [Pred era]
ps) = do
[t]
ts <- forall ts a. FromList ts a => ts -> [a]
getList forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era fs
term
[Bool]
bs <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (\t
t -> forall era. Env era -> [Pred era] -> Typed Bool
runPreds (forall t era. t -> Env era -> Pat era t -> Env era
bindPat t
t Env era
env Pat era t
pat) (forall a. (a -> Bool) -> [a] -> [a]
filter (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall era t. Pat era t -> Pred era -> Bool
extendableSumsTo Pat era t
pat) [Pred era]
ps)) [t]
ts
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall (t :: * -> *). Foldable t => t Bool -> Bool
and [Bool]
bs)
runPred Env era
env (SubMap Term era (Map k v)
x Term era (Map k v)
y) = do
Map k v
x2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Map k v)
x
Map k v
y2 <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Map k v)
y
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall k a. (Ord k, Eq a) => Map k a -> Map k a -> Bool
Map.isSubmapOf Map k v
x2 Map k v
y2)
runPred Env era
env (If RootTarget era r Bool
t Pred era
x Pred era
y) = do
Bool
b <- forall era x t. Env era -> RootTarget era x t -> Typed t
runTarget Env era
env RootTarget era r Bool
t
if Bool
b
then forall era. Env era -> Pred era -> Typed Bool
runPred Env era
env Pred era
x
else forall era. Env era -> Pred era -> Typed Bool
runPred Env era
env Pred era
y
runPred Env era
_ (Before Term era a
_ Term era b
_) = forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
runPred Env era
env (Oneof Term era t
name [(Int, RootTarget era t t, [Pred era])]
triples) = do
t
root <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era t
name
let firstMatching :: [(Int, RootTarget era t t, [Pred era])] -> Typed Bool
firstMatching [] = forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
False
firstMatching ((Int
_, RootTarget era t t
tar, [Pred era]
ps) : [(Int, RootTarget era t t, [Pred era])]
more) = case forall era root t.
root -> RootTarget era root t -> Env era -> Maybe (Env era)
targetMaybeEnv t
root RootTarget era t t
tar Env era
env of
Maybe (Env era)
Nothing -> [(Int, RootTarget era t t, [Pred era])] -> Typed Bool
firstMatching [(Int, RootTarget era t t, [Pred era])]
more
Just Env era
env2 -> do
[Bool]
qs <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall era. Env era -> Pred era -> Typed Bool
runPred Env era
env2) [Pred era]
ps
if forall (t :: * -> *). Foldable t => t Bool -> Bool
and [Bool]
qs
then forall (f :: * -> *) a. Applicative f => a -> f a
pure Bool
True
else [(Int, RootTarget era t t, [Pred era])] -> Typed Bool
firstMatching [(Int, RootTarget era t t, [Pred era])]
more
[(Int, RootTarget era t t, [Pred era])] -> Typed Bool
firstMatching [(Int, RootTarget era t t, [Pred era])]
triples
runPred Env era
env (ListWhere Term era Size
sz Term era [t]
name RootTarget era t t
target [Pred era]
ps) = do
[t]
xs <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era [t]
name
Size
size <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era Size
sz
let sizeOK :: Bool
sizeOK = Int -> Size -> Bool
runSize (forall (t :: * -> *) a. Foldable t => t a -> Int
length [t]
xs) Size
size
let p :: t -> Typed Bool
p t
x = do
let env2 :: Env era
env2 = forall era root t.
root -> RootTarget era root t -> Env era -> Env era
getTarget t
x RootTarget era t t
target Env era
env
[Bool]
bs <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall era. Env era -> Pred era -> Typed Bool
runPred Env era
env2) [Pred era]
ps
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall (t :: * -> *). Foldable t => t Bool -> Bool
and [Bool]
bs)
[Bool]
bs <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM t -> Typed Bool
p [t]
xs
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ Bool
sizeOK Bool -> Bool -> Bool
&& (forall (t :: * -> *). Foldable t => t Bool -> Bool
and [Bool]
bs)
hashSetToSet :: Ord a => HashSet a -> Set a
hashSetToSet :: forall a. Ord a => HashSet a -> Set a
hashSetToSet HashSet a
x = forall a. Ord a => [a] -> Set a
Set.fromList (forall a. HashSet a -> [a]
HashSet.toList HashSet a
x)
hashSetDisjoint :: Hashable a => HashSet a -> HashSet a -> Bool
hashSetDisjoint :: forall a. Hashable a => HashSet a -> HashSet a -> Bool
hashSetDisjoint HashSet a
x HashSet a
y = forall a. HashSet a -> Bool
HashSet.null (forall a. Eq a => HashSet a -> HashSet a -> HashSet a
HashSet.intersection HashSet a
x HashSet a
y)
extendableSumsTo :: Pat era t -> Pred era -> Bool
extendableSumsTo :: forall era t. Pat era t -> Pred era -> Bool
extendableSumsTo Pat era t
pat (SumsTo Direct c
_ Term era c
t OrdCond
_ [One Term era c
s]) =
forall a. HashSet a -> Int
HashSet.size HashSet (Name era)
boundS forall a. Eq a => a -> a -> Bool
== Int
1 Bool -> Bool -> Bool
&& forall a. (Eq a, Hashable a) => HashSet a -> HashSet a -> Bool
HashSet.isSubsetOf HashSet (Name era)
boundS HashSet (Name era)
free Bool -> Bool -> Bool
&& forall a. Hashable a => HashSet a -> HashSet a -> Bool
hashSetDisjoint HashSet (Name era)
boundT HashSet (Name era)
free
where
free :: HashSet (Name era)
free = forall era t. HashSet (Name era) -> Pat era t -> HashSet (Name era)
varsOfPat forall a. HashSet a
HashSet.empty Pat era t
pat
boundS :: HashSet (Name era)
boundS = forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm forall a. HashSet a
HashSet.empty Term era c
s
boundT :: HashSet (Name era)
boundT = forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm forall a. HashSet a
HashSet.empty Term era c
t
extendableSumsTo Pat era t
pat (SumSplit c
_ Term era c
t OrdCond
_ [One Term era c
s]) =
forall a. HashSet a -> Int
HashSet.size HashSet (Name era)
boundS forall a. Eq a => a -> a -> Bool
== Int
1 Bool -> Bool -> Bool
&& forall a. (Eq a, Hashable a) => HashSet a -> HashSet a -> Bool
HashSet.isSubsetOf HashSet (Name era)
boundS HashSet (Name era)
free Bool -> Bool -> Bool
&& forall a. Hashable a => HashSet a -> HashSet a -> Bool
hashSetDisjoint HashSet (Name era)
boundT HashSet (Name era)
free
where
free :: HashSet (Name era)
free = forall era t. HashSet (Name era) -> Pat era t -> HashSet (Name era)
varsOfPat forall a. HashSet a
HashSet.empty Pat era t
pat
boundS :: HashSet (Name era)
boundS = forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm forall a. HashSet a
HashSet.empty Term era c
s
boundT :: HashSet (Name era)
boundT = forall era t.
HashSet (Name era) -> Term era t -> HashSet (Name era)
varsOfTerm forall a. HashSet a
HashSet.empty Term era c
t
extendableSumsTo Pat era t
_ Pred era
_ = Bool
False
runPreds :: Env era -> [Pred era] -> Typed Bool
runPreds :: forall era. Env era -> [Pred era] -> Typed Bool
runPreds Env era
env [Pred era]
ps = do
[Bool]
bs <- forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall era. Env era -> Pred era -> Typed Bool
runPred Env era
env) [Pred era]
ps
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall (t :: * -> *). Foldable t => t Bool -> Bool
and [Bool]
bs)
bind :: RootTarget era r t -> t -> Env era -> Env era
bind :: forall era r t. RootTarget era r t -> t -> Env era -> Env era
bind (Simple (Var V era t
v)) t
x Env era
env = forall era t. V era t -> t -> Env era -> Env era
storeVar V era t
v t
x Env era
env
bind (Lensed (Var V era t
v) SimpleGetter r t
_) t
x Env era
env = forall era t. V era t -> t -> Env era -> Env era
storeVar V era t
v t
x Env era
env
bind RootTarget era r t
t t
_ Env era
_ = forall a. HasCallStack => [Char] -> a
error ([Char]
"Non simple Target in bind: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show RootTarget era r t
t)
runComp :: Env era -> s -> AnyF era s -> Typed Bool
runComp :: forall era s. Env era -> s -> AnyF era s -> Typed Bool
runComp Env era
env s
t (AnyF (Field [Char]
n Rep era t
rt Rep era s
rx Lens' s t
l)) = do
t
t' <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env forall a b. (a -> b) -> a -> b
$ forall era t. V era t -> Term era t
Var (forall era t s.
Era era =>
[Char] -> Rep era t -> Access era s t -> V era t
V [Char]
n Rep era t
rt (forall era s t. Rep era s -> Lens' s t -> Access era s t
Yes Rep era s
rx Lens' s t
l))
With s t1
_ <- forall era t (s :: * -> *).
Rep era t -> s t -> Typed (HasConstraint Eq (s t))
hasEq Rep era t
rt Rep era t
rt
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ s
t forall s a. s -> Getting a s a -> a
^. Lens' s t
l forall a. Eq a => a -> a -> Bool
== t
t'
runComp Env era
_ s
t (AnyF (FConst Rep era t
r t
v Rep era s
_ Lens' s t
l)) = do
With s t1
_ <- forall era t (s :: * -> *).
Rep era t -> s t -> Typed (HasConstraint Eq (s t))
hasEq Rep era t
r Rep era t
r
forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ s
t forall s a. s -> Getting a s a -> a
^. Lens' s t
l forall a. Eq a => a -> a -> Bool
== t
v
termRep :: Era era => Term era t -> Rep era t
termRep :: forall era t. Era era => Term era t -> Rep era t
termRep (Lit Rep era t
r t
_) = Rep era t
r
termRep (Var (V [Char]
_ Rep era t
r Access era s t
_)) = Rep era t
r
termRep (Dom (forall era t. Era era => Term era t -> Rep era t
termRep -> MapR Rep era a
r Rep era b
_)) = forall a era. Ord a => Rep era a -> Rep era (Set a)
SetR Rep era a
r
termRep (Rng (forall era t. Era era => Term era t -> Rep era t
termRep -> MapR Rep era a
_ Rep era b
r)) = forall a era. Ord a => Rep era a -> Rep era (Set a)
SetR Rep era b
r
termRep (Elems (forall era t. Era era => Term era t -> Rep era t
termRep -> MapR Rep era a
_ Rep era b
r)) = forall era a. Rep era a -> Rep era [a]
ListR Rep era b
r
termRep (ProjM Lens' b t
_ Rep era t
t (forall era t. Era era => Term era t -> Rep era t
termRep -> MapR Rep era a
a Rep era b
_)) = forall a era b.
Ord a =>
Rep era a -> Rep era b -> Rep era (Map a b)
MapR Rep era a
a Rep era t
t
termRep (ProjS Lens' b t
_ Rep era t
t (forall era t. Era era => Term era t -> Rep era t
termRep -> SetR Rep era a
_)) = forall a era. Ord a => Rep era a -> Rep era (Set a)
SetR Rep era t
t
termRep (Proj Lens' b t
_ Rep era t
t Term era b
_) = Rep era t
t
termRep (Delta Term era Coin
_) = forall era. Rep era DeltaCoin
DeltaCoinR
termRep (Negate Term era DeltaCoin
_) = forall era. Rep era DeltaCoin
DeltaCoinR
termRep (Restrict Term era (Set a)
_ Term era (Map a b)
m) = forall era t. Era era => Term era t -> Rep era t
termRep Term era (Map a b)
m
termRep (HashD Term era (Data era)
_) = forall era. Era era => Rep era (SafeHash EraIndependentData)
DataHashR
termRep (HashS Term era (ScriptF era)
_) = forall era. Era era => Rep era ScriptHash
ScriptHashR
termRep (Pair Term era a
a Term era b
b) = forall era a b. Rep era a -> Rep era b -> Rep era (a, b)
PairR (forall era t. Era era => Term era t -> Rep era t
termRep Term era a
a) (forall era t. Era era => Term era t -> Rep era t
termRep Term era b
b)
runSum :: Env era -> Sum era c -> Typed c
runSum :: forall era c. Env era -> Sum era c -> Typed c
runSum Env era
env (SumMap Term era (Map a c)
t) = forall a b k. (a -> b -> a) -> a -> Map k b -> a
Map.foldl' forall x. Adds x => x -> x -> x
add forall x. Adds x => x
zero forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Map a c)
t
runSum Env era
env (SumList Term era [c]
t) = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' forall x. Adds x => x -> x -> x
add forall x. Adds x => x
zero forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era [c]
t
runSum Env era
env (One Term era c
t) = forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era c
t
runSum Env era
env (ProjOne Lens' x c
l Rep era c
_ Term era x
t) = do
x
x <- forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era x
t
forall (f :: * -> *) a. Applicative f => a -> f a
pure (x
x forall s a. s -> Getting a s a -> a
^. Lens' x c
l)
runSum Env era
env (ProjMap Rep era c
_ Lens' x c
l Term era (Map a x)
t) = forall a b k. (a -> b -> a) -> a -> Map k b -> a
Map.foldl' c -> x -> c
accum forall x. Adds x => x
zero forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era (Map a x)
t
where
accum :: c -> x -> c
accum c
ans x
x = forall x. Adds x => x -> x -> x
add c
ans (x
x forall s a. s -> Getting a s a -> a
^. Lens' x c
l)
makeTest :: Env era -> Pred era -> Typed (String, Bool, Pred era)
makeTest :: forall era. Env era -> Pred era -> Typed ([Char], Bool, Pred era)
makeTest Env era
env Pred era
c = do
Bool
b <- forall era. Env era -> Pred era -> Typed Bool
runPred Env era
env Pred era
c
forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall a. Show a => a -> [Char]
show Pred era
c forall a. [a] -> [a] -> [a]
++ [Char]
" => " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Bool
b, Bool
b, Pred era
c)
displayTerm :: Era era => Env era -> Term era a -> IO ()
displayTerm :: forall era a. Era era => Env era -> Term era a -> IO ()
displayTerm Env era
env (Var v :: V era a
v@(V [Char]
nm Rep era a
rep Access era s a
_)) = do
a
x <- forall (m :: * -> *) t. (HasCallStack, Monad m) => Typed t -> m t
monadTyped (forall era t. V era t -> Env era -> Typed t
findVar V era a
v Env era
env)
[Char] -> IO ()
putStrLn ([Char]
nm forall a. [a] -> [a] -> [a]
++ [Char]
"\n" forall a. [a] -> [a] -> [a]
++ forall e t. Rep e t -> t -> [Char]
format Rep era a
rep a
x)
displayTerm Env era
env Term era a
term = do
a
x <- forall (m :: * -> *) t. (HasCallStack, Monad m) => Typed t -> m t
monadTyped (forall era t. Env era -> Term era t -> Typed t
runTerm Env era
env Term era a
term)
[Char] -> IO ()
putStrLn (forall a. Show a => a -> [Char]
show Term era a
term forall a. [a] -> [a] -> [a]
++ [Char]
"\n" forall a. [a] -> [a] -> [a]
++ forall e t. Rep e t -> t -> [Char]
format (forall era t. Era era => Term era t -> Rep era t
termRep Term era a
term) a
x)
patToAnyF :: Pat era t -> [AnyF era t]
patToAnyF :: forall era t. Pat era t -> [AnyF era t]
patToAnyF (Pat Rep era t
rep [Arg era t]
as) = forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (forall a b. (a -> b) -> [a] -> [b]
map (forall era t. Rep era t -> Arg era t -> [AnyF era t]
argToAnyF Rep era t
rep) [Arg era t]
as)
argToAnyF :: Rep era t -> Arg era t -> [AnyF era t]
argToAnyF :: forall era t. Rep era t -> Arg era t -> [AnyF era t]
argToAnyF Rep era t
_ (Arg Field era t s
f) = [forall era s t. Field era s t -> AnyF era s
AnyF Field era t s
f]
argToAnyF Rep era t
rept (ArgPs f :: Field era t s
f@(Field [Char]
_ Rep era s
_ Rep era t
_ Lens' t s
lensx) [Pat era s]
ps) = forall era s t. Field era s t -> AnyF era s
AnyF Field era t s
f forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map (forall era t s. Rep era t -> Lens' t s -> AnyF era s -> AnyF era t
push Rep era t
rept Lens' t s
lensx) (forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (forall a b. (a -> b) -> [a] -> [b]
map forall era t. Pat era t -> [AnyF era t]
patToAnyF [Pat era s]
ps))
argToAnyF Rep era t
rept (ArgPs f :: Field era t s
f@(FConst Rep era s
_ s
_ Rep era t
_ Lens' t s
lensx) [Pat era s]
ps) = forall era s t. Field era s t -> AnyF era s
AnyF Field era t s
f forall a. a -> [a] -> [a]
: forall a b. (a -> b) -> [a] -> [b]
map (forall era t s. Rep era t -> Lens' t s -> AnyF era s -> AnyF era t
push Rep era t
rept Lens' t s
lensx) (forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (forall a b. (a -> b) -> [a] -> [b]
map forall era t. Pat era t -> [AnyF era t]
patToAnyF [Pat era s]
ps))
push :: Rep era t -> Lens' t s -> AnyF era s -> AnyF era t
push :: forall era t s. Rep era t -> Lens' t s -> AnyF era s -> AnyF era t
push Rep era t
rept Lens' t s
l1 (AnyF (Field [Char]
nm Rep era t
rep Rep era s
_ Lens' s t
l2)) = forall era s t. Field era s t -> AnyF era s
AnyF (forall era t s.
Era era =>
[Char] -> Rep era t -> Rep era s -> Lens' s t -> Field era s t
Field [Char]
nm Rep era t
rep Rep era t
rept (Lens' t s
l1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Lens' s t
l2))
push Rep era t
rept Lens' t s
l1 (AnyF (FConst Rep era t
rep t
x Rep era s
_ Lens' s t
l2)) = forall era s t. Field era s t -> AnyF era s
AnyF (forall era t s.
Rep era t -> t -> Rep era s -> Lens' s t -> Field era s t
FConst Rep era t
rep t
x Rep era t
rept (Lens' t s
l1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. Lens' s t
l2))
data Pat era t where
Pat :: !(Rep era t) -> ![Arg era t] -> Pat era t
data Arg era t where
ArgPs :: !(Field era t s) -> ![Pat era s] -> Arg era t
Arg :: !(Field era t s) -> Arg era t
patt :: Rep era t1 -> Term era t2 -> Pat era t1
patt :: forall era t1 t2. Rep era t1 -> Term era t2 -> Pat era t1
patt Rep era t1
rep Term era t2
term = forall era t. Rep era t -> [Arg era t] -> Pat era t
Pat Rep era t1
rep [forall era s t. Rep era s -> Term era t -> Arg era s
arg Rep era t1
rep Term era t2
term]
instance Show (Pat era t) where
show :: Pat era t -> [Char]
show (Pat Rep era t
r [Arg era t]
xs) = [Char]
"Pat " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Rep era t
r forall a. [a] -> [a] -> [a]
++ [Char]
" " forall a. [a] -> [a] -> [a]
++ forall t. (t -> [Char]) -> [Char] -> [t] -> [Char]
showL forall a. Show a => a -> [Char]
show [Char]
", " [Arg era t]
xs
instance Show (Arg era t) where
show :: Arg era t -> [Char]
show (Arg (Field [Char]
nm Rep era s
_ Rep era t
_ Lens' t s
_)) = [Char]
nm
show (Arg f :: Field era t s
f@(FConst Rep era s
_ s
_ Rep era t
_ Lens' t s
_)) = forall a. Show a => a -> [Char]
show Field era t s
f
show (ArgPs (Field [Char]
nm Rep era s
_ Rep era t
_ Lens' t s
_) [Pat era s]
qs) = [Char]
nm forall a. [a] -> [a] -> [a]
++ [Char]
" [" forall a. [a] -> [a] -> [a]
++ forall t. (t -> [Char]) -> [Char] -> [t] -> [Char]
showL forall a. Show a => a -> [Char]
show [Char]
", " [Pat era s]
qs forall a. [a] -> [a] -> [a]
++ [Char]
"]"
show (ArgPs f :: Field era t s
f@(FConst Rep era s
_ s
_ Rep era t
_ Lens' t s
_) [Pat era s]
qs) = forall a. Show a => a -> [Char]
show Field era t s
f forall a. [a] -> [a] -> [a]
++ [Char]
" [" forall a. [a] -> [a] -> [a]
++ forall t. (t -> [Char]) -> [Char] -> [t] -> [Char]
showL forall a. Show a => a -> [Char]
show [Char]
", " [Pat era s]
qs forall a. [a] -> [a] -> [a]
++ [Char]
"]"
varsOfField :: HashSet (Name era) -> Field era s t -> HashSet (Name era)
varsOfField :: forall era s t.
HashSet (Name era) -> Field era s t -> HashSet (Name era)
varsOfField HashSet (Name era)
l (Field [Char]
n Rep era t
r Rep era s
rx Lens' s t
l2) = forall a. (Eq a, Hashable a) => a -> HashSet a -> HashSet a
HashSet.insert (forall era t. V era t -> Name era
Name forall a b. (a -> b) -> a -> b
$ forall era t s.
Era era =>
[Char] -> Rep era t -> Access era s t -> V era t
V [Char]
n Rep era t
r (forall era s t. Rep era s -> Lens' s t -> Access era s t
Yes Rep era s
rx Lens' s t
l2)) HashSet (Name era)
l
varsOfField HashSet (Name era)
l (FConst Rep era t
_ t
_ Rep era s
_ Lens' s t
_) = HashSet (Name era)
l
varsOfPat :: HashSet (Name era) -> Pat era t -> HashSet (Name era)
varsOfPat :: forall era t. HashSet (Name era) -> Pat era t -> HashSet (Name era)
varsOfPat HashSet (Name era)
ans (Pat Rep era t
_ [Arg era t]
qs) = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' forall era t. HashSet (Name era) -> Arg era t -> HashSet (Name era)
varsOfArg HashSet (Name era)
ans [Arg era t]
qs
varsOfArg :: HashSet (Name era) -> Arg era t -> HashSet (Name era)
varsOfArg :: forall era t. HashSet (Name era) -> Arg era t -> HashSet (Name era)
varsOfArg HashSet (Name era)
ans (ArgPs Field era t s
f [Pat era s]
qs) = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' forall era t. HashSet (Name era) -> Pat era t -> HashSet (Name era)
varsOfPat (forall era s t.
HashSet (Name era) -> Field era s t -> HashSet (Name era)
varsOfField HashSet (Name era)
ans Field era t s
f) [Pat era s]
qs
varsOfArg HashSet (Name era)
ans (Arg Field era t s
f) = forall era s t.
HashSet (Name era) -> Field era s t -> HashSet (Name era)
varsOfField HashSet (Name era)
ans Field era t s
f
substField :: Subst era -> Field era rec fld -> Field era rec fld
substField :: forall era rec fld.
Subst era -> Field era rec fld -> Field era rec fld
substField Subst era
_ w :: Field era rec fld
w@(FConst Rep era fld
_ fld
_ Rep era rec
_ Lens' rec fld
_) = Field era rec fld
w
substField Subst era
sub w :: Field era rec fld
w@(Field [Char]
n Rep era fld
r Rep era rec
rx Lens' rec fld
l) = case forall era t. Subst era -> V era t -> Term era t
findV Subst era
sub (forall era t s.
Era era =>
[Char] -> Rep era t -> Access era s t -> V era t
V [Char]
n Rep era fld
r (forall era s t. Rep era s -> Lens' s t -> Access era s t
Yes Rep era rec
rx Lens' rec fld
l)) of
(Lit Rep era fld
rep fld
x) -> forall era t s.
Rep era t -> t -> Rep era s -> Lens' s t -> Field era s t
FConst Rep era fld
rep fld
x Rep era rec
rx Lens' rec fld
l
(Var (V [Char]
n2 Rep era fld
r2 Access era s fld
_a2)) -> forall era t s.
Era era =>
[Char] -> Rep era t -> Rep era s -> Lens' s t -> Field era s t
Field [Char]
n2 Rep era fld
r2 Rep era rec
rx Lens' rec fld
l
Term era fld
_ -> Field era rec fld
w
substPat :: Subst era -> Pat era t -> Pat era t
substPat :: forall era t. Subst era -> Pat era t -> Pat era t
substPat Subst era
sub (Pat Rep era t
r [Arg era t]
as) = forall era t. Rep era t -> [Arg era t] -> Pat era t
Pat Rep era t
r (forall a b. (a -> b) -> [a] -> [b]
map (forall era t. Subst era -> Arg era t -> Arg era t
substArg Subst era
sub) [Arg era t]
as)
substArg :: Subst era -> Arg era t -> Arg era t
substArg :: forall era t. Subst era -> Arg era t -> Arg era t
substArg Subst era
sub (ArgPs Field era t s
r [Pat era s]
as) = forall era t s. Field era t s -> [Pat era s] -> Arg era t
ArgPs (forall era rec fld.
Subst era -> Field era rec fld -> Field era rec fld
substField Subst era
sub Field era t s
r) (forall a b. (a -> b) -> [a] -> [b]
map (forall era t. Subst era -> Pat era t -> Pat era t
substPat Subst era
sub) [Pat era s]
as)
substArg Subst era
sub (Arg Field era t s
r) = forall era t s. Field era t s -> Arg era t
Arg (forall era rec fld.
Subst era -> Field era rec fld -> Field era rec fld
substField Subst era
sub Field era t s
r)
bindPat :: t -> Env era -> Pat era t -> Env era
bindPat :: forall t era. t -> Env era -> Pat era t -> Env era
bindPat t
t Env era
env (Pat Rep era t
_ [Arg era t]
as) = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' (forall t era. t -> Env era -> Arg era t -> Env era
bindArg t
t) Env era
env [Arg era t]
as
bindArg :: t -> Env era -> Arg era t -> Env era
bindArg :: forall t era. t -> Env era -> Arg era t -> Env era
bindArg t
_ Env era
env (Arg (FConst Rep era s
_ s
_ Rep era t
_ Lens' t s
_)) = Env era
env
bindArg t
t Env era
env (Arg (Field [Char]
n Rep era s
r Rep era t
rx Lens' t s
l)) = forall era t. V era t -> t -> Env era -> Env era
storeVar (forall era t s.
Era era =>
[Char] -> Rep era t -> Access era s t -> V era t
V [Char]
n Rep era s
r (forall era s t. Rep era s -> Lens' s t -> Access era s t
Yes Rep era t
rx Lens' t s
l)) (t
t forall s a. s -> Getting a s a -> a
^. Lens' t s
l) Env era
env
bindArg t
t Env era
env (ArgPs (FConst Rep era s
_ s
_ Rep era t
_ Lens' t s
l2) [Pat era s]
qs) = forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' (forall t era. t -> Env era -> Pat era t -> Env era
bindPat (t
t forall s a. s -> Getting a s a -> a
^. Lens' t s
l2)) Env era
env [Pat era s]
qs
bindArg t
t Env era
env (ArgPs (Field [Char]
n Rep era s
r Rep era t
rx Lens' t s
l) [Pat era s]
qs) =
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl' (forall t era. t -> Env era -> Pat era t -> Env era
bindPat (t
t forall s a. s -> Getting a s a -> a
^. Lens' t s
l)) (forall era t. V era t -> t -> Env era -> Env era
storeVar (forall era t s.
Era era =>
[Char] -> Rep era t -> Access era s t -> V era t
V [Char]
n Rep era s
r (forall era s t. Rep era s -> Lens' s t -> Access era s t
Yes Rep era t
rx Lens' t s
l)) (t
t forall s a. s -> Getting a s a -> a
^. Lens' t s
l) Env era
env) [Pat era s]
qs
argP :: Rep era s -> Term era t -> [Pat era t] -> Arg era s
argP :: forall era s t. Rep era s -> Term era t -> [Pat era t] -> Arg era s
argP Rep era s
repS1 (Var (V [Char]
name Rep era t
rept (Yes Rep era s
repS2 Lens' s t
ll))) [Pat era t]
qs = case forall {k} (t :: k -> *) (i :: k) (j :: k).
Singleton t =>
t i -> t j -> Maybe (i :~: j)
testEql Rep era s
repS1 Rep era s
repS2 of
Just s :~: s
Refl -> forall era t s. Field era t s -> [Pat era s] -> Arg era t
ArgPs (forall era t s.
Era era =>
[Char] -> Rep era t -> Rep era s -> Lens' s t -> Field era s t
Field [Char]
name Rep era t
rept Rep era s
repS2 Lens' s t
ll) [Pat era t]
qs
Maybe (s :~: s)
Nothing ->
forall a. HasCallStack => [Char] -> a
error
( [[Char]] -> [Char]
unlines
[ [Char]
"In 'argP' the given rep and lens target do not match: "
, [Char]
"rep: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Rep era s
repS1
, [Char]
"lens target: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Rep era s
repS2
]
)
argP Rep era s
_ t :: Term era t
t@(Var V era t
_) [Pat era t]
_ = forall a. HasCallStack => [Char] -> a
error ([Char]
"argP applied to variable term with No access." forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era t
t)
argP Rep era s
_ Term era t
term [Pat era t]
_ = forall a. HasCallStack => [Char] -> a
error ([Char]
"argP can only be applied to variable terms: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era t
term)
arg :: Rep era s -> Term era t -> Arg era s
arg :: forall era s t. Rep era s -> Term era t -> Arg era s
arg Rep era s
repS1 (Var (V [Char]
name Rep era t
rept (Yes Rep era s
repS2 Lens' s t
l))) = case forall {k} (t :: k -> *) (i :: k) (j :: k).
Singleton t =>
t i -> t j -> Maybe (i :~: j)
testEql Rep era s
repS1 Rep era s
repS2 of
Just s :~: s
Refl -> forall era t s. Field era t s -> Arg era t
Arg (forall era t s.
Era era =>
[Char] -> Rep era t -> Rep era s -> Lens' s t -> Field era s t
Field [Char]
name Rep era t
rept Rep era s
repS2 Lens' s t
l)
Maybe (s :~: s)
Nothing ->
forall a. HasCallStack => [Char] -> a
error
( [[Char]] -> [Char]
unlines
[ [Char]
"In 'arg' the given rep and lens target do not match: "
, [Char]
"rep: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Rep era s
repS1
, [Char]
"lens target: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Rep era s
repS2
]
)
arg Rep era s
_ t :: Term era t
t@(Var (V [Char]
_ Rep era t
_ Access era s t
No)) = forall a. HasCallStack => [Char] -> a
error ([Char]
"arg applied to variable term with No access." forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era t
t)
arg Rep era s
_ Term era t
term = forall a. HasCallStack => [Char] -> a
error ([Char]
"arg can only be applied to variable terms: " forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> [Char]
show Term era t
term)