module UVMHS.Lib.Substitution.Substy where
import UVMHS.Core
import UVMHS.Lib.Pretty
import UVMHS.Lib.Parser
import UVMHS.Lib.Shrinky
import UVMHS.Lib.Substitution.Name
import UVMHS.Lib.Substitution.Subst
import UVMHS.Lib.Substitution.SubstElem
import UVMHS.Lib.Substitution.SubstScoped
import UVMHS.Lib.Substitution.SubstSpaced
import UVMHS.Lib.Substitution.UVar
import UVMHS.Lib.Substitution.Var
data FreeVarsAction s e = FreeVarsAction
{ forall s e. FreeVarsAction s e -> s -> UVar s e -> 𝔹
freeVarsActionFilter ∷ s → UVar s e → 𝔹
, forall s e. FreeVarsAction s e -> (s ∧ SName) ⇰ ℕ64
freeVarsActionScope ∷ s ∧ SName ⇰ ℕ64
}
makeLenses ''FreeVarsAction
data RebindAction = ID_RA | AllNameless_RA | AllNamed_RA
deriving (RebindAction -> RebindAction -> 𝔹
(RebindAction -> RebindAction -> 𝔹)
-> (RebindAction -> RebindAction -> 𝔹) -> Eq RebindAction
forall a. (a -> a -> 𝔹) -> (a -> a -> 𝔹) -> Eq a
$c== :: RebindAction -> RebindAction -> 𝔹
== :: RebindAction -> RebindAction -> 𝔹
$c/= :: RebindAction -> RebindAction -> 𝔹
/= :: RebindAction -> RebindAction -> 𝔹
Eq,Eq RebindAction
Eq RebindAction =>
(RebindAction -> RebindAction -> Ordering)
-> (RebindAction -> RebindAction -> 𝔹)
-> (RebindAction -> RebindAction -> 𝔹)
-> (RebindAction -> RebindAction -> 𝔹)
-> (RebindAction -> RebindAction -> 𝔹)
-> (RebindAction -> RebindAction -> RebindAction)
-> (RebindAction -> RebindAction -> RebindAction)
-> Ord RebindAction
RebindAction -> RebindAction -> 𝔹
RebindAction -> RebindAction -> Ordering
RebindAction -> RebindAction -> RebindAction
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> 𝔹)
-> (a -> a -> 𝔹)
-> (a -> a -> 𝔹)
-> (a -> a -> 𝔹)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: RebindAction -> RebindAction -> Ordering
compare :: RebindAction -> RebindAction -> Ordering
$c< :: RebindAction -> RebindAction -> 𝔹
< :: RebindAction -> RebindAction -> 𝔹
$c<= :: RebindAction -> RebindAction -> 𝔹
<= :: RebindAction -> RebindAction -> 𝔹
$c> :: RebindAction -> RebindAction -> 𝔹
> :: RebindAction -> RebindAction -> 𝔹
$c>= :: RebindAction -> RebindAction -> 𝔹
>= :: RebindAction -> RebindAction -> 𝔹
$cmax :: RebindAction -> RebindAction -> RebindAction
max :: RebindAction -> RebindAction -> RebindAction
$cmin :: RebindAction -> RebindAction -> RebindAction
min :: RebindAction -> RebindAction -> RebindAction
Ord,Int -> RebindAction -> ShowS
[RebindAction] -> ShowS
RebindAction -> String
(Int -> RebindAction -> ShowS)
-> (RebindAction -> String)
-> ([RebindAction] -> ShowS)
-> Show RebindAction
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> RebindAction -> ShowS
showsPrec :: Int -> RebindAction -> ShowS
$cshow :: RebindAction -> String
show :: RebindAction -> String
$cshowList :: [RebindAction] -> ShowS
showList :: [RebindAction] -> ShowS
Show)
data SubstAction s e = SubstAction
{ forall s e. SubstAction s e -> RebindAction
substActionRebind ∷ RebindAction
, forall s e. SubstAction s e -> Subst s e
substActionSubst ∷ Subst s e
} deriving (SubstAction s e -> SubstAction s e -> 𝔹
(SubstAction s e -> SubstAction s e -> 𝔹)
-> (SubstAction s e -> SubstAction s e -> 𝔹)
-> Eq (SubstAction s e)
forall a. (a -> a -> 𝔹) -> (a -> a -> 𝔹) -> Eq a
forall s e. (Eq s, Eq e) => SubstAction s e -> SubstAction s e -> 𝔹
$c== :: forall s e. (Eq s, Eq e) => SubstAction s e -> SubstAction s e -> 𝔹
== :: SubstAction s e -> SubstAction s e -> 𝔹
$c/= :: forall s e. (Eq s, Eq e) => SubstAction s e -> SubstAction s e -> 𝔹
/= :: SubstAction s e -> SubstAction s e -> 𝔹
Eq,Eq (SubstAction s e)
Eq (SubstAction s e) =>
(SubstAction s e -> SubstAction s e -> Ordering)
-> (SubstAction s e -> SubstAction s e -> 𝔹)
-> (SubstAction s e -> SubstAction s e -> 𝔹)
-> (SubstAction s e -> SubstAction s e -> 𝔹)
-> (SubstAction s e -> SubstAction s e -> 𝔹)
-> (SubstAction s e -> SubstAction s e -> SubstAction s e)
-> (SubstAction s e -> SubstAction s e -> SubstAction s e)
-> Ord (SubstAction s e)
SubstAction s e -> SubstAction s e -> 𝔹
SubstAction s e -> SubstAction s e -> Ordering
SubstAction s e -> SubstAction s e -> SubstAction s e
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> 𝔹)
-> (a -> a -> 𝔹)
-> (a -> a -> 𝔹)
-> (a -> a -> 𝔹)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall s e. (Ord s, Ord e) => Eq (SubstAction s e)
forall s e.
(Ord s, Ord e) =>
SubstAction s e -> SubstAction s e -> 𝔹
forall s e.
(Ord s, Ord e) =>
SubstAction s e -> SubstAction s e -> Ordering
forall s e.
(Ord s, Ord e) =>
SubstAction s e -> SubstAction s e -> SubstAction s e
$ccompare :: forall s e.
(Ord s, Ord e) =>
SubstAction s e -> SubstAction s e -> Ordering
compare :: SubstAction s e -> SubstAction s e -> Ordering
$c< :: forall s e.
(Ord s, Ord e) =>
SubstAction s e -> SubstAction s e -> 𝔹
< :: SubstAction s e -> SubstAction s e -> 𝔹
$c<= :: forall s e.
(Ord s, Ord e) =>
SubstAction s e -> SubstAction s e -> 𝔹
<= :: SubstAction s e -> SubstAction s e -> 𝔹
$c> :: forall s e.
(Ord s, Ord e) =>
SubstAction s e -> SubstAction s e -> 𝔹
> :: SubstAction s e -> SubstAction s e -> 𝔹
$c>= :: forall s e.
(Ord s, Ord e) =>
SubstAction s e -> SubstAction s e -> 𝔹
>= :: SubstAction s e -> SubstAction s e -> 𝔹
$cmax :: forall s e.
(Ord s, Ord e) =>
SubstAction s e -> SubstAction s e -> SubstAction s e
max :: SubstAction s e -> SubstAction s e -> SubstAction s e
$cmin :: forall s e.
(Ord s, Ord e) =>
SubstAction s e -> SubstAction s e -> SubstAction s e
min :: SubstAction s e -> SubstAction s e -> SubstAction s e
Ord,Int -> SubstAction s e -> ShowS
[SubstAction s e] -> ShowS
SubstAction s e -> String
(Int -> SubstAction s e -> ShowS)
-> (SubstAction s e -> String)
-> ([SubstAction s e] -> ShowS)
-> Show (SubstAction s e)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall s e. (Show s, Show e) => Int -> SubstAction s e -> ShowS
forall s e. (Show s, Show e) => [SubstAction s e] -> ShowS
forall s e. (Show s, Show e) => SubstAction s e -> String
$cshowsPrec :: forall s e. (Show s, Show e) => Int -> SubstAction s e -> ShowS
showsPrec :: Int -> SubstAction s e -> ShowS
$cshow :: forall s e. (Show s, Show e) => SubstAction s e -> String
show :: SubstAction s e -> String
$cshowList :: forall s e. (Show s, Show e) => [SubstAction s e] -> ShowS
showList :: [SubstAction s e] -> ShowS
Show)
makeLenses ''SubstAction
data SubstyAction s e =
FreeVars_SA (FreeVarsAction s e)
| Subst_SA (SubstAction s e)
| MetaSubst_SA (MetaSubst s e)
makePrisms ''SubstyAction
newtype SubstyM s e a = SubstyM
{ forall s e a.
SubstyM s e a
-> UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a
unSubstyM ∷ UContT (ReaderT (SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID))) a
} deriving
( (forall a. a -> SubstyM s e a) -> Return (SubstyM s e)
forall a. a -> SubstyM s e a
forall s e a. a -> SubstyM s e a
forall (m :: * -> *). (forall a. a -> m a) -> Return m
$creturn :: forall s e a. a -> SubstyM s e a
return :: forall a. a -> SubstyM s e a
Return,(forall a b.
SubstyM s e a -> (a -> SubstyM s e b) -> SubstyM s e b)
-> Bind (SubstyM s e)
forall a b. SubstyM s e a -> (a -> SubstyM s e b) -> SubstyM s e b
forall s e a b.
SubstyM s e a -> (a -> SubstyM s e b) -> SubstyM s e b
forall (m :: * -> *).
(forall a b. m a -> (a -> m b) -> m b) -> Bind m
$c≫= :: forall s e a b.
SubstyM s e a -> (a -> SubstyM s e b) -> SubstyM s e b
≫= :: forall a b. SubstyM s e a -> (a -> SubstyM s e b) -> SubstyM s e b
Bind,(forall a b. (a -> b) -> SubstyM s e a -> SubstyM s e b)
-> Functor (SubstyM s e)
forall a b. (a -> b) -> SubstyM s e a -> SubstyM s e b
forall s e a b. (a -> b) -> SubstyM s e a -> SubstyM s e b
forall (t :: * -> *).
(forall a b. (a -> b) -> t a -> t b) -> Functor t
$cmap :: forall s e a b. (a -> b) -> SubstyM s e a -> SubstyM s e b
map :: forall a b. (a -> b) -> SubstyM s e a -> SubstyM s e b
Functor,Bind (SubstyM s e)
Return (SubstyM s e)
Functor (SubstyM s e)
(Functor (SubstyM s e), Return (SubstyM s e),
Bind (SubstyM s e)) =>
Monad (SubstyM s e)
forall s e. Bind (SubstyM s e)
forall s e. Return (SubstyM s e)
forall s e. Functor (SubstyM s e)
forall (m :: * -> *). (Functor m, Return m, Bind m) => Monad m
Monad
, (forall a.
(forall u. (a -> SubstyM s e u) -> SubstyM s e u) -> SubstyM s e a)
-> (forall a u.
(a -> SubstyM s e u) -> SubstyM s e a -> SubstyM s e u)
-> MonadUCont (SubstyM s e)
forall a.
(forall u. (a -> SubstyM s e u) -> SubstyM s e u) -> SubstyM s e a
forall s e a.
(Ord s, Ord e) =>
(forall u. (a -> SubstyM s e u) -> SubstyM s e u) -> SubstyM s e a
forall s e a u.
(Ord s, Ord e) =>
(a -> SubstyM s e u) -> SubstyM s e a -> SubstyM s e u
forall a u. (a -> SubstyM s e u) -> SubstyM s e a -> SubstyM s e u
forall (m :: * -> *).
(forall a. (forall u. (a -> m u) -> m u) -> m a)
-> (forall a u. (a -> m u) -> m a -> m u) -> MonadUCont m
$cucallCC :: forall s e a.
(Ord s, Ord e) =>
(forall u. (a -> SubstyM s e u) -> SubstyM s e u) -> SubstyM s e a
ucallCC :: forall a.
(forall u. (a -> SubstyM s e u) -> SubstyM s e u) -> SubstyM s e a
$cuwithC :: forall s e a u.
(Ord s, Ord e) =>
(a -> SubstyM s e u) -> SubstyM s e a -> SubstyM s e u
uwithC :: forall a u. (a -> SubstyM s e u) -> SubstyM s e a -> SubstyM s e u
MonadUCont
, MonadReader (SubstyAction s e)
, MonadWriter (s ⇰ 𝑃 (UVar s e))
, (forall a. SubstyM s e a)
-> (forall a. SubstyM s e a -> SubstyM s e a -> SubstyM s e a)
-> MonadFail (SubstyM s e)
forall a. SubstyM s e a
forall a. SubstyM s e a -> SubstyM s e a -> SubstyM s e a
forall s e a. (Ord s, Ord e) => SubstyM s e a
forall s e a.
(Ord s, Ord e) =>
SubstyM s e a -> SubstyM s e a -> SubstyM s e a
forall {k} (m :: k -> *).
(forall (a :: k). m a)
-> (forall (a :: k). m a -> m a -> m a) -> MonadFail m
$cabort :: forall s e a. (Ord s, Ord e) => SubstyM s e a
abort :: forall a. SubstyM s e a
$c⎅ :: forall s e a.
(Ord s, Ord e) =>
SubstyM s e a -> SubstyM s e a -> SubstyM s e a
⎅ :: forall a. SubstyM s e a -> SubstyM s e a -> SubstyM s e a
MonadFail
)
mkSubstM
∷ (∀ u. SubstyAction s e
→ (a → SubstyAction s e → (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
→ (s ⇰ 𝑃 (UVar s e))
∧ 𝑂 u)
→ SubstyM s e a
mkSubstM :: forall s e a.
(forall u.
SubstyAction s e
-> (a -> SubstyAction s e -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> SubstyM s e a
mkSubstM forall u.
SubstyAction s e
-> (a -> SubstyAction s e -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u
f = UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a
-> SubstyM s e a
forall s e a.
UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a
-> SubstyM s e a
SubstyM (UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a
-> SubstyM s e a)
-> UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a
-> SubstyM s e a
forall a b. (a -> b) -> a -> b
$ (forall u.
(a
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u)
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u)
-> UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a
forall {k} (m :: k -> *) a.
(forall (u :: k). (a -> m u) -> m u) -> UContT m a
UContT (\ a
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u
𝓀 → (SubstyAction s e -> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u)
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u
forall {k} r (m :: k -> *) (a :: k). (r -> m a) -> ReaderT r m a
ReaderT ((SubstyAction s e -> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u)
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u)
-> (SubstyAction s e -> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u)
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u
forall a b. (a -> b) -> a -> b
$ \ SubstyAction s e
γ → WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
-> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u
forall (m :: * -> *) a. m (𝑂 a) -> FailT m a
FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
-> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u)
-> WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
-> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u
forall a b. (a -> b) -> a -> b
$ ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
forall o (m :: * -> *) a. m (o ∧ a) -> WriterT o m a
WriterT (ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u))
-> ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
forall a b. (a -> b) -> a -> b
$ ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u) -> ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
forall a. a -> ID a
ID (((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u) -> ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u))
-> ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u) -> ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
forall a b. (a -> b) -> a -> b
$ SubstyAction s e
-> (a -> SubstyAction s e -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u
forall u.
SubstyAction s e
-> (a -> SubstyAction s e -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u
f SubstyAction s e
γ ((a -> SubstyAction s e -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> (a -> SubstyAction s e -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u
forall a b. (a -> b) -> a -> b
$ \ a
x SubstyAction s e
γ' →
ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u) -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u
forall a. ID a -> a
unID (ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u) -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u) -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u
forall a b. (a -> b) -> a -> b
$ WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
-> ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
forall o (m :: * -> *) a. WriterT o m a -> m (o ∧ a)
unWriterT (WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
-> ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u))
-> WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
-> ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
forall a b. (a -> b) -> a -> b
$ FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u
-> WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
forall (m :: * -> *) a. FailT m a -> m (𝑂 a)
unFailT (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u
-> WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u))
-> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u
-> WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
forall a b. (a -> b) -> a -> b
$ SubstyAction s e
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u
-> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u
forall {k} r (m :: k -> *) (a :: k). r -> ReaderT r m a -> m a
runReaderT SubstyAction s e
γ' (ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u
-> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u)
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u
-> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u
forall a b. (a -> b) -> a -> b
$ a
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u
𝓀 a
x)
runSubstM
∷ SubstyAction s e
→ (a → SubstyAction s e → (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
→ SubstyM s e a
→ (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u
runSubstM :: forall s e a u.
SubstyAction s e
-> (a -> SubstyAction s e -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> SubstyM s e a
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u
runSubstM SubstyAction s e
γ a -> SubstyAction s e -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u
𝓀 = ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u) -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u
forall a. ID a -> a
unID (ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u) -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> (WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
-> ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u))
-> WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
-> ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
forall o (m :: * -> *) a. WriterT o m a -> m (o ∧ a)
unWriterT (WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u) -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u
-> WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u))
-> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u
-> WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
forall (m :: * -> *) a. FailT m a -> m (𝑂 a)
unFailT (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> (ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u
-> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u)
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ SubstyAction s e
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u
-> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u
forall {k} r (m :: k -> *) (a :: k). r -> ReaderT r m a -> m a
runReaderT SubstyAction s e
γ (ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> (UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u)
-> UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ (a
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u)
-> UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u
forall {k} (u :: k) (m :: k -> *) a.
(a -> m u) -> UContT m a -> m u
runUContT a
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u
𝓀' (UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> (SubstyM s e a
-> UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a)
-> SubstyM s e a
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ SubstyM s e a
-> UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a
forall s e a.
SubstyM s e a
-> UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a
unSubstyM
where
𝓀' :: a
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u
𝓀' a
x = (SubstyAction s e -> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u)
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u
forall {k} r (m :: k -> *) (a :: k). (r -> m a) -> ReaderT r m a
ReaderT ((SubstyAction s e -> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u)
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u)
-> (SubstyAction s e -> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u)
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) u
forall a b. (a -> b) -> a -> b
$ \ SubstyAction s e
γ' → WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
-> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u
forall (m :: * -> *) a. m (𝑂 a) -> FailT m a
FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
-> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u)
-> WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
-> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) u
forall a b. (a -> b) -> a -> b
$ ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
forall o (m :: * -> *) a. m (o ∧ a) -> WriterT o m a
WriterT (ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u))
-> ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
-> WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 u)
forall a b. (a -> b) -> a -> b
$ ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u) -> ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
forall a. a -> ID a
ID (((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u) -> ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u))
-> ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u) -> ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u)
forall a b. (a -> b) -> a -> b
$ a -> SubstyAction s e -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 u
𝓀 a
x SubstyAction s e
γ'
evalSubstM
∷ SubstyAction s e
→ SubstyM s e a
→ (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a
evalSubstM :: forall s e a.
SubstyAction s e -> SubstyM s e a -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a
evalSubstM SubstyAction s e
γ = ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a) -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a
forall a. ID a -> a
unID (ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a) -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a)
-> (WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 a)
-> ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a))
-> WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 a)
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 a)
-> ID ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a)
forall o (m :: * -> *) a. WriterT o m a -> m (o ∧ a)
unWriterT (WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 a) -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a)
-> (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) a
-> WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 a))
-> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) a
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) a
-> WriterT (s ⇰ 𝑃 (UVar s e)) ID (𝑂 a)
forall (m :: * -> *) a. FailT m a -> m (𝑂 a)
unFailT (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) a
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a)
-> (ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) a
-> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) a)
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) a
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ SubstyAction s e
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) a
-> FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID) a
forall {k} r (m :: k -> *) (a :: k). r -> ReaderT r m a -> m a
runReaderT SubstyAction s e
γ (ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) a
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a)
-> (UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) a)
-> UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a
-> ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)) a
forall (m :: * -> *) a. Return m => UContT m a -> m a
evalUContT (UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a)
-> (SubstyM s e a
-> UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a)
-> SubstyM s e a
-> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ SubstyM s e a
-> UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a
forall s e a.
SubstyM s e a
-> UContT
(ReaderT
(SubstyAction s e) (FailT (WriterT (s ⇰ 𝑃 (UVar s e)) ID)))
a
unSubstyM
class (SVarView s e) ⇒ Substy s e a | a→e,e→s where
substy ∷ a → SubstyM s e a
fvssWith ∷ (Substy s e a) ⇒ (s → UVar s e → 𝔹) → a → s ⇰ 𝑃 (UVar s e)
fvssWith :: forall s e a.
Substy s e a =>
(s -> UVar s e -> 𝔹) -> a -> s ⇰ 𝑃 (UVar s e)
fvssWith s -> UVar s e -> 𝔹
f = ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a) -> s ⇰ 𝑃 (UVar s e)
forall a b. (a ∧ b) -> a
fst (((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a) -> s ⇰ 𝑃 (UVar s e))
-> (SubstyM s e a -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a)
-> SubstyM s e a
-> s ⇰ 𝑃 (UVar s e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ SubstyAction s e -> SubstyM s e a -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a
forall s e a.
SubstyAction s e -> SubstyM s e a -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a
evalSubstM (FreeVarsAction s e -> SubstyAction s e
forall s e. FreeVarsAction s e -> SubstyAction s e
FreeVars_SA (FreeVarsAction s e -> SubstyAction s e)
-> FreeVarsAction s e -> SubstyAction s e
forall a b. (a -> b) -> a -> b
$ (s -> UVar s e -> 𝔹) -> ((s ∧ SName) ⇰ ℕ64) -> FreeVarsAction s e
forall s e.
(s -> UVar s e -> 𝔹) -> ((s ∧ SName) ⇰ ℕ64) -> FreeVarsAction s e
FreeVarsAction s -> UVar s e -> 𝔹
f (s ∧ SName) ⇰ ℕ64
forall a. Null a => a
null) (SubstyM s e a -> s ⇰ 𝑃 (UVar s e))
-> (a -> SubstyM s e a) -> a -> s ⇰ 𝑃 (UVar s e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ a -> SubstyM s e a
forall s e a. Substy s e a => a -> SubstyM s e a
substy
fvsWith ∷ (Ord s,Substy s e a) ⇒ s → (UVar s e → 𝔹) → a → 𝑃 (UVar s e)
fvsWith :: forall s e a.
(Ord s, Substy s e a) =>
s -> (UVar s e -> 𝔹) -> a -> 𝑃 (UVar s e)
fvsWith s
s UVar s e -> 𝔹
f = 𝑃 (UVar s e) -> 𝑂 (𝑃 (UVar s e)) -> 𝑃 (UVar s e)
forall a. a -> 𝑂 a -> a
ifNone 𝑃 (UVar s e)
forall a. Null a => a
null (𝑂 (𝑃 (UVar s e)) -> 𝑃 (UVar s e))
-> ((s ⇰ 𝑃 (UVar s e)) -> 𝑂 (𝑃 (UVar s e)))
-> (s ⇰ 𝑃 (UVar s e))
-> 𝑃 (UVar s e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ s -> (s ⇰ 𝑃 (UVar s e)) -> 𝑂 (𝑃 (UVar s e))
forall k v t. Lookup k v t => k -> t -> 𝑂 v
lup s
s ((s ⇰ 𝑃 (UVar s e)) -> 𝑃 (UVar s e))
-> (a -> s ⇰ 𝑃 (UVar s e)) -> a -> 𝑃 (UVar s e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ (s -> UVar s e -> 𝔹) -> a -> s ⇰ 𝑃 (UVar s e)
forall s e a.
Substy s e a =>
(s -> UVar s e -> 𝔹) -> a -> s ⇰ 𝑃 (UVar s e)
fvssWith (\ s
s' UVar s e
x → s
s s -> s -> 𝔹
forall a. Eq a => a -> a -> 𝔹
≡ s
s' 𝔹 -> 𝔹 -> 𝔹
⩓ UVar s e -> 𝔹
f UVar s e
x)
fvss ∷ (Substy s e a) ⇒ a → s ⇰ 𝑃 (UVar s e)
fvss :: forall s e a. Substy s e a => a -> s ⇰ 𝑃 (UVar s e)
fvss = (s -> UVar s e -> 𝔹) -> a -> s ⇰ 𝑃 (UVar s e)
forall s e a.
Substy s e a =>
(s -> UVar s e -> 𝔹) -> a -> s ⇰ 𝑃 (UVar s e)
fvssWith ((s -> UVar s e -> 𝔹) -> a -> s ⇰ 𝑃 (UVar s e))
-> (s -> UVar s e -> 𝔹) -> a -> s ⇰ 𝑃 (UVar s e)
forall a b. (a -> b) -> a -> b
$ (UVar s e -> 𝔹) -> s -> UVar s e -> 𝔹
forall a b. a -> b -> a
const ((UVar s e -> 𝔹) -> s -> UVar s e -> 𝔹)
-> (UVar s e -> 𝔹) -> s -> UVar s e -> 𝔹
forall a b. (a -> b) -> a -> b
$ 𝔹 -> UVar s e -> 𝔹
forall a b. a -> b -> a
const 𝔹
True
fvs ∷ (Ord s,Substy s e a) ⇒ s → a → 𝑃 (UVar s e)
fvs :: forall s e a. (Ord s, Substy s e a) => s -> a -> 𝑃 (UVar s e)
fvs s
s = s -> (UVar s e -> 𝔹) -> a -> 𝑃 (UVar s e)
forall s e a.
(Ord s, Substy s e a) =>
s -> (UVar s e -> 𝔹) -> a -> 𝑃 (UVar s e)
fvsWith s
s ((UVar s e -> 𝔹) -> a -> 𝑃 (UVar s e))
-> (UVar s e -> 𝔹) -> a -> 𝑃 (UVar s e)
forall a b. (a -> b) -> a -> b
$ 𝔹 -> UVar s e -> 𝔹
forall a b. a -> b -> a
const 𝔹
True
fvssMetas ∷ (Ord s,Ord e,Substy s e a) ⇒ a → s ⇰ 𝑃 (MVar s e)
fvssMetas :: forall s e a. (Ord s, Ord e, Substy s e a) => a -> s ⇰ 𝑃 (MVar s e)
fvssMetas = (𝑃 (UVar s e) -> 𝑃 (MVar s e))
-> (s ⇰ 𝑃 (UVar s e)) -> s ⇰ 𝑃 (MVar s e)
forall a b. (a -> b) -> (s ⇰ a) -> s ⇰ b
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
map (𝐼 (MVar s e) -> 𝑃 (MVar s e)
forall s t e. (ToIter e t, Set e s) => t -> s
pow (𝐼 (MVar s e) -> 𝑃 (MVar s e))
-> (𝐼 (UVar s e) -> 𝐼 (MVar s e)) -> 𝐼 (UVar s e) -> 𝑃 (MVar s e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ (UVar s e -> 𝑂 (MVar s e)) -> 𝐼 (UVar s e) -> 𝐼 (MVar s e)
forall a t b. ToIter a t => (a -> 𝑂 b) -> t -> 𝐼 b
filterMap ((UVar s e ⌲ MVar s e) -> UVar s e -> 𝑂 (MVar s e)
forall a b. (a ⌲ b) -> a -> 𝑂 b
view UVar s e ⌲ MVar s e
forall s e. UVar s e ⌲ MVar s e
m_UVarL) (𝐼 (UVar s e) -> 𝑃 (MVar s e))
-> (𝑃 (UVar s e) -> 𝐼 (UVar s e)) -> 𝑃 (UVar s e) -> 𝑃 (MVar s e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ 𝑃 (UVar s e) -> 𝐼 (UVar s e)
forall a t. ToIter a t => t -> 𝐼 a
iter) ((s ⇰ 𝑃 (UVar s e)) -> s ⇰ 𝑃 (MVar s e))
-> (a -> s ⇰ 𝑃 (UVar s e)) -> a -> s ⇰ 𝑃 (MVar s e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ (s -> UVar s e -> 𝔹) -> a -> s ⇰ 𝑃 (UVar s e)
forall s e a.
Substy s e a =>
(s -> UVar s e -> 𝔹) -> a -> s ⇰ 𝑃 (UVar s e)
fvssWith (\ s
_s UVar s e
y → (UVar s e ⌲ MVar s e) -> UVar s e -> 𝔹
forall a b. (a ⌲ b) -> a -> 𝔹
shape UVar s e ⌲ MVar s e
forall s e. UVar s e ⌲ MVar s e
m_UVarL UVar s e
y)
fvsMetas ∷ (Ord s,Ord e,Substy s e a) ⇒ s → a → 𝑃 (MVar s e)
fvsMetas :: forall s e a.
(Ord s, Ord e, Substy s e a) =>
s -> a -> 𝑃 (MVar s e)
fvsMetas s
s = 𝑃 (MVar s e) -> 𝑂 (𝑃 (MVar s e)) -> 𝑃 (MVar s e)
forall a. a -> 𝑂 a -> a
ifNone 𝑃 (MVar s e)
forall e s. Set e s => s
pø (𝑂 (𝑃 (MVar s e)) -> 𝑃 (MVar s e))
-> ((s ⇰ 𝑃 (MVar s e)) -> 𝑂 (𝑃 (MVar s e)))
-> (s ⇰ 𝑃 (MVar s e))
-> 𝑃 (MVar s e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ s -> (s ⇰ 𝑃 (MVar s e)) -> 𝑂 (𝑃 (MVar s e))
forall k v t. Lookup k v t => k -> t -> 𝑂 v
lup s
s ((s ⇰ 𝑃 (MVar s e)) -> 𝑃 (MVar s e))
-> (a -> s ⇰ 𝑃 (MVar s e)) -> a -> 𝑃 (MVar s e)
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ a -> s ⇰ 𝑃 (MVar s e)
forall s e a. (Ord s, Ord e, Substy s e a) => a -> s ⇰ 𝑃 (MVar s e)
fvssMetas
todbr ∷ (Substy s e a) ⇒ a → 𝑂 a
todbr :: forall s e a. Substy s e a => a -> 𝑂 a
todbr = ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a) -> 𝑂 a
forall a b. (a ∧ b) -> b
snd (((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a) -> 𝑂 a)
-> (SubstyM s e a -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a)
-> SubstyM s e a
-> 𝑂 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ SubstyAction s e -> SubstyM s e a -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a
forall s e a.
SubstyAction s e -> SubstyM s e a -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a
evalSubstM (SubstAction s e -> SubstyAction s e
forall s e. SubstAction s e -> SubstyAction s e
Subst_SA (SubstAction s e -> SubstyAction s e)
-> SubstAction s e -> SubstyAction s e
forall a b. (a -> b) -> a -> b
$ RebindAction -> Subst s e -> SubstAction s e
forall s e. RebindAction -> Subst s e -> SubstAction s e
SubstAction RebindAction
AllNameless_RA Subst s e
forall a. Null a => a
null) (SubstyM s e a -> 𝑂 a) -> (a -> SubstyM s e a) -> a -> 𝑂 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ a -> SubstyM s e a
forall s e a. Substy s e a => a -> SubstyM s e a
substy
tonmd ∷ (Substy s e a) ⇒ a → 𝑂 a
tonmd :: forall s e a. Substy s e a => a -> 𝑂 a
tonmd = ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a) -> 𝑂 a
forall a b. (a ∧ b) -> b
snd (((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a) -> 𝑂 a)
-> (SubstyM s e a -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a)
-> SubstyM s e a
-> 𝑂 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ SubstyAction s e -> SubstyM s e a -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a
forall s e a.
SubstyAction s e -> SubstyM s e a -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a
evalSubstM (SubstAction s e -> SubstyAction s e
forall s e. SubstAction s e -> SubstyAction s e
Subst_SA (SubstAction s e -> SubstyAction s e)
-> SubstAction s e -> SubstyAction s e
forall a b. (a -> b) -> a -> b
$ RebindAction -> Subst s e -> SubstAction s e
forall s e. RebindAction -> Subst s e -> SubstAction s e
SubstAction RebindAction
AllNamed_RA Subst s e
forall a. Null a => a
null) (SubstyM s e a -> 𝑂 a) -> (a -> SubstyM s e a) -> a -> 𝑂 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ a -> SubstyM s e a
forall s e a. Substy s e a => a -> SubstyM s e a
substy
subst ∷ (Substy s e a) ⇒ Subst s e → a → 𝑂 a
subst :: forall s e a. Substy s e a => Subst s e -> a -> 𝑂 a
subst Subst s e
𝓈 = ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a) -> 𝑂 a
forall a b. (a ∧ b) -> b
snd (((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a) -> 𝑂 a)
-> (SubstyM s e a -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a)
-> SubstyM s e a
-> 𝑂 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ SubstyAction s e -> SubstyM s e a -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a
forall s e a.
SubstyAction s e -> SubstyM s e a -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a
evalSubstM (SubstAction s e -> SubstyAction s e
forall s e. SubstAction s e -> SubstyAction s e
Subst_SA (SubstAction s e -> SubstyAction s e)
-> SubstAction s e -> SubstyAction s e
forall a b. (a -> b) -> a -> b
$ RebindAction -> Subst s e -> SubstAction s e
forall s e. RebindAction -> Subst s e -> SubstAction s e
SubstAction RebindAction
ID_RA Subst s e
𝓈) (SubstyM s e a -> 𝑂 a) -> (a -> SubstyM s e a) -> a -> 𝑂 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ a -> SubstyM s e a
forall s e a. Substy s e a => a -> SubstyM s e a
substy
msubst ∷ (Substy s e a) ⇒ MetaSubst s e → a → 𝑂 a
msubst :: forall s e a. Substy s e a => MetaSubst s e -> a -> 𝑂 a
msubst MetaSubst s e
𝓈 = ((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a) -> 𝑂 a
forall a b. (a ∧ b) -> b
snd (((s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a) -> 𝑂 a)
-> (SubstyM s e a -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a)
-> SubstyM s e a
-> 𝑂 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ SubstyAction s e -> SubstyM s e a -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a
forall s e a.
SubstyAction s e -> SubstyM s e a -> (s ⇰ 𝑃 (UVar s e)) ∧ 𝑂 a
evalSubstM (MetaSubst s e -> SubstyAction s e
forall s e. MetaSubst s e -> SubstyAction s e
MetaSubst_SA MetaSubst s e
𝓈) (SubstyM s e a -> 𝑂 a) -> (a -> SubstyM s e a) -> a -> 𝑂 a
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ a -> SubstyM s e a
forall s e a. Substy s e a => a -> SubstyM s e a
substy
canonSubst ∷ (Ord s,Eq e,Substy s e e) ⇒ (e → e) → Subst s e → Subst s e
canonSubst :: forall s e.
(Ord s, Eq e, Substy s e e) =>
(e -> e) -> Subst s e -> Subst s e
canonSubst e -> e
canonE Subst s e
𝓈 =
let introE :: p -> a -> 𝑂 a
introE p
ιs = Subst s e -> a -> 𝑂 a
forall s e a. Substy s e a => Subst s e -> a -> 𝑂 a
subst (Subst s e -> a -> 𝑂 a) -> Subst s e -> a -> 𝑂 a
forall a b. (a -> b) -> a -> b
$ 𝐼 (Subst s e) -> Subst s e
forall a t. (Monoid a, ToIter a t) => t -> a
concat (𝐼 (Subst s e) -> Subst s e) -> 𝐼 (Subst s e) -> Subst s e
forall a b. (a -> b) -> a -> b
$ 𝐼 ((s ∧ SName) ∧ ℕ64)
-> (((s ∧ SName) ∧ ℕ64) -> Subst s e) -> 𝐼 (Subst s e)
forall (t :: * -> *) a b. Functor t => t a -> (a -> b) -> t b
mapOn (p -> 𝐼 ((s ∧ SName) ∧ ℕ64)
forall a t. ToIter a t => t -> 𝐼 a
iter p
ιs) ((((s ∧ SName) ∧ ℕ64) -> Subst s e) -> 𝐼 (Subst s e))
-> (((s ∧ SName) ∧ ℕ64) -> Subst s e) -> 𝐼 (Subst s e)
forall a b. (a -> b) -> a -> b
$ \ (s
s :* SName
xO :* ℕ64
n) → case SName
xO of
SName
D_SName → s -> ℕ64 -> Subst s e
forall s e. Ord s => s -> ℕ64 -> Subst s e
dintroSubst s
s ℕ64
n
N_SName Name
x → s -> Name -> ℕ64 -> Subst s e
forall s e. Ord s => s -> Name -> ℕ64 -> Subst s e
nintroSubst s
s Name
x ℕ64
n
in ((s ∧ SName) -> e ⌲ DVar)
-> (((s ∧ SName) ⇰ ℕ64) -> e -> 𝑂 e)
-> (e -> e)
-> Subst s e
-> Subst s e
forall s e.
(Ord s, Eq e) =>
((s ∧ SName) -> e ⌲ DVar)
-> (((s ∧ SName) ⇰ ℕ64) -> e -> 𝑂 e)
-> (e -> e)
-> Subst s e
-> Subst s e
canonSubstWith ((s -> SName -> e ⌲ DVar) -> (s ∧ SName) -> e ⌲ DVar
forall a b c. (a -> b -> c) -> (a ∧ b) -> c
uncurry s -> SName -> e ⌲ DVar
forall s e. SVarView s e => s -> SName -> e ⌲ DVar
svarScopeL) ((s ∧ SName) ⇰ ℕ64) -> e -> 𝑂 e
forall {s} {e} {a} {p}.
(Substy s e e, Substy s e a, Ord s,
ToIter ((s ∧ SName) ∧ ℕ64) p) =>
p -> a -> 𝑂 a
introE e -> e
canonE Subst s e
𝓈
canonMVar ∷ (Ord s,Eq e,Substy s e e) ⇒ (e → e) → MVar s e → MVar s e
canonMVar :: forall s e.
(Ord s, Eq e, Substy s e e) =>
(e -> e) -> MVar s e -> MVar s e
canonMVar e -> e
canonE (MVar Subst s e
𝓈 Name
x) = Subst s e -> Name -> MVar s e
forall s e. Subst s e -> Name -> MVar s e
MVar ((e -> e) -> Subst s e -> Subst s e
forall s e.
(Ord s, Eq e, Substy s e e) =>
(e -> e) -> Subst s e -> Subst s e
canonSubst e -> e
canonE Subst s e
𝓈) Name
x
substMVar ∷ (Ord s,Substy s e e) ⇒ Subst s e → MVar s e → MVar s e
substMVar :: forall s e.
(Ord s, Substy s e e) =>
Subst s e -> MVar s e -> MVar s e
substMVar Subst s e
𝓈 (MVar Subst s e
𝓈ₓ Name
x) = Subst s e -> Name -> MVar s e
forall s e. Subst s e -> Name -> MVar s e
MVar (Subst s e
𝓈 Subst s e -> Subst s e -> Subst s e
forall a. Append a => a -> a -> a
⧺ Subst s e
𝓈ₓ) Name
x
canonUVar ∷ (Ord s,Eq e,Substy s e e) ⇒ (e → e) → UVar s e → UVar s e
canonUVar :: forall s e.
(Ord s, Eq e, Substy s e e) =>
(e -> e) -> UVar s e -> UVar s e
canonUVar e -> e
canonE = \case
D_UVar DVar
x → DVar -> UVar s e
forall s e. DVar -> UVar s e
D_UVar DVar
x
N_UVar NVar
x → NVar -> UVar s e
forall s e. NVar -> UVar s e
N_UVar NVar
x
G_UVar GVar
x → GVar -> UVar s e
forall s e. GVar -> UVar s e
G_UVar GVar
x
M_UVar MVar s e
x → MVar s e -> UVar s e
forall s e. MVar s e -> UVar s e
M_UVar (MVar s e -> UVar s e) -> MVar s e -> UVar s e
forall a b. (a -> b) -> a -> b
$ (e -> e) -> MVar s e -> MVar s e
forall s e.
(Ord s, Eq e, Substy s e e) =>
(e -> e) -> MVar s e -> MVar s e
canonMVar e -> e
canonE MVar s e
x
nullSubst ∷ Subst s e
nullSubst :: forall s e. Subst s e
nullSubst = SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
forall s e. SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
Subst (SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e)
-> SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
forall a b. (a -> b) -> a -> b
$ ((s ∧ Name) ⇰ SubstElem (s ∧ SName) e)
-> ((s ∧ SName) ⇰ SubstScoped (s ∧ SName) e)
-> SubstSpaced (s ∧ Name) (s ∧ SName) e
forall sG sS e.
(sG ⇰ SubstElem sS e)
-> (sS ⇰ SubstScoped sS e) -> SubstSpaced sG sS e
SubstSpaced (s ∧ Name) ⇰ SubstElem (s ∧ SName) e
forall a. Null a => a
null (s ∧ SName) ⇰ SubstScoped (s ∧ SName) e
forall a. Null a => a
null
appendSubst ∷ (Ord s,Substy s e e) ⇒ Subst s e → Subst s e → Subst s e
appendSubst :: forall s e.
(Ord s, Substy s e e) =>
Subst s e -> Subst s e -> Subst s e
appendSubst Subst s e
𝓈₂ Subst s e
𝓈₁ = SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
forall s e. SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
Subst (SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e)
-> SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
forall a b. (a -> b) -> a -> b
$ ((s ∧ SName) -> e ⌲ DVar)
-> (SubstSpaced (s ∧ Name) (s ∧ SName) e -> e -> 𝑂 e)
-> SubstSpaced (s ∧ Name) (s ∧ SName) e
-> SubstSpaced (s ∧ Name) (s ∧ SName) e
-> SubstSpaced (s ∧ Name) (s ∧ SName) e
forall sG sS e.
(Ord sG, Ord sS) =>
(sS -> e ⌲ DVar)
-> (SubstSpaced sG sS e -> e -> 𝑂 e)
-> SubstSpaced sG sS e
-> SubstSpaced sG sS e
-> SubstSpaced sG sS e
appendSubstSpaced ((s -> SName -> e ⌲ DVar) -> (s ∧ SName) -> e ⌲ DVar
forall a b c. (a -> b -> c) -> (a ∧ b) -> c
uncurry s -> SName -> e ⌲ DVar
forall s e. SVarView s e => s -> SName -> e ⌲ DVar
svarScopeL) (Subst s e -> e -> 𝑂 e
forall s e a. Substy s e a => Subst s e -> a -> 𝑂 a
subst (Subst s e -> e -> 𝑂 e)
-> (SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e)
-> SubstSpaced (s ∧ Name) (s ∧ SName) e
-> e
-> 𝑂 e
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
forall s e. SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
Subst) (Subst s e -> SubstSpaced (s ∧ Name) (s ∧ SName) e
forall s e. Subst s e -> SubstSpaced (s ∧ Name) (s ∧ SName) e
unSubst Subst s e
𝓈₂) (SubstSpaced (s ∧ Name) (s ∧ SName) e
-> SubstSpaced (s ∧ Name) (s ∧ SName) e)
-> SubstSpaced (s ∧ Name) (s ∧ SName) e
-> SubstSpaced (s ∧ Name) (s ∧ SName) e
forall a b. (a -> b) -> a -> b
$ Subst s e -> SubstSpaced (s ∧ Name) (s ∧ SName) e
forall s e. Subst s e -> SubstSpaced (s ∧ Name) (s ∧ SName) e
unSubst Subst s e
𝓈₁
instance Null (Subst s e) where null :: Subst s e
null = Subst s e
forall s e. Subst s e
nullSubst
instance (Ord s,Substy s e e) ⇒ Append (Subst s e) where ⧺ :: Subst s e -> Subst s e -> Subst s e
(⧺) = Subst s e -> Subst s e -> Subst s e
forall s e.
(Ord s, Substy s e e) =>
Subst s e -> Subst s e -> Subst s e
appendSubst
instance (Ord s,Substy s e e) ⇒ Monoid (Subst s e)
substyDBdr ∷ (Ord s,Ord e) ⇒ s → SubstyM s e ()
substyDBdr :: forall s e. (Ord s, Ord e) => s -> SubstyM s e ()
substyDBdr s
s = (SubstyAction s e -> SubstyAction s e) -> SubstyM s e ()
forall (m :: * -> *) r.
(Monad m, MonadReader r m, MonadUCont m) =>
(r -> r) -> m ()
umodifyEnv ((SubstyAction s e -> SubstyAction s e) -> SubstyM s e ())
-> (SubstyAction s e -> SubstyAction s e) -> SubstyM s e ()
forall a b. (a -> b) -> a -> b
$ [SubstyAction s e -> SubstyAction s e]
-> SubstyAction s e -> SubstyAction s e
forall a t. ToIter (a -> a) t => t -> a -> a
compose
[ (SubstyAction s e ⌲ SubstAction s e)
-> (SubstAction s e -> SubstAction s e)
-> SubstyAction s e
-> SubstyAction s e
forall a b. (a ⌲ b) -> (b -> b) -> a -> a
forall (t :: * -> * -> *) a b.
Alter t =>
t a b -> (b -> b) -> a -> a
alter SubstyAction s e ⌲ SubstAction s e
forall s e. SubstyAction s e ⌲ SubstAction s e
subst_SAL ((SubstAction s e -> SubstAction s e)
-> SubstyAction s e -> SubstyAction s e)
-> (SubstAction s e -> SubstAction s e)
-> SubstyAction s e
-> SubstyAction s e
forall a b. (a -> b) -> a -> b
$ (SubstAction s e ⟢ Subst s e)
-> (Subst s e -> Subst s e) -> SubstAction s e -> SubstAction s e
forall a b. (a ⟢ b) -> (b -> b) -> a -> a
forall (t :: * -> * -> *) a b.
Alter t =>
t a b -> (b -> b) -> a -> a
alter SubstAction s e ⟢ Subst s e
forall s e. SubstAction s e ⟢ Subst s e
substActionSubstL ((Subst s e -> Subst s e) -> SubstAction s e -> SubstAction s e)
-> (Subst s e -> Subst s e) -> SubstAction s e -> SubstAction s e
forall a b. (a -> b) -> a -> b
$ s -> ℕ64 -> Subst s e -> Subst s e
forall s e. Ord s => s -> ℕ64 -> Subst s e -> Subst s e
dshiftSubst s
s ℕ64
1
, (SubstyAction s e ⌲ FreeVarsAction s e)
-> (FreeVarsAction s e -> FreeVarsAction s e)
-> SubstyAction s e
-> SubstyAction s e
forall a b. (a ⌲ b) -> (b -> b) -> a -> a
forall (t :: * -> * -> *) a b.
Alter t =>
t a b -> (b -> b) -> a -> a
alter SubstyAction s e ⌲ FreeVarsAction s e
forall s e. SubstyAction s e ⌲ FreeVarsAction s e
freeVars_SAL ((FreeVarsAction s e -> FreeVarsAction s e)
-> SubstyAction s e -> SubstyAction s e)
-> (FreeVarsAction s e -> FreeVarsAction s e)
-> SubstyAction s e
-> SubstyAction s e
forall a b. (a -> b) -> a -> b
$ (FreeVarsAction s e ⟢ ((s ∧ SName) ⇰ ℕ64))
-> (((s ∧ SName) ⇰ ℕ64) -> (s ∧ SName) ⇰ ℕ64)
-> FreeVarsAction s e
-> FreeVarsAction s e
forall a b. (a ⟢ b) -> (b -> b) -> a -> a
forall (t :: * -> * -> *) a b.
Alter t =>
t a b -> (b -> b) -> a -> a
alter FreeVarsAction s e ⟢ ((s ∧ SName) ⇰ ℕ64)
forall s e. FreeVarsAction s e ⟢ ((s ∧ SName) ⇰ ℕ64)
freeVarsActionScopeL ((((s ∧ SName) ⇰ ℕ64) -> (s ∧ SName) ⇰ ℕ64)
-> FreeVarsAction s e -> FreeVarsAction s e)
-> (((s ∧ SName) ⇰ ℕ64) -> (s ∧ SName) ⇰ ℕ64)
-> FreeVarsAction s e
-> FreeVarsAction s e
forall a b. (a -> b) -> a -> b
$ ((s ∧ SName) ⇰ ℕ64) -> ((s ∧ SName) ⇰ ℕ64) -> (s ∧ SName) ⇰ ℕ64
forall a. Append a => a -> a -> a
(⧺) (((s ∧ SName) ⇰ ℕ64) -> ((s ∧ SName) ⇰ ℕ64) -> (s ∧ SName) ⇰ ℕ64)
-> ((s ∧ SName) ⇰ ℕ64) -> ((s ∧ SName) ⇰ ℕ64) -> (s ∧ SName) ⇰ ℕ64
forall a b. (a -> b) -> a -> b
$ (s
s s -> SName -> s ∧ SName
forall a b. a -> b -> a ∧ b
:* SName
D_SName) (s ∧ SName) -> ℕ64 -> (s ∧ SName) ⇰ ℕ64
forall a. (s ∧ SName) -> a -> (s ∧ SName) ⇰ a
forall k s (d :: * -> *) a. Dict k s d => k -> a -> d a
↦ ℕ64
1
]
substyNBdr ∷ (Ord s,Ord e) ⇒ s → Name → SubstyM s e ()
substyNBdr :: forall s e. (Ord s, Ord e) => s -> Name -> SubstyM s e ()
substyNBdr s
s Name
x = (SubstyAction s e -> SubstyAction s e) -> SubstyM s e ()
forall (m :: * -> *) r.
(Monad m, MonadReader r m, MonadUCont m) =>
(r -> r) -> m ()
umodifyEnv ((SubstyAction s e -> SubstyAction s e) -> SubstyM s e ())
-> (SubstyAction s e -> SubstyAction s e) -> SubstyM s e ()
forall a b. (a -> b) -> a -> b
$ [SubstyAction s e -> SubstyAction s e]
-> SubstyAction s e -> SubstyAction s e
forall a t. ToIter (a -> a) t => t -> a -> a
compose
[ (SubstyAction s e ⌲ SubstAction s e)
-> (SubstAction s e -> SubstAction s e)
-> SubstyAction s e
-> SubstyAction s e
forall a b. (a ⌲ b) -> (b -> b) -> a -> a
forall (t :: * -> * -> *) a b.
Alter t =>
t a b -> (b -> b) -> a -> a
alter SubstyAction s e ⌲ SubstAction s e
forall s e. SubstyAction s e ⌲ SubstAction s e
subst_SAL ((SubstAction s e -> SubstAction s e)
-> SubstyAction s e -> SubstyAction s e)
-> (SubstAction s e -> SubstAction s e)
-> SubstyAction s e
-> SubstyAction s e
forall a b. (a -> b) -> a -> b
$ (SubstAction s e ⟢ Subst s e)
-> (Subst s e -> Subst s e) -> SubstAction s e -> SubstAction s e
forall a b. (a ⟢ b) -> (b -> b) -> a -> a
forall (t :: * -> * -> *) a b.
Alter t =>
t a b -> (b -> b) -> a -> a
alter SubstAction s e ⟢ Subst s e
forall s e. SubstAction s e ⟢ Subst s e
substActionSubstL ((Subst s e -> Subst s e) -> SubstAction s e -> SubstAction s e)
-> (Subst s e -> Subst s e) -> SubstAction s e -> SubstAction s e
forall a b. (a -> b) -> a -> b
$ s -> Name -> ℕ64 -> Subst s e -> Subst s e
forall s e. Ord s => s -> Name -> ℕ64 -> Subst s e -> Subst s e
nshiftSubst s
s Name
x ℕ64
1
, (SubstyAction s e ⌲ FreeVarsAction s e)
-> (FreeVarsAction s e -> FreeVarsAction s e)
-> SubstyAction s e
-> SubstyAction s e
forall a b. (a ⌲ b) -> (b -> b) -> a -> a
forall (t :: * -> * -> *) a b.
Alter t =>
t a b -> (b -> b) -> a -> a
alter SubstyAction s e ⌲ FreeVarsAction s e
forall s e. SubstyAction s e ⌲ FreeVarsAction s e
freeVars_SAL ((FreeVarsAction s e -> FreeVarsAction s e)
-> SubstyAction s e -> SubstyAction s e)
-> (FreeVarsAction s e -> FreeVarsAction s e)
-> SubstyAction s e
-> SubstyAction s e
forall a b. (a -> b) -> a -> b
$ (FreeVarsAction s e ⟢ ((s ∧ SName) ⇰ ℕ64))
-> (((s ∧ SName) ⇰ ℕ64) -> (s ∧ SName) ⇰ ℕ64)
-> FreeVarsAction s e
-> FreeVarsAction s e
forall a b. (a ⟢ b) -> (b -> b) -> a -> a
forall (t :: * -> * -> *) a b.
Alter t =>
t a b -> (b -> b) -> a -> a
alter FreeVarsAction s e ⟢ ((s ∧ SName) ⇰ ℕ64)
forall s e. FreeVarsAction s e ⟢ ((s ∧ SName) ⇰ ℕ64)
freeVarsActionScopeL ((((s ∧ SName) ⇰ ℕ64) -> (s ∧ SName) ⇰ ℕ64)
-> FreeVarsAction s e -> FreeVarsAction s e)
-> (((s ∧ SName) ⇰ ℕ64) -> (s ∧ SName) ⇰ ℕ64)
-> FreeVarsAction s e
-> FreeVarsAction s e
forall a b. (a -> b) -> a -> b
$ ((s ∧ SName) ⇰ ℕ64) -> ((s ∧ SName) ⇰ ℕ64) -> (s ∧ SName) ⇰ ℕ64
forall a. Append a => a -> a -> a
(⧺) (((s ∧ SName) ⇰ ℕ64) -> ((s ∧ SName) ⇰ ℕ64) -> (s ∧ SName) ⇰ ℕ64)
-> ((s ∧ SName) ⇰ ℕ64) -> ((s ∧ SName) ⇰ ℕ64) -> (s ∧ SName) ⇰ ℕ64
forall a b. (a -> b) -> a -> b
$ (s
s s -> SName -> s ∧ SName
forall a b. a -> b -> a ∧ b
:* Name -> SName
N_SName Name
x) (s ∧ SName) -> ℕ64 -> (s ∧ SName) ⇰ ℕ64
forall a. (s ∧ SName) -> a -> (s ∧ SName) ⇰ a
forall k s (d :: * -> *) a. Dict k s d => k -> a -> d a
↦ ℕ64
1
]
substyBdr ∷ (Ord s,Ord e,Substy s e e) ⇒ s → (SVar → e) → Name → SubstyM s e ()
substyBdr :: forall s e.
(Ord s, Ord e, Substy s e e) =>
s -> (SVar -> e) -> Name -> SubstyM s e ()
substyBdr s
s SVar -> e
mkVar Name
x = do
s -> SubstyM s e ()
forall s e. (Ord s, Ord e) => s -> SubstyM s e ()
substyDBdr s
s
s -> Name -> SubstyM s e ()
forall s e. (Ord s, Ord e) => s -> Name -> SubstyM s e ()
substyNBdr s
s Name
x
𝑂 RebindAction
aO ← (SubstAction s e ⟢ RebindAction) -> SubstAction s e -> RebindAction
forall a b. (a ⟢ b) -> a -> b
access SubstAction s e ⟢ RebindAction
forall s e. SubstAction s e ⟢ RebindAction
substActionRebindL (SubstAction s e -> RebindAction)
-> (SubstyAction s e -> 𝑂 (SubstAction s e))
-> SubstyAction s e
-> 𝑂 RebindAction
forall (t :: * -> *) b c a.
Functor t =>
(b -> c) -> (a -> t b) -> a -> t c
^∘ (SubstyAction s e ⌲ SubstAction s e)
-> SubstyAction s e -> 𝑂 (SubstAction s e)
forall a b. (a ⌲ b) -> a -> 𝑂 b
view SubstyAction s e ⌲ SubstAction s e
forall s e. SubstyAction s e ⌲ SubstAction s e
subst_SAL (SubstyAction s e -> 𝑂 RebindAction)
-> SubstyM s e (SubstyAction s e) -> SubstyM s e (𝑂 RebindAction)
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ SubstyM s e (SubstyAction s e)
forall (m :: * -> *) r. (Monad m, MonadReader r m) => m r
ask
case 𝑂 RebindAction
aO of
𝑂 RebindAction
None → SubstyM s e ()
forall (m :: * -> *). Return m => m ()
skip
Some RebindAction
ID_RA → SubstyM s e ()
forall (m :: * -> *). Return m => m ()
skip
Some RebindAction
AllNameless_RA →
(SubstyAction s e -> SubstyAction s e) -> SubstyM s e ()
forall (m :: * -> *) r.
(Monad m, MonadReader r m, MonadUCont m) =>
(r -> r) -> m ()
umodifyEnv ((SubstyAction s e -> SubstyAction s e) -> SubstyM s e ())
-> (SubstyAction s e -> SubstyAction s e) -> SubstyM s e ()
forall a b. (a -> b) -> a -> b
$ (SubstyAction s e ⌲ SubstAction s e)
-> (SubstAction s e -> SubstAction s e)
-> SubstyAction s e
-> SubstyAction s e
forall a b. (a ⌲ b) -> (b -> b) -> a -> a
forall (t :: * -> * -> *) a b.
Alter t =>
t a b -> (b -> b) -> a -> a
alter SubstyAction s e ⌲ SubstAction s e
forall s e. SubstyAction s e ⌲ SubstAction s e
subst_SAL ((SubstAction s e -> SubstAction s e)
-> SubstyAction s e -> SubstyAction s e)
-> (SubstAction s e -> SubstAction s e)
-> SubstyAction s e
-> SubstyAction s e
forall a b. (a -> b) -> a -> b
$ (SubstAction s e ⟢ Subst s e)
-> (Subst s e -> Subst s e) -> SubstAction s e -> SubstAction s e
forall a b. (a ⟢ b) -> (b -> b) -> a -> a
forall (t :: * -> * -> *) a b.
Alter t =>
t a b -> (b -> b) -> a -> a
alter SubstAction s e ⟢ Subst s e
forall s e. SubstAction s e ⟢ Subst s e
substActionSubstL ((Subst s e -> Subst s e) -> SubstAction s e -> SubstAction s e)
-> (Subst s e -> Subst s e) -> SubstAction s e -> SubstAction s e
forall a b. (a -> b) -> a -> b
$ (Subst s e -> Subst s e -> Subst s e)
-> Subst s e -> Subst s e -> Subst s e
forall a b c. (a -> b -> c) -> b -> a -> c
flip Subst s e -> Subst s e -> Subst s e
forall a. Append a => a -> a -> a
(⧺) (Subst s e -> Subst s e -> Subst s e)
-> Subst s e -> Subst s e -> Subst s e
forall a b. (a -> b) -> a -> b
$ [Subst s e] -> Subst s e
forall a t. (Monoid a, ToIter a t) => t -> a
concat
[ s -> Name -> ℕ64 -> Subst s e
forall s e. Ord s => s -> Name -> ℕ64 -> Subst s e
nintroSubst s
s Name
x ℕ64
1
, s -> Name -> e -> Subst s e
forall s e. Ord s => s -> Name -> e -> Subst s e
nbindSubst s
s Name
x (e -> Subst s e) -> e -> Subst s e
forall a b. (a -> b) -> a -> b
$ SVar -> e
mkVar (SVar -> e) -> SVar -> e
forall a b. (a -> b) -> a -> b
$ DVar -> SVar
D_SVar (DVar -> SVar) -> DVar -> SVar
forall a b. (a -> b) -> a -> b
$ ℕ64 -> DVar
DVar ℕ64
0
]
Some RebindAction
AllNamed_RA →
(SubstyAction s e -> SubstyAction s e) -> SubstyM s e ()
forall (m :: * -> *) r.
(Monad m, MonadReader r m, MonadUCont m) =>
(r -> r) -> m ()
umodifyEnv ((SubstyAction s e -> SubstyAction s e) -> SubstyM s e ())
-> (SubstyAction s e -> SubstyAction s e) -> SubstyM s e ()
forall a b. (a -> b) -> a -> b
$ (SubstyAction s e ⌲ SubstAction s e)
-> (SubstAction s e -> SubstAction s e)
-> SubstyAction s e
-> SubstyAction s e
forall a b. (a ⌲ b) -> (b -> b) -> a -> a
forall (t :: * -> * -> *) a b.
Alter t =>
t a b -> (b -> b) -> a -> a
alter SubstyAction s e ⌲ SubstAction s e
forall s e. SubstyAction s e ⌲ SubstAction s e
subst_SAL ((SubstAction s e -> SubstAction s e)
-> SubstyAction s e -> SubstyAction s e)
-> (SubstAction s e -> SubstAction s e)
-> SubstyAction s e
-> SubstyAction s e
forall a b. (a -> b) -> a -> b
$ (SubstAction s e ⟢ Subst s e)
-> (Subst s e -> Subst s e) -> SubstAction s e -> SubstAction s e
forall a b. (a ⟢ b) -> (b -> b) -> a -> a
forall (t :: * -> * -> *) a b.
Alter t =>
t a b -> (b -> b) -> a -> a
alter SubstAction s e ⟢ Subst s e
forall s e. SubstAction s e ⟢ Subst s e
substActionSubstL ((Subst s e -> Subst s e) -> SubstAction s e -> SubstAction s e)
-> (Subst s e -> Subst s e) -> SubstAction s e -> SubstAction s e
forall a b. (a -> b) -> a -> b
$ (Subst s e -> Subst s e -> Subst s e)
-> Subst s e -> Subst s e -> Subst s e
forall a b c. (a -> b -> c) -> b -> a -> c
flip Subst s e -> Subst s e -> Subst s e
forall a. Append a => a -> a -> a
(⧺) (Subst s e -> Subst s e -> Subst s e)
-> Subst s e -> Subst s e -> Subst s e
forall a b. (a -> b) -> a -> b
$ [Subst s e] -> Subst s e
forall a t. (Monoid a, ToIter a t) => t -> a
concat
[ s -> ℕ64 -> Subst s e
forall s e. Ord s => s -> ℕ64 -> Subst s e
dintroSubst s
s ℕ64
1
, s -> e -> Subst s e
forall s e. Ord s => s -> e -> Subst s e
dbindSubst s
s (e -> Subst s e) -> e -> Subst s e
forall a b. (a -> b) -> a -> b
$ SVar -> e
mkVar (SVar -> e) -> SVar -> e
forall a b. (a -> b) -> a -> b
$ Name -> SVar
svar_Name Name
x
]
substySVarG ∷ ∀ s e. (Ord s,Ord e,Substy s e e) ⇒ (DVar → e) → s → SVar → SubstyM s e e
substySVarG :: forall s e.
(Ord s, Ord e, Substy s e e) =>
(DVar -> e) -> s -> SVar -> SubstyM s e e
substySVarG DVar -> e
mkVar s
s SVar
x = do
let xName :: SName
xName = SVar -> SName
svarName SVar
x
xLevel :: DVar
xLevel = SVar -> DVar
svarLevel SVar
x
SubstyAction s e
γ ← SubstyM s e (SubstyAction s e)
forall (m :: * -> *) r. (Monad m, MonadReader r m) => m r
ask
case SubstyAction s e
γ of
FreeVars_SA FreeVarsAction s e
a → do
let
m ∷ ℕ64
m :: ℕ64
m = ℕ64 -> 𝑂 ℕ64 -> ℕ64
forall a. a -> 𝑂 a -> a
ifNone ℕ64
0 (𝑂 ℕ64 -> ℕ64) -> 𝑂 ℕ64 -> ℕ64
forall a b. (a -> b) -> a -> b
$ FreeVarsAction s e -> (s ∧ SName) ⇰ ℕ64
forall s e. FreeVarsAction s e -> (s ∧ SName) ⇰ ℕ64
freeVarsActionScope FreeVarsAction s e
a ((s ∧ SName) ⇰ ℕ64) -> (s ∧ SName) -> 𝑂 ℕ64
forall k v t. Lookup k v t => t -> k -> 𝑂 v
⋕? (s
s s -> SName -> s ∧ SName
forall a b. a -> b -> a ∧ b
:* SName
xName)
𝔹 -> (() -> SubstyM s e ()) -> SubstyM s e ()
forall (m :: * -> *). Return m => 𝔹 -> (() -> m ()) -> m ()
when (DVar -> ℕ64
unDVar DVar
xLevel ℕ64 -> ℕ64 -> 𝔹
forall a. Ord a => a -> a -> 𝔹
≥ ℕ64
m) ((() -> SubstyM s e ()) -> SubstyM s e ())
-> (() -> SubstyM s e ()) -> SubstyM s e ()
forall a b. (a -> b) -> a -> b
$ \ () → do
let
y :: UVar s e
y = SVar -> UVar s e
forall s e. SVar -> UVar s e
uvar_SVar (SVar -> UVar s e) -> SVar -> UVar s e
forall a b. (a -> b) -> a -> b
$ SName -> DVar -> SVar
mkSVar SName
xName (DVar -> SVar) -> DVar -> SVar
forall a b. (a -> b) -> a -> b
$ ℕ64 -> DVar
DVar (ℕ64 -> DVar) -> ℕ64 -> DVar
forall a b. (a -> b) -> a -> b
$ DVar -> ℕ64
unDVar DVar
xLevel ℕ64 -> ℕ64 -> ℕ64
forall a. Minus a => a -> a -> a
- ℕ64
m
𝔹 -> (() -> SubstyM s e ()) -> SubstyM s e ()
forall (m :: * -> *). Return m => 𝔹 -> (() -> m ()) -> m ()
when (FreeVarsAction s e -> s -> UVar s e -> 𝔹
forall s e. FreeVarsAction s e -> s -> UVar s e -> 𝔹
freeVarsActionFilter FreeVarsAction s e
a s
s UVar s e
y) ((() -> SubstyM s e ()) -> SubstyM s e ())
-> (() -> SubstyM s e ()) -> SubstyM s e ()
forall a b. (a -> b) -> a -> b
$ \ () →
(s ⇰ 𝑃 (UVar s e)) -> SubstyM s e ()
forall o (m :: * -> *). MonadWriter o m => o -> m ()
tell ((s ⇰ 𝑃 (UVar s e)) -> SubstyM s e ())
-> (s ⇰ 𝑃 (UVar s e)) -> SubstyM s e ()
forall a b. (a -> b) -> a -> b
$ s
s s -> 𝑃 (UVar s e) -> s ⇰ 𝑃 (UVar s e)
forall a. s -> a -> s ⇰ a
forall k s (d :: * -> *) a. Dict k s d => k -> a -> d a
↦ UVar s e -> 𝑃 (UVar s e)
forall a t. Single a t => a -> t
single UVar s e
y
e -> SubstyM s e e
forall a. a -> SubstyM s e a
forall (m :: * -> *) a. Return m => a -> m a
return (e -> SubstyM s e e) -> e -> SubstyM s e e
forall a b. (a -> b) -> a -> b
$ DVar -> e
mkVar DVar
xLevel
Subst_SA SubstAction s e
a → do
let 𝓈Ss ∷ (s ∧ SName) ⇰ SubstScoped (s ∧ SName) e
𝓈Ss :: (s ∧ SName) ⇰ SubstScoped (s ∧ SName) e
𝓈Ss = SubstSpaced (s ∧ Name) (s ∧ SName) e
-> (s ∧ SName) ⇰ SubstScoped (s ∧ SName) e
forall sG sS e. SubstSpaced sG sS e -> sS ⇰ SubstScoped sS e
substSpacedScoped (SubstSpaced (s ∧ Name) (s ∧ SName) e
-> (s ∧ SName) ⇰ SubstScoped (s ∧ SName) e)
-> SubstSpaced (s ∧ Name) (s ∧ SName) e
-> (s ∧ SName) ⇰ SubstScoped (s ∧ SName) e
forall a b. (a -> b) -> a -> b
$ Subst s e -> SubstSpaced (s ∧ Name) (s ∧ SName) e
forall s e. Subst s e -> SubstSpaced (s ∧ Name) (s ∧ SName) e
unSubst (Subst s e -> SubstSpaced (s ∧ Name) (s ∧ SName) e)
-> Subst s e -> SubstSpaced (s ∧ Name) (s ∧ SName) e
forall a b. (a -> b) -> a -> b
$ SubstAction s e -> Subst s e
forall s e. SubstAction s e -> Subst s e
substActionSubst SubstAction s e
a
case (s ∧ SName) ⇰ SubstScoped (s ∧ SName) e
𝓈Ss ((s ∧ SName) ⇰ SubstScoped (s ∧ SName) e)
-> (s ∧ SName) -> 𝑂 (SubstScoped (s ∧ SName) e)
forall k v t. Lookup k v t => t -> k -> 𝑂 v
⋕? (s
s s -> SName -> s ∧ SName
forall a b. a -> b -> a ∧ b
:* SName
xName) of
𝑂 (SubstScoped (s ∧ SName) e)
None →
e -> SubstyM s e e
forall a. a -> SubstyM s e a
forall (m :: * -> *) a. Return m => a -> m a
return (e -> SubstyM s e e) -> e -> SubstyM s e e
forall a b. (a -> b) -> a -> b
$ DVar -> e
mkVar DVar
xLevel
Some SubstScoped (s ∧ SName) e
𝓈 → case SubstScoped (s ∧ SName) e -> DVar -> SSubstElem (s ∧ SName) e
forall s e. SubstScoped s e -> DVar -> SSubstElem s e
lookupSubstScoped SubstScoped (s ∧ SName) e
𝓈 DVar
xLevel of
Var_SSE DVar
xLevel' →
e -> SubstyM s e e
forall a. a -> SubstyM s e a
forall (m :: * -> *) a. Return m => a -> m a
return (e -> SubstyM s e e) -> e -> SubstyM s e e
forall a b. (a -> b) -> a -> b
$ DVar -> e
mkVar DVar
xLevel'
Trm_SSE (SubstElem (s ∧ SName) ⇰ ℕ64
ιs 𝑂 e
eO) →
𝑂 e -> SubstyM s e e
forall (m :: * -> *) a. (Monad m, MonadFail m) => 𝑂 a -> m a
failEff (𝑂 e -> SubstyM s e e) -> 𝑂 e -> SubstyM s e e
forall a b. (a -> b) -> a -> b
$ Subst s e -> e -> 𝑂 e
forall s e a. Substy s e a => Subst s e -> a -> 𝑂 a
subst (SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
forall s e. SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
Subst (SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e)
-> SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
forall a b. (a -> b) -> a -> b
$ ((s ∧ SName) ⇰ ℕ64) -> SubstSpaced (s ∧ Name) (s ∧ SName) e
forall sS sG e. (sS ⇰ ℕ64) -> SubstSpaced sG sS e
introSubstSpaced (s ∧ SName) ⇰ ℕ64
ιs) (e -> 𝑂 e) -> 𝑂 e -> 𝑂 e
forall (m :: * -> *) a b. Bind m => (a -> m b) -> m a -> m b
*$ 𝑂 e
eO
MetaSubst_SA MetaSubst s e
_ →
e -> SubstyM s e e
forall a. a -> SubstyM s e a
forall (m :: * -> *) a. Return m => a -> m a
return (e -> SubstyM s e e) -> e -> SubstyM s e e
forall a b. (a -> b) -> a -> b
$ DVar -> e
mkVar DVar
xLevel
substyDVar ∷ (Ord s,Ord e,Substy s e e) ⇒ (DVar → e) → s → DVar → SubstyM s e e
substyDVar :: forall s e.
(Ord s, Ord e, Substy s e e) =>
(DVar -> e) -> s -> DVar -> SubstyM s e e
substyDVar DVar -> e
mkVar s
s = (DVar -> e) -> s -> SVar -> SubstyM s e e
forall s e.
(Ord s, Ord e, Substy s e e) =>
(DVar -> e) -> s -> SVar -> SubstyM s e e
substySVarG DVar -> e
mkVar s
s (SVar -> SubstyM s e e) -> (DVar -> SVar) -> DVar -> SubstyM s e e
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ DVar -> SVar
D_SVar
substyNVar ∷ (Ord s,Ord e,Substy s e e) ⇒ (NVar → e) → s → NVar → SubstyM s e e
substyNVar :: forall s e.
(Ord s, Ord e, Substy s e e) =>
(NVar -> e) -> s -> NVar -> SubstyM s e e
substyNVar NVar -> e
mkVar s
s NVar
x = (DVar -> e) -> s -> SVar -> SubstyM s e e
forall s e.
(Ord s, Ord e, Substy s e e) =>
(DVar -> e) -> s -> SVar -> SubstyM s e e
substySVarG (\ DVar
n → NVar -> e
mkVar (NVar -> e) -> NVar -> e
forall a b. (a -> b) -> a -> b
$ DVar -> Name -> NVar
NVar DVar
n (Name -> NVar) -> Name -> NVar
forall a b. (a -> b) -> a -> b
$ NVar -> Name
nvarName NVar
x) s
s (SVar -> SubstyM s e e) -> SVar -> SubstyM s e e
forall a b. (a -> b) -> a -> b
$ NVar -> SVar
N_SVar NVar
x
substyGVar ∷ ∀ s e. (Ord s,Ord e,Substy s e e) ⇒ (GVar → e) → s → GVar → SubstyM s e e
substyGVar :: forall s e.
(Ord s, Ord e, Substy s e e) =>
(GVar -> e) -> s -> GVar -> SubstyM s e e
substyGVar GVar -> e
mkVar s
s GVar
x = do
SubstyAction s e
γ ← SubstyM s e (SubstyAction s e)
forall (m :: * -> *) r. (Monad m, MonadReader r m) => m r
ask
case SubstyAction s e
γ of
FreeVars_SA FreeVarsAction s e
a → do
let y :: UVar s e
y = GVar -> UVar s e
forall s e. GVar -> UVar s e
G_UVar GVar
x
𝔹 -> (() -> SubstyM s e ()) -> SubstyM s e ()
forall (m :: * -> *). Return m => 𝔹 -> (() -> m ()) -> m ()
when (FreeVarsAction s e -> s -> UVar s e -> 𝔹
forall s e. FreeVarsAction s e -> s -> UVar s e -> 𝔹
freeVarsActionFilter FreeVarsAction s e
a s
s UVar s e
y) ((() -> SubstyM s e ()) -> SubstyM s e ())
-> (() -> SubstyM s e ()) -> SubstyM s e ()
forall a b. (a -> b) -> a -> b
$ \ () →
(s ⇰ 𝑃 (UVar s e)) -> SubstyM s e ()
forall o (m :: * -> *). MonadWriter o m => o -> m ()
tell ((s ⇰ 𝑃 (UVar s e)) -> SubstyM s e ())
-> (s ⇰ 𝑃 (UVar s e)) -> SubstyM s e ()
forall a b. (a -> b) -> a -> b
$ s
s s -> 𝑃 (UVar s e) -> s ⇰ 𝑃 (UVar s e)
forall a. s -> a -> s ⇰ a
forall k s (d :: * -> *) a. Dict k s d => k -> a -> d a
↦ UVar s e -> 𝑃 (UVar s e)
forall a t. Single a t => a -> t
single UVar s e
y
e -> SubstyM s e e
forall a. a -> SubstyM s e a
forall (m :: * -> *) a. Return m => a -> m a
return (e -> SubstyM s e e) -> e -> SubstyM s e e
forall a b. (a -> b) -> a -> b
$ GVar -> e
mkVar GVar
x
Subst_SA SubstAction s e
𝓈A → do
let 𝓈Gs ∷ (s ∧ Name) ⇰ SubstElem (s ∧ SName) e
𝓈Gs :: (s ∧ Name) ⇰ SubstElem (s ∧ SName) e
𝓈Gs = SubstSpaced (s ∧ Name) (s ∧ SName) e
-> (s ∧ Name) ⇰ SubstElem (s ∧ SName) e
forall sG sS e. SubstSpaced sG sS e -> sG ⇰ SubstElem sS e
substSpacedUnscoped (SubstSpaced (s ∧ Name) (s ∧ SName) e
-> (s ∧ Name) ⇰ SubstElem (s ∧ SName) e)
-> SubstSpaced (s ∧ Name) (s ∧ SName) e
-> (s ∧ Name) ⇰ SubstElem (s ∧ SName) e
forall a b. (a -> b) -> a -> b
$ Subst s e -> SubstSpaced (s ∧ Name) (s ∧ SName) e
forall s e. Subst s e -> SubstSpaced (s ∧ Name) (s ∧ SName) e
unSubst (Subst s e -> SubstSpaced (s ∧ Name) (s ∧ SName) e)
-> Subst s e -> SubstSpaced (s ∧ Name) (s ∧ SName) e
forall a b. (a -> b) -> a -> b
$ SubstAction s e -> Subst s e
forall s e. SubstAction s e -> Subst s e
substActionSubst SubstAction s e
𝓈A
case (s ∧ Name) ⇰ SubstElem (s ∧ SName) e
𝓈Gs ((s ∧ Name) ⇰ SubstElem (s ∧ SName) e)
-> (s ∧ Name) -> 𝑂 (SubstElem (s ∧ SName) e)
forall k v t. Lookup k v t => t -> k -> 𝑂 v
⋕? (s
s s -> Name -> s ∧ Name
forall a b. a -> b -> a ∧ b
:* GVar -> Name
unGVar GVar
x) of
𝑂 (SubstElem (s ∧ SName) e)
None → e -> SubstyM s e e
forall a. a -> SubstyM s e a
forall (m :: * -> *) a. Return m => a -> m a
return (e -> SubstyM s e e) -> e -> SubstyM s e e
forall a b. (a -> b) -> a -> b
$ GVar -> e
mkVar GVar
x
Some (SubstElem (s ∧ SName) ⇰ ℕ64
ιs 𝑂 e
eO) → 𝑂 e -> SubstyM s e e
forall (m :: * -> *) a. (Monad m, MonadFail m) => 𝑂 a -> m a
failEff (𝑂 e -> SubstyM s e e) -> 𝑂 e -> SubstyM s e e
forall a b. (a -> b) -> a -> b
$ Subst s e -> e -> 𝑂 e
forall s e a. Substy s e a => Subst s e -> a -> 𝑂 a
subst (SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
forall s e. SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
Subst (SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e)
-> SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
forall a b. (a -> b) -> a -> b
$ ((s ∧ SName) ⇰ ℕ64) -> SubstSpaced (s ∧ Name) (s ∧ SName) e
forall sS sG e. (sS ⇰ ℕ64) -> SubstSpaced sG sS e
introSubstSpaced (s ∧ SName) ⇰ ℕ64
ιs) (e -> 𝑂 e) -> 𝑂 e -> 𝑂 e
forall (m :: * -> *) a b. Bind m => (a -> m b) -> m a -> m b
*$ 𝑂 e
eO
MetaSubst_SA MetaSubst s e
_ → e -> SubstyM s e e
forall a. a -> SubstyM s e a
forall (m :: * -> *) a. Return m => a -> m a
return (e -> SubstyM s e e) -> e -> SubstyM s e e
forall a b. (a -> b) -> a -> b
$ GVar -> e
mkVar GVar
x
substySVar ∷ (Ord s,Ord e,Substy s e e) ⇒ (SVar → e) → s → SVar → SubstyM s e e
substySVar :: forall s e.
(Ord s, Ord e, Substy s e e) =>
(SVar -> e) -> s -> SVar -> SubstyM s e e
substySVar SVar -> e
mkVar s
s SVar
x = (DVar -> e) -> s -> SVar -> SubstyM s e e
forall s e.
(Ord s, Ord e, Substy s e e) =>
(DVar -> e) -> s -> SVar -> SubstyM s e e
substySVarG (SVar -> e
mkVar (SVar -> e) -> (DVar -> SVar) -> DVar -> e
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ SName -> DVar -> SVar
mkSVar (SVar -> SName
svarName SVar
x)) s
s SVar
x
substyVar ∷ (Ord s,Ord e,Pretty e,Pretty s,Substy s e e) ⇒ (Var → e) → s → Var → SubstyM s e e
substyVar :: forall s e.
(Ord s, Ord e, Pretty e, Pretty s, Substy s e e) =>
(Var -> e) -> s -> Var -> SubstyM s e e
substyVar Var -> e
mkVar s
s = \case
D_Var DVar
x → (DVar -> e) -> s -> DVar -> SubstyM s e e
forall s e.
(Ord s, Ord e, Substy s e e) =>
(DVar -> e) -> s -> DVar -> SubstyM s e e
substyDVar (Var -> e
mkVar (Var -> e) -> (DVar -> Var) -> DVar -> e
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ DVar -> Var
D_Var) s
s DVar
x
N_Var NVar
x → (NVar -> e) -> s -> NVar -> SubstyM s e e
forall s e.
(Ord s, Ord e, Substy s e e) =>
(NVar -> e) -> s -> NVar -> SubstyM s e e
substyNVar (Var -> e
mkVar (Var -> e) -> (NVar -> Var) -> NVar -> e
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ NVar -> Var
N_Var) s
s NVar
x
G_Var GVar
x → (GVar -> e) -> s -> GVar -> SubstyM s e e
forall s e.
(Ord s, Ord e, Substy s e e) =>
(GVar -> e) -> s -> GVar -> SubstyM s e e
substyGVar (Var -> e
mkVar (Var -> e) -> (GVar -> Var) -> GVar -> e
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ GVar -> Var
G_Var) s
s GVar
x
substyMVar ∷ ∀ s e. (Ord s,Ord e,Pretty e,Pretty s,Substy s e e) ⇒ (MVar s e → e) → s → MVar s e → SubstyM s e e
substyMVar :: forall s e.
(Ord s, Ord e, Pretty e, Pretty s, Substy s e e) =>
(MVar s e -> e) -> s -> MVar s e -> SubstyM s e e
substyMVar MVar s e -> e
mkVar s
s MVar s e
x = do
SubstyAction s e
γ ← SubstyM s e (SubstyAction s e)
forall (m :: * -> *) r. (Monad m, MonadReader r m) => m r
ask
case SubstyAction s e
γ of
FreeVars_SA FreeVarsAction s e
a → do
let y :: UVar s e
y = MVar s e -> UVar s e
forall s e. MVar s e -> UVar s e
M_UVar MVar s e
x
𝔹 -> (() -> SubstyM s e ()) -> SubstyM s e ()
forall (m :: * -> *). Return m => 𝔹 -> (() -> m ()) -> m ()
when (FreeVarsAction s e -> s -> UVar s e -> 𝔹
forall s e. FreeVarsAction s e -> s -> UVar s e -> 𝔹
freeVarsActionFilter FreeVarsAction s e
a s
s UVar s e
y) ((() -> SubstyM s e ()) -> SubstyM s e ())
-> (() -> SubstyM s e ()) -> SubstyM s e ()
forall a b. (a -> b) -> a -> b
$ \ () →
(s ⇰ 𝑃 (UVar s e)) -> SubstyM s e ()
forall o (m :: * -> *). MonadWriter o m => o -> m ()
tell ((s ⇰ 𝑃 (UVar s e)) -> SubstyM s e ())
-> (s ⇰ 𝑃 (UVar s e)) -> SubstyM s e ()
forall a b. (a -> b) -> a -> b
$ s
s s -> 𝑃 (UVar s e) -> s ⇰ 𝑃 (UVar s e)
forall a. s -> a -> s ⇰ a
forall k s (d :: * -> *) a. Dict k s d => k -> a -> d a
↦ UVar s e -> 𝑃 (UVar s e)
forall a t. Single a t => a -> t
single UVar s e
y
e -> SubstyM s e e
forall a. a -> SubstyM s e a
forall (m :: * -> *) a. Return m => a -> m a
return (e -> SubstyM s e e) -> e -> SubstyM s e e
forall a b. (a -> b) -> a -> b
$ MVar s e -> e
mkVar MVar s e
x
Subst_SA SubstAction s e
𝓈A → do
let 𝓈 ∷ Subst s e
𝓈 :: Subst s e
𝓈 = SubstAction s e -> Subst s e
forall s e. SubstAction s e -> Subst s e
substActionSubst SubstAction s e
𝓈A
e -> SubstyM s e e
forall a. a -> SubstyM s e a
forall (m :: * -> *) a. Return m => a -> m a
return (e -> SubstyM s e e) -> e -> SubstyM s e e
forall a b. (a -> b) -> a -> b
$ MVar s e -> e
mkVar (MVar s e -> e) -> MVar s e -> e
forall a b. (a -> b) -> a -> b
$ Subst s e -> MVar s e -> MVar s e
forall s e.
(Ord s, Substy s e e) =>
Subst s e -> MVar s e -> MVar s e
substMVar Subst s e
𝓈 MVar s e
x
MetaSubst_SA (MetaSubst (s ∧ Name) ⇰ SubstElem (s ∧ SName) e
𝓈M) →
case (s ∧ Name) ⇰ SubstElem (s ∧ SName) e
𝓈M ((s ∧ Name) ⇰ SubstElem (s ∧ SName) e)
-> (s ∧ Name) -> 𝑂 (SubstElem (s ∧ SName) e)
forall k v t. Lookup k v t => t -> k -> 𝑂 v
⋕? (s
s s -> Name -> s ∧ Name
forall a b. a -> b -> a ∧ b
:* MVar s e -> Name
forall s e. MVar s e -> Name
mvarName MVar s e
x) of
𝑂 (SubstElem (s ∧ SName) e)
None → e -> SubstyM s e e
forall a. a -> SubstyM s e a
forall (m :: * -> *) a. Return m => a -> m a
return (e -> SubstyM s e e) -> e -> SubstyM s e e
forall a b. (a -> b) -> a -> b
$ MVar s e -> e
mkVar MVar s e
x
Some (SubstElem (s ∧ SName) ⇰ ℕ64
ιs 𝑂 e
eO) →
𝑂 e -> SubstyM s e e
forall (m :: * -> *) a. (Monad m, MonadFail m) => 𝑂 a -> m a
failEff (𝑂 e -> SubstyM s e e) -> 𝑂 e -> SubstyM s e e
forall a b. (a -> b) -> a -> b
$ Subst s e -> e -> 𝑂 e
forall s e a. Substy s e a => Subst s e -> a -> 𝑂 a
subst (MVar s e -> Subst s e
forall s e. MVar s e -> Subst s e
mvarSubst MVar s e
x Subst s e -> Subst s e -> Subst s e
forall a. Append a => a -> a -> a
⧺ SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
forall s e. SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
Subst (((s ∧ SName) ⇰ ℕ64) -> SubstSpaced (s ∧ Name) (s ∧ SName) e
forall sS sG e. (sS ⇰ ℕ64) -> SubstSpaced sG sS e
introSubstSpaced (s ∧ SName) ⇰ ℕ64
ιs)) (e -> 𝑂 e) -> 𝑂 e -> 𝑂 e
forall (m :: * -> *) a b. Bind m => (a -> m b) -> m a -> m b
*$ 𝑂 e
eO
substyUVar ∷ (Ord s,Ord e,Pretty e,Pretty s,Substy s e e) ⇒ (UVar s e → e) → s → UVar s e → SubstyM s e e
substyUVar :: forall s e.
(Ord s, Ord e, Pretty e, Pretty s, Substy s e e) =>
(UVar s e -> e) -> s -> UVar s e -> SubstyM s e e
substyUVar UVar s e -> e
mkVar s
s = \case
D_UVar DVar
x → (DVar -> e) -> s -> DVar -> SubstyM s e e
forall s e.
(Ord s, Ord e, Substy s e e) =>
(DVar -> e) -> s -> DVar -> SubstyM s e e
substyDVar (UVar s e -> e
mkVar (UVar s e -> e) -> (DVar -> UVar s e) -> DVar -> e
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ DVar -> UVar s e
forall s e. DVar -> UVar s e
D_UVar) s
s DVar
x
N_UVar NVar
x → (NVar -> e) -> s -> NVar -> SubstyM s e e
forall s e.
(Ord s, Ord e, Substy s e e) =>
(NVar -> e) -> s -> NVar -> SubstyM s e e
substyNVar (UVar s e -> e
mkVar (UVar s e -> e) -> (NVar -> UVar s e) -> NVar -> e
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ NVar -> UVar s e
forall s e. NVar -> UVar s e
N_UVar) s
s NVar
x
G_UVar GVar
x → (GVar -> e) -> s -> GVar -> SubstyM s e e
forall s e.
(Ord s, Ord e, Substy s e e) =>
(GVar -> e) -> s -> GVar -> SubstyM s e e
substyGVar (UVar s e -> e
mkVar (UVar s e -> e) -> (GVar -> UVar s e) -> GVar -> e
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ GVar -> UVar s e
forall s e. GVar -> UVar s e
G_UVar) s
s GVar
x
M_UVar MVar s e
x → (MVar s e -> e) -> s -> MVar s e -> SubstyM s e e
forall s e.
(Ord s, Ord e, Pretty e, Pretty s, Substy s e e) =>
(MVar s e -> e) -> s -> MVar s e -> SubstyM s e e
substyMVar (UVar s e -> e
mkVar (UVar s e -> e) -> (MVar s e -> UVar s e) -> MVar s e -> e
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ MVar s e -> UVar s e
forall s e. MVar s e -> UVar s e
M_UVar) s
s MVar s e
x
syntaxSubst ∷ LexerBasicSyntax
syntaxSubst :: LexerBasicSyntax
syntaxSubst = [LexerBasicSyntax] -> LexerBasicSyntax
forall a t. (Monoid a, ToIter a t) => t -> a
concat
[ LexerBasicSyntax
syntaxVarInf
, LexerBasicSyntax
forall a. Null a => a
null { lexerBasicSyntaxPuns = pow
[ ",","...","…"
, "{","}","[","]"
, "|->","↦"
, "==","≡","+"
] }
]
syntaxMVar ∷ LexerBasicSyntax
syntaxMVar :: LexerBasicSyntax
syntaxMVar = [LexerBasicSyntax] -> LexerBasicSyntax
forall a t. (Monoid a, ToIter a t) => t -> a
concat
[ LexerBasicSyntax
syntaxSubst
, LexerBasicSyntax
forall a. Null a => a
null { lexerBasicSyntaxPuns = pow
[ ":m"
] }
]
syntaxUVar ∷ LexerBasicSyntax
syntaxUVar :: LexerBasicSyntax
syntaxUVar = [LexerBasicSyntax] -> LexerBasicSyntax
forall a t. (Monoid a, ToIter a t) => t -> a
concat
[ LexerBasicSyntax
syntaxVar
, LexerBasicSyntax
syntaxMVar
]
data ParseSubstAction e = ParseSubstAction
{ forall e. ParseSubstAction e -> 𝐼 ℕ64
parseSubstActionShfts ∷ 𝐼 ℕ64
, forall e. ParseSubstAction e -> 𝑂 DVar ⇰ 𝐼 e
parseSubstActionElems ∷ 𝑂 DVar ⇰ 𝐼 e
, forall e. ParseSubstAction e -> 𝐼 (ℕ64 ∧ ℤ64)
parseSubstActionIncrs ∷ 𝐼 (ℕ64 ∧ ℤ64)
} deriving (ParseSubstAction e -> ParseSubstAction e -> 𝔹
(ParseSubstAction e -> ParseSubstAction e -> 𝔹)
-> (ParseSubstAction e -> ParseSubstAction e -> 𝔹)
-> Eq (ParseSubstAction e)
forall e. Eq e => ParseSubstAction e -> ParseSubstAction e -> 𝔹
forall a. (a -> a -> 𝔹) -> (a -> a -> 𝔹) -> Eq a
$c== :: forall e. Eq e => ParseSubstAction e -> ParseSubstAction e -> 𝔹
== :: ParseSubstAction e -> ParseSubstAction e -> 𝔹
$c/= :: forall e. Eq e => ParseSubstAction e -> ParseSubstAction e -> 𝔹
/= :: ParseSubstAction e -> ParseSubstAction e -> 𝔹
Eq,Eq (ParseSubstAction e)
Eq (ParseSubstAction e) =>
(ParseSubstAction e -> ParseSubstAction e -> Ordering)
-> (ParseSubstAction e -> ParseSubstAction e -> 𝔹)
-> (ParseSubstAction e -> ParseSubstAction e -> 𝔹)
-> (ParseSubstAction e -> ParseSubstAction e -> 𝔹)
-> (ParseSubstAction e -> ParseSubstAction e -> 𝔹)
-> (ParseSubstAction e -> ParseSubstAction e -> ParseSubstAction e)
-> (ParseSubstAction e -> ParseSubstAction e -> ParseSubstAction e)
-> Ord (ParseSubstAction e)
ParseSubstAction e -> ParseSubstAction e -> 𝔹
ParseSubstAction e -> ParseSubstAction e -> Ordering
ParseSubstAction e -> ParseSubstAction e -> ParseSubstAction e
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> 𝔹)
-> (a -> a -> 𝔹)
-> (a -> a -> 𝔹)
-> (a -> a -> 𝔹)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall e. Ord e => Eq (ParseSubstAction e)
forall e. Ord e => ParseSubstAction e -> ParseSubstAction e -> 𝔹
forall e.
Ord e =>
ParseSubstAction e -> ParseSubstAction e -> Ordering
forall e.
Ord e =>
ParseSubstAction e -> ParseSubstAction e -> ParseSubstAction e
$ccompare :: forall e.
Ord e =>
ParseSubstAction e -> ParseSubstAction e -> Ordering
compare :: ParseSubstAction e -> ParseSubstAction e -> Ordering
$c< :: forall e. Ord e => ParseSubstAction e -> ParseSubstAction e -> 𝔹
< :: ParseSubstAction e -> ParseSubstAction e -> 𝔹
$c<= :: forall e. Ord e => ParseSubstAction e -> ParseSubstAction e -> 𝔹
<= :: ParseSubstAction e -> ParseSubstAction e -> 𝔹
$c> :: forall e. Ord e => ParseSubstAction e -> ParseSubstAction e -> 𝔹
> :: ParseSubstAction e -> ParseSubstAction e -> 𝔹
$c>= :: forall e. Ord e => ParseSubstAction e -> ParseSubstAction e -> 𝔹
>= :: ParseSubstAction e -> ParseSubstAction e -> 𝔹
$cmax :: forall e.
Ord e =>
ParseSubstAction e -> ParseSubstAction e -> ParseSubstAction e
max :: ParseSubstAction e -> ParseSubstAction e -> ParseSubstAction e
$cmin :: forall e.
Ord e =>
ParseSubstAction e -> ParseSubstAction e -> ParseSubstAction e
min :: ParseSubstAction e -> ParseSubstAction e -> ParseSubstAction e
Ord,Int -> ParseSubstAction e -> ShowS
[ParseSubstAction e] -> ShowS
ParseSubstAction e -> String
(Int -> ParseSubstAction e -> ShowS)
-> (ParseSubstAction e -> String)
-> ([ParseSubstAction e] -> ShowS)
-> Show (ParseSubstAction e)
forall e. Show e => Int -> ParseSubstAction e -> ShowS
forall e. Show e => [ParseSubstAction e] -> ShowS
forall e. Show e => ParseSubstAction e -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall e. Show e => Int -> ParseSubstAction e -> ShowS
showsPrec :: Int -> ParseSubstAction e -> ShowS
$cshow :: forall e. Show e => ParseSubstAction e -> String
show :: ParseSubstAction e -> String
$cshowList :: forall e. Show e => [ParseSubstAction e] -> ShowS
showList :: [ParseSubstAction e] -> ShowS
Show)
makeLenses ''ParseSubstAction
parseSubstActionShft ∷ ℕ64 → ParseSubstAction e
parseSubstActionShft :: forall e. ℕ64 -> ParseSubstAction e
parseSubstActionShft ℕ64
n = ParseSubstAction e
forall a. Null a => a
null { parseSubstActionShfts = single n }
parseSubstActionElem ∷ 𝑂 DVar → e → ParseSubstAction e
parseSubstActionElem :: forall e. 𝑂 DVar -> e -> ParseSubstAction e
parseSubstActionElem 𝑂 DVar
nO e
e = ParseSubstAction Any
forall a. Null a => a
null { parseSubstActionElems = nO ↦ single e }
parseSubstActionIncr ∷ ℕ64 → ℤ64 → ParseSubstAction e
parseSubstActionIncr :: forall e. ℕ64 -> ℤ64 -> ParseSubstAction e
parseSubstActionIncr ℕ64
n ℤ64
i = ParseSubstAction e
forall a. Null a => a
null { parseSubstActionIncrs = single $ n :* i }
instance Null (ParseSubstAction e) where
null :: ParseSubstAction e
null = 𝐼 ℕ64 -> (𝑂 DVar ⇰ 𝐼 e) -> 𝐼 (ℕ64 ∧ ℤ64) -> ParseSubstAction e
forall e.
𝐼 ℕ64 -> (𝑂 DVar ⇰ 𝐼 e) -> 𝐼 (ℕ64 ∧ ℤ64) -> ParseSubstAction e
ParseSubstAction 𝐼 ℕ64
forall a. Null a => a
null 𝑂 DVar ⇰ 𝐼 e
forall a. Null a => a
null 𝐼 (ℕ64 ∧ ℤ64)
forall a. Null a => a
null
instance Append (ParseSubstAction e) where
ParseSubstAction 𝐼 ℕ64
shfts₁ 𝑂 DVar ⇰ 𝐼 e
elems₁ 𝐼 (ℕ64 ∧ ℤ64)
incrs₁ ⧺ :: ParseSubstAction e -> ParseSubstAction e -> ParseSubstAction e
⧺ ParseSubstAction 𝐼 ℕ64
shfts₂ 𝑂 DVar ⇰ 𝐼 e
elems₂ 𝐼 (ℕ64 ∧ ℤ64)
incrs₂ =
𝐼 ℕ64 -> (𝑂 DVar ⇰ 𝐼 e) -> 𝐼 (ℕ64 ∧ ℤ64) -> ParseSubstAction e
forall e.
𝐼 ℕ64 -> (𝑂 DVar ⇰ 𝐼 e) -> 𝐼 (ℕ64 ∧ ℤ64) -> ParseSubstAction e
ParseSubstAction (𝐼 ℕ64
shfts₁ 𝐼 ℕ64 -> 𝐼 ℕ64 -> 𝐼 ℕ64
forall a. Append a => a -> a -> a
⧺ 𝐼 ℕ64
shfts₂) (𝑂 DVar ⇰ 𝐼 e
elems₁ (𝑂 DVar ⇰ 𝐼 e) -> (𝑂 DVar ⇰ 𝐼 e) -> 𝑂 DVar ⇰ 𝐼 e
forall a. Append a => a -> a -> a
⧺ 𝑂 DVar ⇰ 𝐼 e
elems₂) (𝐼 (ℕ64 ∧ ℤ64) -> ParseSubstAction e)
-> 𝐼 (ℕ64 ∧ ℤ64) -> ParseSubstAction e
forall a b. (a -> b) -> a -> b
$ 𝐼 (ℕ64 ∧ ℤ64)
incrs₁ 𝐼 (ℕ64 ∧ ℤ64) -> 𝐼 (ℕ64 ∧ ℤ64) -> 𝐼 (ℕ64 ∧ ℤ64)
forall a. Append a => a -> a -> a
⧺ 𝐼 (ℕ64 ∧ ℤ64)
incrs₂
instance Monoid (ParseSubstAction e)
type ParseSubstActions e = SGName ⇰ ParseSubstAction e
pSubst ∷ ∀ e. (Eq e,Substy () e e) ⇒ (() → CParser TokenBasic e) → CParser TokenBasic (Subst () e)
pSubst :: forall e.
(Eq e, Substy () e e) =>
(() -> CParser TokenBasic e) -> CParser TokenBasic (Subst () e)
pSubst () -> CParser TokenBasic e
pE = Text
-> CParser TokenBasic (Subst () e)
-> CParser TokenBasic (Subst () e)
forall t a. Ord t => Text -> CParser t a -> CParser t a
cpNewContext Text
"subst" (CParser TokenBasic (Subst () e)
-> CParser TokenBasic (Subst () e))
-> CParser TokenBasic (Subst () e)
-> CParser TokenBasic (Subst () e)
forall a b. (a -> b) -> a -> b
$ do
let pSubstIncr ∷ Var → CParser TokenBasic (ParseSubstActions e)
pSubstIncr :: Var -> CParser TokenBasic (ParseSubstActions e)
pSubstIncr Var
x₁ = do
CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall (m :: * -> *) a. Functor m => m a -> m ()
void (CParser TokenBasic TokenBasic -> CParser TokenBasic ())
-> CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ [CParser TokenBasic TokenBasic] -> CParser TokenBasic TokenBasic
forall a t. (Monoid a, ToIter a t) => t -> a
concat ([CParser TokenBasic TokenBasic] -> CParser TokenBasic TokenBasic)
-> [CParser TokenBasic TokenBasic] -> CParser TokenBasic TokenBasic
forall a b. (a -> b) -> a -> b
$ (Text -> CParser TokenBasic TokenBasic)
-> [Text] -> [CParser TokenBasic TokenBasic]
forall a b. (a -> b) -> [a] -> [b]
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
map Text -> CParser TokenBasic TokenBasic
cpSyntax [Text
"...",Text
"…"]
VarInf
x₂ ← Text -> CParser TokenBasic VarInf -> CParser TokenBasic VarInf
forall t a. Ord t => Text -> CParser t a -> CParser t a
cpErr Text
"parsing varinf" CParser TokenBasic VarInf
pVarInf
CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall (m :: * -> *) a. Functor m => m a -> m ()
void (CParser TokenBasic TokenBasic -> CParser TokenBasic ())
-> CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ [CParser TokenBasic TokenBasic] -> CParser TokenBasic TokenBasic
forall a t. (Monoid a, ToIter a t) => t -> a
concat ([CParser TokenBasic TokenBasic] -> CParser TokenBasic TokenBasic)
-> [CParser TokenBasic TokenBasic] -> CParser TokenBasic TokenBasic
forall a b. (a -> b) -> a -> b
$ (Text -> CParser TokenBasic TokenBasic)
-> [Text] -> [CParser TokenBasic TokenBasic]
forall a b. (a -> b) -> [a] -> [b]
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
map Text -> CParser TokenBasic TokenBasic
cpSyntax [Text
"|->",Text
"↦"]
CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall (m :: * -> *) a. Functor m => m a -> m ()
void (CParser TokenBasic TokenBasic -> CParser TokenBasic ())
-> CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ [CParser TokenBasic TokenBasic] -> CParser TokenBasic TokenBasic
forall a t. (Monoid a, ToIter a t) => t -> a
concat ([CParser TokenBasic TokenBasic] -> CParser TokenBasic TokenBasic)
-> [CParser TokenBasic TokenBasic] -> CParser TokenBasic TokenBasic
forall a b. (a -> b) -> a -> b
$ (Text -> CParser TokenBasic TokenBasic)
-> [Text] -> [CParser TokenBasic TokenBasic]
forall a b. (a -> b) -> [a] -> [b]
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
map Text -> CParser TokenBasic TokenBasic
cpSyntax [Text
"["]
ℤ64
i ← Text -> CParser TokenBasic ℤ64 -> CParser TokenBasic ℤ64
forall t a. Ord t => Text -> CParser t a -> CParser t a
cpErr Text
"valid subst shift/incr update" (CParser TokenBasic ℤ64 -> CParser TokenBasic ℤ64)
-> CParser TokenBasic ℤ64 -> CParser TokenBasic ℤ64
forall a b. (a -> b) -> a -> b
$ [CParser TokenBasic ℤ64] -> CParser TokenBasic ℤ64
forall a t. (Monoid a, ToIter a t) => t -> a
concat
[ do CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall (m :: * -> *) a. Functor m => m a -> m ()
void (CParser TokenBasic TokenBasic -> CParser TokenBasic ())
-> CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ [CParser TokenBasic TokenBasic] -> CParser TokenBasic TokenBasic
forall a t. (Monoid a, ToIter a t) => t -> a
concat ([CParser TokenBasic TokenBasic] -> CParser TokenBasic TokenBasic)
-> [CParser TokenBasic TokenBasic] -> CParser TokenBasic TokenBasic
forall a b. (a -> b) -> a -> b
$ (Text -> CParser TokenBasic TokenBasic)
-> [Text] -> [CParser TokenBasic TokenBasic]
forall a b. (a -> b) -> [a] -> [b]
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
map Text -> CParser TokenBasic TokenBasic
cpSyntax [Text
"==",Text
"≡"]
ℤ64 -> CParser TokenBasic ℤ64
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return ℤ64
0
, do ℤ64
i ← CParser TokenBasic ℤ64
cpInt64
𝔹 -> CParser TokenBasic ()
forall t. 𝔹 -> CParser t ()
cpGuard (𝔹 -> CParser TokenBasic ()) -> 𝔹 -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ ℤ64
i ℤ64 -> ℤ64 -> 𝔹
forall a. Ord a => a -> a -> 𝔹
< ℤ64
0
ℤ64 -> CParser TokenBasic ℤ64
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return ℤ64
i
, do CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall (m :: * -> *) a. Functor m => m a -> m ()
void (CParser TokenBasic TokenBasic -> CParser TokenBasic ())
-> CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ Text -> CParser TokenBasic TokenBasic
cpSyntax Text
"+"
ℤ64
i ← CParser TokenBasic ℤ64
cpInt64
𝔹 -> CParser TokenBasic ()
forall t. 𝔹 -> CParser t ()
cpGuard (𝔹 -> CParser TokenBasic ()) -> 𝔹 -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ ℤ64
i ℤ64 -> ℤ64 -> 𝔹
forall a. Ord a => a -> a -> 𝔹
> ℤ64
0
ℤ64 -> CParser TokenBasic ℤ64
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return ℤ64
i
]
ParseSubstActions e
a ← Text
-> CParser TokenBasic (ParseSubstActions e)
-> CParser TokenBasic (ParseSubstActions e)
forall t a. Ord t => Text -> CParser t a -> CParser t a
cpErr Text
"valid subst shift/incr range" (CParser TokenBasic (ParseSubstActions e)
-> CParser TokenBasic (ParseSubstActions e))
-> CParser TokenBasic (ParseSubstActions e)
-> CParser TokenBasic (ParseSubstActions e)
forall a b. (a -> b) -> a -> b
$ case (Var
x₁,VarInf
x₂) of
(D_Var(DVar ℕ64
n) ,D_VarInf(Var_DVI(DVar ℕ64
n')) ) | ℕ64
nℕ64 -> ℕ64 -> 𝔹
forall a. Eq a => a -> a -> 𝔹
≡ℕ64
0,ℤ64
iℤ64 -> ℤ64 -> 𝔹
forall a. Eq a => a -> a -> 𝔹
≡ℤ64
0 → ParseSubstActions e -> CParser TokenBasic (ParseSubstActions e)
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return (ParseSubstActions e -> CParser TokenBasic (ParseSubstActions e))
-> ParseSubstActions e -> CParser TokenBasic (ParseSubstActions e)
forall a b. (a -> b) -> a -> b
$ SGName
D_SGName SGName -> ParseSubstAction e -> ParseSubstActions e
forall a. SGName -> a -> SGName ⇰ a
forall k s (d :: * -> *) a. Dict k s d => k -> a -> d a
↦ ℕ64 -> ParseSubstAction e
forall e. ℕ64 -> ParseSubstAction e
parseSubstActionShft (ℕ64
n' ℕ64 -> ℕ64 -> ℕ64
forall a. Plus a => a -> a -> a
+ ℕ64
1)
(N_Var(NVar (DVar ℕ64
n) Name
x),N_VarInf(NVarInf(Var_DVI (DVar ℕ64
n')) Name
x')) | ℕ64
nℕ64 -> ℕ64 -> 𝔹
forall a. Eq a => a -> a -> 𝔹
≡ℕ64
0,ℤ64
iℤ64 -> ℤ64 -> 𝔹
forall a. Eq a => a -> a -> 𝔹
≡ℤ64
0,Name
xName -> Name -> 𝔹
forall a. Eq a => a -> a -> 𝔹
≡Name
x' → ParseSubstActions e -> CParser TokenBasic (ParseSubstActions e)
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return (ParseSubstActions e -> CParser TokenBasic (ParseSubstActions e))
-> ParseSubstActions e -> CParser TokenBasic (ParseSubstActions e)
forall a b. (a -> b) -> a -> b
$ Name -> SGName
N_SGName Name
x' SGName -> ParseSubstAction e -> ParseSubstActions e
forall a. SGName -> a -> SGName ⇰ a
forall k s (d :: * -> *) a. Dict k s d => k -> a -> d a
↦ ℕ64 -> ParseSubstAction e
forall e. ℕ64 -> ParseSubstAction e
parseSubstActionShft (ℕ64
n' ℕ64 -> ℕ64 -> ℕ64
forall a. Plus a => a -> a -> a
+ ℕ64
1)
(D_Var(DVar ℕ64
n) ,D_VarInf DVarInf
Inf_DVI ) → ParseSubstActions e -> CParser TokenBasic (ParseSubstActions e)
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return (ParseSubstActions e -> CParser TokenBasic (ParseSubstActions e))
-> ParseSubstActions e -> CParser TokenBasic (ParseSubstActions e)
forall a b. (a -> b) -> a -> b
$ SGName
D_SGName SGName -> ParseSubstAction e -> ParseSubstActions e
forall a. SGName -> a -> SGName ⇰ a
forall k s (d :: * -> *) a. Dict k s d => k -> a -> d a
↦ ℕ64 -> ℤ64 -> ParseSubstAction e
forall e. ℕ64 -> ℤ64 -> ParseSubstAction e
parseSubstActionIncr ℕ64
n ℤ64
i
(N_Var(NVar (DVar ℕ64
n) Name
x),N_VarInf(NVarInf DVarInf
Inf_DVI Name
x') ) | Name
xName -> Name -> 𝔹
forall a. Eq a => a -> a -> 𝔹
≡Name
x' → ParseSubstActions e -> CParser TokenBasic (ParseSubstActions e)
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return (ParseSubstActions e -> CParser TokenBasic (ParseSubstActions e))
-> ParseSubstActions e -> CParser TokenBasic (ParseSubstActions e)
forall a b. (a -> b) -> a -> b
$ Name -> SGName
N_SGName Name
x' SGName -> ParseSubstAction e -> ParseSubstActions e
forall a. SGName -> a -> SGName ⇰ a
forall k s (d :: * -> *) a. Dict k s d => k -> a -> d a
↦ ℕ64 -> ℤ64 -> ParseSubstAction e
forall e. ℕ64 -> ℤ64 -> ParseSubstAction e
parseSubstActionIncr ℕ64
n ℤ64
i
(Var, VarInf)
_ → CParser TokenBasic (ParseSubstActions e)
forall t a. CParser t a
cpDie
CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall (m :: * -> *) a. Functor m => m a -> m ()
void (CParser TokenBasic TokenBasic -> CParser TokenBasic ())
-> CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ [CParser TokenBasic TokenBasic] -> CParser TokenBasic TokenBasic
forall a t. (Monoid a, ToIter a t) => t -> a
concat ([CParser TokenBasic TokenBasic] -> CParser TokenBasic TokenBasic)
-> [CParser TokenBasic TokenBasic] -> CParser TokenBasic TokenBasic
forall a b. (a -> b) -> a -> b
$ (Text -> CParser TokenBasic TokenBasic)
-> [Text] -> [CParser TokenBasic TokenBasic]
forall a b. (a -> b) -> [a] -> [b]
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
map Text -> CParser TokenBasic TokenBasic
cpSyntax [Text
"]"]
ParseSubstActions e -> CParser TokenBasic (ParseSubstActions e)
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return ParseSubstActions e
a
pSubstElem ∷ Var → CParser TokenBasic (ParseSubstActions e)
pSubstElem :: Var -> CParser TokenBasic (ParseSubstActions e)
pSubstElem Var
x₀ = do
CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall (m :: * -> *) a. Functor m => m a -> m ()
void (CParser TokenBasic TokenBasic -> CParser TokenBasic ())
-> CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ [CParser TokenBasic TokenBasic] -> CParser TokenBasic TokenBasic
forall a t. (Monoid a, ToIter a t) => t -> a
concat ([CParser TokenBasic TokenBasic] -> CParser TokenBasic TokenBasic)
-> [CParser TokenBasic TokenBasic] -> CParser TokenBasic TokenBasic
forall a b. (a -> b) -> a -> b
$ (Text -> CParser TokenBasic TokenBasic)
-> [Text] -> [CParser TokenBasic TokenBasic]
forall a b. (a -> b) -> [a] -> [b]
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
map Text -> CParser TokenBasic TokenBasic
cpSyntax [Text
"|->",Text
"↦"]
e
e ← () -> CParser TokenBasic e
pE ()
ParseSubstActions e -> CParser TokenBasic (ParseSubstActions e)
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return (ParseSubstActions e -> CParser TokenBasic (ParseSubstActions e))
-> ParseSubstActions e -> CParser TokenBasic (ParseSubstActions e)
forall a b. (a -> b) -> a -> b
$ case Var
x₀ of
D_Var DVar
n → SGName
D_SGName SGName -> ParseSubstAction e -> ParseSubstActions e
forall a. SGName -> a -> SGName ⇰ a
forall k s (d :: * -> *) a. Dict k s d => k -> a -> d a
↦ 𝑂 DVar -> e -> ParseSubstAction e
forall e. 𝑂 DVar -> e -> ParseSubstAction e
parseSubstActionElem (DVar -> 𝑂 DVar
forall a. a -> 𝑂 a
Some DVar
n) e
e
N_Var (NVar DVar
n Name
x) → Name -> SGName
N_SGName Name
x SGName -> ParseSubstAction e -> ParseSubstActions e
forall a. SGName -> a -> SGName ⇰ a
forall k s (d :: * -> *) a. Dict k s d => k -> a -> d a
↦ 𝑂 DVar -> e -> ParseSubstAction e
forall e. 𝑂 DVar -> e -> ParseSubstAction e
parseSubstActionElem (DVar -> 𝑂 DVar
forall a. a -> 𝑂 a
Some DVar
n) e
e
G_Var (GVar Name
x) → Name -> SGName
G_SGName Name
x SGName -> ParseSubstAction e -> ParseSubstActions e
forall a. SGName -> a -> SGName ⇰ a
forall k s (d :: * -> *) a. Dict k s d => k -> a -> d a
↦ 𝑂 DVar -> e -> ParseSubstAction e
forall e. 𝑂 DVar -> e -> ParseSubstAction e
parseSubstActionElem 𝑂 DVar
forall a. 𝑂 a
None e
e
CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall (m :: * -> *) a. Functor m => m a -> m ()
void (CParser TokenBasic TokenBasic -> CParser TokenBasic ())
-> CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ Text -> CParser TokenBasic TokenBasic
cpSyntax Text
"{"
ParseSubstActions e
xas ← 𝐿 (ParseSubstActions e) -> ParseSubstActions e
forall a t. (Monoid a, ToIter a t) => t -> a
concat (𝐿 (ParseSubstActions e) -> ParseSubstActions e)
-> CParser TokenBasic (𝐿 (ParseSubstActions e))
-> CParser TokenBasic (ParseSubstActions e)
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ CParser TokenBasic ()
-> CParser TokenBasic (ParseSubstActions e)
-> CParser TokenBasic (𝐿 (ParseSubstActions e))
forall t a. Ord t => CParser t () -> CParser t a -> CParser t (𝐿 a)
cpManySepBy (CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall (m :: * -> *) a. Functor m => m a -> m ()
void (CParser TokenBasic TokenBasic -> CParser TokenBasic ())
-> CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ Text -> CParser TokenBasic TokenBasic
cpSyntax Text
",") (CParser TokenBasic (ParseSubstActions e)
-> CParser TokenBasic (𝐿 (ParseSubstActions e)))
-> CParser TokenBasic (ParseSubstActions e)
-> CParser TokenBasic (𝐿 (ParseSubstActions e))
forall a b. (a -> b) -> a -> b
$ do
Var
x ← CParser TokenBasic Var
pVar
[CParser TokenBasic (ParseSubstActions e)]
-> CParser TokenBasic (ParseSubstActions e)
forall a t. (Monoid a, ToIter a t) => t -> a
concat
[ Var -> CParser TokenBasic (ParseSubstActions e)
pSubstIncr Var
x
, Var -> CParser TokenBasic (ParseSubstActions e)
pSubstElem Var
x
]
Subst () e
𝓈 ← Text
-> CParser TokenBasic (Subst () e)
-> CParser TokenBasic (Subst () e)
forall t a. Ord t => Text -> CParser t a -> CParser t a
cpErr Text
"all subst actions valid" (CParser TokenBasic (Subst () e)
-> CParser TokenBasic (Subst () e))
-> CParser TokenBasic (Subst () e)
-> CParser TokenBasic (Subst () e)
forall a b. (a -> b) -> a -> b
$
𝐼 (Subst () e) -> Subst () e
forall a t. (Monoid a, ToIter a t) => t -> a
concat (𝐼 (Subst () e) -> Subst () e)
-> CParser TokenBasic (𝐼 (Subst () e))
-> CParser TokenBasic (Subst () e)
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ 𝐼 (SGName ∧ ParseSubstAction e)
-> ((SGName ∧ ParseSubstAction e)
-> CParser TokenBasic (Subst () e))
-> CParser TokenBasic (𝐼 (Subst () e))
forall (t :: * -> *) (m :: * -> *) a b.
(FunctorM t, Monad m) =>
t a -> (a -> m b) -> m (t b)
mapMOn (ParseSubstActions e -> 𝐼 (SGName ∧ ParseSubstAction e)
forall a t. ToIter a t => t -> 𝐼 a
iter ParseSubstActions e
xas) (((SGName ∧ ParseSubstAction e) -> CParser TokenBasic (Subst () e))
-> CParser TokenBasic (𝐼 (Subst () e)))
-> ((SGName ∧ ParseSubstAction e)
-> CParser TokenBasic (Subst () e))
-> CParser TokenBasic (𝐼 (Subst () e))
forall a b. (a -> b) -> a -> b
$ \ (SGName
wbO :* ParseSubstAction 𝐼 ℕ64
shfts 𝑂 DVar ⇰ 𝐼 e
elemss 𝐼 (ℕ64 ∧ ℤ64)
incrs) → do
let doScoped :: CParser TokenBasic ((ℕ64 ∧ 𝕍 (SSubstElem (() ∧ SName) e)) ∧ ℤ64)
doScoped = do
ℕ64
nShft ∷ ℕ64
← Text -> CParser TokenBasic ℕ64 -> CParser TokenBasic ℕ64
forall t a. Ord t => Text -> CParser t a -> CParser t a
cpErr Text
"zero or one shift actions" (CParser TokenBasic ℕ64 -> CParser TokenBasic ℕ64)
-> CParser TokenBasic ℕ64 -> CParser TokenBasic ℕ64
forall a b. (a -> b) -> a -> b
$ 𝑂 ℕ64 -> CParser TokenBasic ℕ64
forall a t. 𝑂 a -> CParser t a
cpFailEff (𝑂 ℕ64 -> CParser TokenBasic ℕ64)
-> 𝑂 ℕ64 -> CParser TokenBasic ℕ64
forall a b. (a -> b) -> a -> b
$ [𝑂 ℕ64] -> 𝑂 ℕ64
forall (m :: * -> *) a t.
(Monad m, MonadFail m, ToIter (m a) t) =>
t -> m a
tries
[ do (𝐼 ℕ64 ⌲ ()) -> 𝐼 ℕ64 -> 𝑂 ()
forall a b. (a ⌲ b) -> a -> 𝑂 b
view 𝐼 ℕ64 ⌲ ()
forall a. 𝐼 a ⌲ ()
empty𝐼L 𝐼 ℕ64
shfts ; ℕ64 -> 𝑂 ℕ64
forall a. a -> 𝑂 a
forall (m :: * -> *) a. Return m => a -> m a
return ℕ64
0
, (𝐼 ℕ64 ⌲ ℕ64) -> 𝐼 ℕ64 -> 𝑂 ℕ64
forall a b. (a ⌲ b) -> a -> 𝑂 b
view 𝐼 ℕ64 ⌲ ℕ64
forall a. 𝐼 a ⌲ a
single𝐼L 𝐼 ℕ64
shfts
]
𝑂 DVar ⇰ e
elems ∷ 𝑂 DVar ⇰ e
← Text
-> CParser TokenBasic (𝑂 DVar ⇰ e)
-> CParser TokenBasic (𝑂 DVar ⇰ e)
forall t a. Ord t => Text -> CParser t a -> CParser t a
cpErr Text
"one bind per name (scoped)" (CParser TokenBasic (𝑂 DVar ⇰ e)
-> CParser TokenBasic (𝑂 DVar ⇰ e))
-> CParser TokenBasic (𝑂 DVar ⇰ e)
-> CParser TokenBasic (𝑂 DVar ⇰ e)
forall a b. (a -> b) -> a -> b
$ 𝑂 (𝑂 DVar ⇰ e) -> CParser TokenBasic (𝑂 DVar ⇰ e)
forall a t. 𝑂 a -> CParser t a
cpFailEff (𝑂 (𝑂 DVar ⇰ e) -> CParser TokenBasic (𝑂 DVar ⇰ e))
-> 𝑂 (𝑂 DVar ⇰ e) -> CParser TokenBasic (𝑂 DVar ⇰ e)
forall a b. (a -> b) -> a -> b
$ (𝑂 DVar ⇰ 𝐼 e) -> (𝐼 e -> 𝑂 e) -> 𝑂 (𝑂 DVar ⇰ e)
forall (t :: * -> *) (m :: * -> *) a b.
(FunctorM t, Monad m) =>
t a -> (a -> m b) -> m (t b)
mapMOn 𝑂 DVar ⇰ 𝐼 e
elemss ((𝐼 e -> 𝑂 e) -> 𝑂 (𝑂 DVar ⇰ e)) -> (𝐼 e -> 𝑂 e) -> 𝑂 (𝑂 DVar ⇰ e)
forall a b. (a -> b) -> a -> b
$ (𝐼 e ⌲ e) -> 𝐼 e -> 𝑂 e
forall a b. (a ⌲ b) -> a -> 𝑂 b
view 𝐼 e ⌲ e
forall a. 𝐼 a ⌲ a
single𝐼L
𝐼 DVar
elemsKeys ∷ 𝐼 DVar
← Text -> CParser TokenBasic (𝐼 DVar) -> CParser TokenBasic (𝐼 DVar)
forall t a. Ord t => Text -> CParser t a -> CParser t a
cpErr Text
"all variables must have index" (CParser TokenBasic (𝐼 DVar) -> CParser TokenBasic (𝐼 DVar))
-> CParser TokenBasic (𝐼 DVar) -> CParser TokenBasic (𝐼 DVar)
forall a b. (a -> b) -> a -> b
$ 𝑂 (𝐼 DVar) -> CParser TokenBasic (𝐼 DVar)
forall a t. 𝑂 a -> CParser t a
cpFailEff (𝑂 (𝐼 DVar) -> CParser TokenBasic (𝐼 DVar))
-> 𝑂 (𝐼 DVar) -> CParser TokenBasic (𝐼 DVar)
forall a b. (a -> b) -> a -> b
$ 𝐼 (𝑂 DVar) -> 𝑂 (𝐼 DVar)
forall (t :: * -> *) (m :: * -> *) a.
(FunctorM t, Monad m) =>
t (m a) -> m (t a)
exchange (𝐼 (𝑂 DVar) -> 𝑂 (𝐼 DVar)) -> 𝐼 (𝑂 DVar) -> 𝑂 (𝐼 DVar)
forall a b. (a -> b) -> a -> b
$ 𝑃 (𝑂 DVar) -> 𝐼 (𝑂 DVar)
forall a t. ToIter a t => t -> 𝐼 a
iter (𝑃 (𝑂 DVar) -> 𝐼 (𝑂 DVar)) -> 𝑃 (𝑂 DVar) -> 𝐼 (𝑂 DVar)
forall a b. (a -> b) -> a -> b
$ (𝑂 DVar ⇰ e) -> 𝑃 (𝑂 DVar)
forall a. (𝑂 DVar ⇰ a) -> 𝑃 (𝑂 DVar)
forall k s (d :: * -> *) a. Dict k s d => d a -> s
dkeys 𝑂 DVar ⇰ e
elems
let elemsVals ∷ 𝕍 e
elemsVals :: 𝕍 e
elemsVals = 𝐼 e -> 𝕍 e
forall a t. ToIter a t => t -> 𝕍 a
vec (𝐼 e -> 𝕍 e) -> 𝐼 e -> 𝕍 e
forall a b. (a -> b) -> a -> b
$ (𝑂 DVar ⇰ e) -> 𝐼 e
forall a. (𝑂 DVar ⇰ a) -> 𝐼 a
forall k s (d :: * -> *) a. Dict k s d => d a -> 𝐼 a
dvals 𝑂 DVar ⇰ e
elems
ℕ64
nIncr :* ℤ64
iIncr ∷ ℕ64 ∧ ℤ64
← Text
-> CParser TokenBasic (ℕ64 ∧ ℤ64) -> CParser TokenBasic (ℕ64 ∧ ℤ64)
forall t a. Ord t => Text -> CParser t a -> CParser t a
cpErr Text
"zero or one incr actions" (CParser TokenBasic (ℕ64 ∧ ℤ64) -> CParser TokenBasic (ℕ64 ∧ ℤ64))
-> CParser TokenBasic (ℕ64 ∧ ℤ64) -> CParser TokenBasic (ℕ64 ∧ ℤ64)
forall a b. (a -> b) -> a -> b
$ 𝑂 (ℕ64 ∧ ℤ64) -> CParser TokenBasic (ℕ64 ∧ ℤ64)
forall a t. 𝑂 a -> CParser t a
cpFailEff (𝑂 (ℕ64 ∧ ℤ64) -> CParser TokenBasic (ℕ64 ∧ ℤ64))
-> 𝑂 (ℕ64 ∧ ℤ64) -> CParser TokenBasic (ℕ64 ∧ ℤ64)
forall a b. (a -> b) -> a -> b
$ [𝑂 (ℕ64 ∧ ℤ64)] -> 𝑂 (ℕ64 ∧ ℤ64)
forall (m :: * -> *) a t.
(Monad m, MonadFail m, ToIter (m a) t) =>
t -> m a
tries
[ do (𝐼 (ℕ64 ∧ ℤ64) ⌲ ()) -> 𝐼 (ℕ64 ∧ ℤ64) -> 𝑂 ()
forall a b. (a ⌲ b) -> a -> 𝑂 b
view 𝐼 (ℕ64 ∧ ℤ64) ⌲ ()
forall a. 𝐼 a ⌲ ()
empty𝐼L 𝐼 (ℕ64 ∧ ℤ64)
incrs ; (ℕ64 ∧ ℤ64) -> 𝑂 (ℕ64 ∧ ℤ64)
forall a. a -> 𝑂 a
forall (m :: * -> *) a. Return m => a -> m a
return ((ℕ64 ∧ ℤ64) -> 𝑂 (ℕ64 ∧ ℤ64)) -> (ℕ64 ∧ ℤ64) -> 𝑂 (ℕ64 ∧ ℤ64)
forall a b. (a -> b) -> a -> b
$ (ℕ64
nShft ℕ64 -> ℕ64 -> ℕ64
forall a. Plus a => a -> a -> a
+ 𝕍 e -> ℕ64
forall a. CSized a => a -> ℕ64
csize 𝕍 e
elemsVals) ℕ64 -> ℤ64 -> ℕ64 ∧ ℤ64
forall a b. a -> b -> a ∧ b
:* ℤ64
0
, (𝐼 (ℕ64 ∧ ℤ64) ⌲ (ℕ64 ∧ ℤ64)) -> 𝐼 (ℕ64 ∧ ℤ64) -> 𝑂 (ℕ64 ∧ ℤ64)
forall a b. (a ⌲ b) -> a -> 𝑂 b
view 𝐼 (ℕ64 ∧ ℤ64) ⌲ (ℕ64 ∧ ℤ64)
forall a. 𝐼 a ⌲ a
single𝐼L 𝐼 (ℕ64 ∧ ℤ64)
incrs
]
Text -> CParser TokenBasic () -> CParser TokenBasic ()
forall t a. Ord t => Text -> CParser t a -> CParser t a
cpErr Text
"elements should fill gap" (CParser TokenBasic () -> CParser TokenBasic ())
-> CParser TokenBasic () -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ 𝔹 -> CParser TokenBasic ()
forall t. 𝔹 -> CParser t ()
cpGuard (𝔹 -> CParser TokenBasic ()) -> 𝔹 -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ (DVar -> ℕ64) -> 𝐼 DVar -> 𝐼 ℕ64
forall a b. (a -> b) -> 𝐼 a -> 𝐼 b
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
map DVar -> ℕ64
unDVar 𝐼 DVar
elemsKeys 𝐼 ℕ64 -> 𝐼 ℕ64 -> 𝔹
forall a. Eq a => a -> a -> 𝔹
≡ ℕ64 -> ℕ64 -> 𝐼 ℕ64
forall n. (Eq n, Additive n, One n, Minus n) => n -> n -> 𝐼 n
range ℕ64
nShft ℕ64
nIncr
𝔹 -> (() -> CParser TokenBasic ()) -> CParser TokenBasic ()
forall (m :: * -> *). Return m => 𝔹 -> (() -> m ()) -> m ()
when (ℤ64
iIncr ℤ64 -> ℤ64 -> 𝔹
forall a. Ord a => a -> a -> 𝔹
< ℤ64 -> ℤ64
forall a. (Zero a, Minus a) => a -> a
neg (ℕ64 -> ℤ64
forall a. (ToIntO64 a, STACK) => a -> ℤ64
intΩ64 (ℕ64 -> ℤ64) -> ℕ64 -> ℤ64
forall a b. (a -> b) -> a -> b
$ 𝕍 e -> ℕ64
forall a. CSized a => a -> ℕ64
csize 𝕍 e
elemsVals)) ((() -> CParser TokenBasic ()) -> CParser TokenBasic ())
-> (() -> CParser TokenBasic ()) -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ \ () →
Text -> CParser TokenBasic () -> CParser TokenBasic ()
forall t a. Ord t => Text -> CParser t a -> CParser t a
cpErr Text
"incr cannot be less than number of substitution elems" CParser TokenBasic ()
forall t a. CParser t a
cpDie
let elemsVals' ∷ 𝕍 (SSubstElem s e)
elemsVals' :: forall s. 𝕍 (SSubstElem s e)
elemsVals' = 𝕍 e -> (e -> SSubstElem s e) -> 𝕍 (SSubstElem s e)
forall (t :: * -> *) a b. Functor t => t a -> (a -> b) -> t b
mapOn 𝕍 e
elemsVals ((e -> SSubstElem s e) -> 𝕍 (SSubstElem s e))
-> (e -> SSubstElem s e) -> 𝕍 (SSubstElem s e)
forall a b. (a -> b) -> a -> b
$ SubstElem s e -> SSubstElem s e
forall s e. SubstElem s e -> SSubstElem s e
Trm_SSE (SubstElem s e -> SSubstElem s e)
-> (𝑂 e -> SubstElem s e) -> 𝑂 e -> SSubstElem s e
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ (s ⇰ ℕ64) -> 𝑂 e -> SubstElem s e
forall s e. (s ⇰ ℕ64) -> 𝑂 e -> SubstElem s e
SubstElem s ⇰ ℕ64
forall a. Null a => a
null (𝑂 e -> SSubstElem s e) -> (e -> 𝑂 e) -> e -> SSubstElem s e
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ e -> 𝑂 e
forall a. a -> 𝑂 a
Some
((ℕ64 ∧ 𝕍 (SSubstElem (() ∧ SName) e)) ∧ ℤ64)
-> CParser TokenBasic ((ℕ64 ∧ 𝕍 (SSubstElem (() ∧ SName) e)) ∧ ℤ64)
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return (((ℕ64 ∧ 𝕍 (SSubstElem (() ∧ SName) e)) ∧ ℤ64)
-> CParser
TokenBasic ((ℕ64 ∧ 𝕍 (SSubstElem (() ∧ SName) e)) ∧ ℤ64))
-> ((ℕ64 ∧ 𝕍 (SSubstElem (() ∧ SName) e)) ∧ ℤ64)
-> CParser TokenBasic ((ℕ64 ∧ 𝕍 (SSubstElem (() ∧ SName) e)) ∧ ℤ64)
forall a b. (a -> b) -> a -> b
$ ℕ64
nShft ℕ64
-> 𝕍 (SSubstElem (() ∧ SName) e)
-> ℕ64 ∧ 𝕍 (SSubstElem (() ∧ SName) e)
forall a b. a -> b -> a ∧ b
:* 𝕍 (SSubstElem (() ∧ SName) e)
forall s. 𝕍 (SSubstElem s e)
elemsVals' (ℕ64 ∧ 𝕍 (SSubstElem (() ∧ SName) e))
-> ℤ64 -> (ℕ64 ∧ 𝕍 (SSubstElem (() ∧ SName) e)) ∧ ℤ64
forall a b. a -> b -> a ∧ b
:* ℤ64
iIncr
case SGName
wbO of
SGName
D_SGName → do
ℕ64
nShft :* 𝕍 (SSubstElem (() ∧ SName) e)
elemsVals :* ℤ64
incr ← CParser TokenBasic ((ℕ64 ∧ 𝕍 (SSubstElem (() ∧ SName) e)) ∧ ℤ64)
doScoped
Subst () e -> CParser TokenBasic (Subst () e)
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return (Subst () e -> CParser TokenBasic (Subst () e))
-> Subst () e -> CParser TokenBasic (Subst () e)
forall a b. (a -> b) -> a -> b
$ SubstSpaced (() ∧ Name) (() ∧ SName) e -> Subst () e
forall s e. SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
Subst (SubstSpaced (() ∧ Name) (() ∧ SName) e -> Subst () e)
-> SubstSpaced (() ∧ Name) (() ∧ SName) e -> Subst () e
forall a b. (a -> b) -> a -> b
$ ((() ∧ Name) ⇰ SubstElem (() ∧ SName) e)
-> ((() ∧ SName) ⇰ SubstScoped (() ∧ SName) e)
-> SubstSpaced (() ∧ Name) (() ∧ SName) e
forall sG sS e.
(sG ⇰ SubstElem sS e)
-> (sS ⇰ SubstScoped sS e) -> SubstSpaced sG sS e
SubstSpaced (() ∧ Name) ⇰ SubstElem (() ∧ SName) e
forall a. Null a => a
null (((() ∧ SName) ⇰ SubstScoped (() ∧ SName) e)
-> SubstSpaced (() ∧ Name) (() ∧ SName) e)
-> ((() ∧ SName) ⇰ SubstScoped (() ∧ SName) e)
-> SubstSpaced (() ∧ Name) (() ∧ SName) e
forall a b. (a -> b) -> a -> b
$ (() () -> SName -> () ∧ SName
forall a b. a -> b -> a ∧ b
:* SName
D_SName) (() ∧ SName)
-> SubstScoped (() ∧ SName) e
-> (() ∧ SName) ⇰ SubstScoped (() ∧ SName) e
forall a. (() ∧ SName) -> a -> (() ∧ SName) ⇰ a
forall k s (d :: * -> *) a. Dict k s d => k -> a -> d a
↦ ℕ64
-> 𝕍 (SSubstElem (() ∧ SName) e)
-> ℤ64
-> SubstScoped (() ∧ SName) e
forall s e. ℕ64 -> 𝕍 (SSubstElem s e) -> ℤ64 -> SubstScoped s e
SubstScoped ℕ64
nShft 𝕍 (SSubstElem (() ∧ SName) e)
elemsVals ℤ64
incr
N_SGName Name
x → do
ℕ64
nShft :* 𝕍 (SSubstElem (() ∧ SName) e)
elemsVals :* ℤ64
incr ← CParser TokenBasic ((ℕ64 ∧ 𝕍 (SSubstElem (() ∧ SName) e)) ∧ ℤ64)
doScoped
Subst () e -> CParser TokenBasic (Subst () e)
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return (Subst () e -> CParser TokenBasic (Subst () e))
-> Subst () e -> CParser TokenBasic (Subst () e)
forall a b. (a -> b) -> a -> b
$ SubstSpaced (() ∧ Name) (() ∧ SName) e -> Subst () e
forall s e. SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
Subst (SubstSpaced (() ∧ Name) (() ∧ SName) e -> Subst () e)
-> SubstSpaced (() ∧ Name) (() ∧ SName) e -> Subst () e
forall a b. (a -> b) -> a -> b
$ ((() ∧ Name) ⇰ SubstElem (() ∧ SName) e)
-> ((() ∧ SName) ⇰ SubstScoped (() ∧ SName) e)
-> SubstSpaced (() ∧ Name) (() ∧ SName) e
forall sG sS e.
(sG ⇰ SubstElem sS e)
-> (sS ⇰ SubstScoped sS e) -> SubstSpaced sG sS e
SubstSpaced (() ∧ Name) ⇰ SubstElem (() ∧ SName) e
forall a. Null a => a
null (((() ∧ SName) ⇰ SubstScoped (() ∧ SName) e)
-> SubstSpaced (() ∧ Name) (() ∧ SName) e)
-> ((() ∧ SName) ⇰ SubstScoped (() ∧ SName) e)
-> SubstSpaced (() ∧ Name) (() ∧ SName) e
forall a b. (a -> b) -> a -> b
$ (() () -> SName -> () ∧ SName
forall a b. a -> b -> a ∧ b
:* Name -> SName
N_SName Name
x) (() ∧ SName)
-> SubstScoped (() ∧ SName) e
-> (() ∧ SName) ⇰ SubstScoped (() ∧ SName) e
forall a. (() ∧ SName) -> a -> (() ∧ SName) ⇰ a
forall k s (d :: * -> *) a. Dict k s d => k -> a -> d a
↦ ℕ64
-> 𝕍 (SSubstElem (() ∧ SName) e)
-> ℤ64
-> SubstScoped (() ∧ SName) e
forall s e. ℕ64 -> 𝕍 (SSubstElem s e) -> ℤ64 -> SubstScoped s e
SubstScoped ℕ64
nShft 𝕍 (SSubstElem (() ∧ SName) e)
elemsVals ℤ64
incr
G_SGName Name
x → do
Text -> CParser TokenBasic () -> CParser TokenBasic ()
forall t a. Ord t => Text -> CParser t a -> CParser t a
cpErr Text
"global vars can't have shifts" (CParser TokenBasic () -> CParser TokenBasic ())
-> CParser TokenBasic () -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ 𝔹 -> CParser TokenBasic ()
forall t. 𝔹 -> CParser t ()
cpGuard (𝔹 -> CParser TokenBasic ()) -> 𝔹 -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ 𝐼 ℕ64 -> 𝔹
forall a t. ToIter a t => t -> 𝔹
isEmpty 𝐼 ℕ64
shfts
Text -> CParser TokenBasic () -> CParser TokenBasic ()
forall t a. Ord t => Text -> CParser t a -> CParser t a
cpErr Text
"global vars can't have incrs" (CParser TokenBasic () -> CParser TokenBasic ())
-> CParser TokenBasic () -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ 𝔹 -> CParser TokenBasic ()
forall t. 𝔹 -> CParser t ()
cpGuard (𝔹 -> CParser TokenBasic ()) -> 𝔹 -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ 𝐼 (ℕ64 ∧ ℤ64) -> 𝔹
forall a t. ToIter a t => t -> 𝔹
isEmpty 𝐼 (ℕ64 ∧ ℤ64)
incrs
𝑂 DVar ⇰ e
elems ← Text
-> CParser TokenBasic (𝑂 DVar ⇰ e)
-> CParser TokenBasic (𝑂 DVar ⇰ e)
forall t a. Ord t => Text -> CParser t a -> CParser t a
cpErr Text
"one bind per name (scoped)" (CParser TokenBasic (𝑂 DVar ⇰ e)
-> CParser TokenBasic (𝑂 DVar ⇰ e))
-> CParser TokenBasic (𝑂 DVar ⇰ e)
-> CParser TokenBasic (𝑂 DVar ⇰ e)
forall a b. (a -> b) -> a -> b
$ 𝑂 (𝑂 DVar ⇰ e) -> CParser TokenBasic (𝑂 DVar ⇰ e)
forall a t. 𝑂 a -> CParser t a
cpFailEff (𝑂 (𝑂 DVar ⇰ e) -> CParser TokenBasic (𝑂 DVar ⇰ e))
-> 𝑂 (𝑂 DVar ⇰ e) -> CParser TokenBasic (𝑂 DVar ⇰ e)
forall a b. (a -> b) -> a -> b
$ (𝑂 DVar ⇰ 𝐼 e) -> (𝐼 e -> 𝑂 e) -> 𝑂 (𝑂 DVar ⇰ e)
forall (t :: * -> *) (m :: * -> *) a b.
(FunctorM t, Monad m) =>
t a -> (a -> m b) -> m (t b)
mapMOn 𝑂 DVar ⇰ 𝐼 e
elemss ((𝐼 e -> 𝑂 e) -> 𝑂 (𝑂 DVar ⇰ e)) -> (𝐼 e -> 𝑂 e) -> 𝑂 (𝑂 DVar ⇰ e)
forall a b. (a -> b) -> a -> b
$ (𝐼 e ⌲ e) -> 𝐼 e -> 𝑂 e
forall a b. (a ⌲ b) -> a -> 𝑂 b
view 𝐼 e ⌲ e
forall a. 𝐼 a ⌲ a
single𝐼L
(() ∧ Name) ⇰ SubstElem (() ∧ SName) e
wes ← 𝐼 ((() ∧ Name) ∧ SubstElem (() ∧ SName) e)
-> (() ∧ Name) ⇰ SubstElem (() ∧ SName) e
forall k a t. (Ord k, ToIter (k ∧ a) t) => t -> k ⇰ a
assoc𝐷 (𝐼 ((() ∧ Name) ∧ SubstElem (() ∧ SName) e)
-> (() ∧ Name) ⇰ SubstElem (() ∧ SName) e)
-> CParser TokenBasic (𝐼 ((() ∧ Name) ∧ SubstElem (() ∧ SName) e))
-> CParser TokenBasic ((() ∧ Name) ⇰ SubstElem (() ∧ SName) e)
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ 𝐼 (𝑂 DVar ∧ e)
-> ((𝑂 DVar ∧ e)
-> CParser TokenBasic ((() ∧ Name) ∧ SubstElem (() ∧ SName) e))
-> CParser TokenBasic (𝐼 ((() ∧ Name) ∧ SubstElem (() ∧ SName) e))
forall (t :: * -> *) (m :: * -> *) a b.
(FunctorM t, Monad m) =>
t a -> (a -> m b) -> m (t b)
mapMOn ((𝑂 DVar ⇰ e) -> 𝐼 (𝑂 DVar ∧ e)
forall a t. ToIter a t => t -> 𝐼 a
iter 𝑂 DVar ⇰ e
elems) (((𝑂 DVar ∧ e)
-> CParser TokenBasic ((() ∧ Name) ∧ SubstElem (() ∧ SName) e))
-> CParser TokenBasic (𝐼 ((() ∧ Name) ∧ SubstElem (() ∧ SName) e)))
-> ((𝑂 DVar ∧ e)
-> CParser TokenBasic ((() ∧ Name) ∧ SubstElem (() ∧ SName) e))
-> CParser TokenBasic (𝐼 ((() ∧ Name) ∧ SubstElem (() ∧ SName) e))
forall a b. (a -> b) -> a -> b
$ \ (𝑂 DVar
nO :* e
e) → do
Text -> CParser TokenBasic () -> CParser TokenBasic ()
forall t a. Ord t => Text -> CParser t a -> CParser t a
cpErr Text
"global vars can't have index" (CParser TokenBasic () -> CParser TokenBasic ())
-> CParser TokenBasic () -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ 𝔹 -> CParser TokenBasic ()
forall t. 𝔹 -> CParser t ()
cpGuard (𝔹 -> CParser TokenBasic ()) -> 𝔹 -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ (𝑂 DVar ⌲ ()) -> 𝑂 DVar -> 𝔹
forall a b. (a ⌲ b) -> a -> 𝔹
shape 𝑂 DVar ⌲ ()
forall a. 𝑂 a ⌲ ()
noneL 𝑂 DVar
nO
((() ∧ Name) ∧ SubstElem (() ∧ SName) e)
-> CParser TokenBasic ((() ∧ Name) ∧ SubstElem (() ∧ SName) e)
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return (((() ∧ Name) ∧ SubstElem (() ∧ SName) e)
-> CParser TokenBasic ((() ∧ Name) ∧ SubstElem (() ∧ SName) e))
-> ((() ∧ Name) ∧ SubstElem (() ∧ SName) e)
-> CParser TokenBasic ((() ∧ Name) ∧ SubstElem (() ∧ SName) e)
forall a b. (a -> b) -> a -> b
$ (() ∧ Name)
-> SubstElem (() ∧ SName) e
-> (() ∧ Name) ∧ SubstElem (() ∧ SName) e
forall a b. a -> b -> a ∧ b
(:*) (() () -> Name -> () ∧ Name
forall a b. a -> b -> a ∧ b
:* Name
x) (SubstElem (() ∧ SName) e
-> (() ∧ Name) ∧ SubstElem (() ∧ SName) e)
-> SubstElem (() ∧ SName) e
-> (() ∧ Name) ∧ SubstElem (() ∧ SName) e
forall a b. (a -> b) -> a -> b
$ ((() ∧ SName) ⇰ ℕ64) -> 𝑂 e -> SubstElem (() ∧ SName) e
forall s e. (s ⇰ ℕ64) -> 𝑂 e -> SubstElem s e
SubstElem (() ∧ SName) ⇰ ℕ64
forall a. Null a => a
null (𝑂 e -> SubstElem (() ∧ SName) e)
-> 𝑂 e -> SubstElem (() ∧ SName) e
forall a b. (a -> b) -> a -> b
$ e -> 𝑂 e
forall a. a -> 𝑂 a
Some e
e
Subst () e -> CParser TokenBasic (Subst () e)
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return (Subst () e -> CParser TokenBasic (Subst () e))
-> Subst () e -> CParser TokenBasic (Subst () e)
forall a b. (a -> b) -> a -> b
$ SubstSpaced (() ∧ Name) (() ∧ SName) e -> Subst () e
forall s e. SubstSpaced (s ∧ Name) (s ∧ SName) e -> Subst s e
Subst (SubstSpaced (() ∧ Name) (() ∧ SName) e -> Subst () e)
-> SubstSpaced (() ∧ Name) (() ∧ SName) e -> Subst () e
forall a b. (a -> b) -> a -> b
$ ((() ∧ Name) ⇰ SubstElem (() ∧ SName) e)
-> ((() ∧ SName) ⇰ SubstScoped (() ∧ SName) e)
-> SubstSpaced (() ∧ Name) (() ∧ SName) e
forall sG sS e.
(sG ⇰ SubstElem sS e)
-> (sS ⇰ SubstScoped sS e) -> SubstSpaced sG sS e
SubstSpaced (() ∧ Name) ⇰ SubstElem (() ∧ SName) e
wes (() ∧ SName) ⇰ SubstScoped (() ∧ SName) e
forall a. Null a => a
null
CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall (m :: * -> *) a. Functor m => m a -> m ()
void (CParser TokenBasic TokenBasic -> CParser TokenBasic ())
-> CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ Text -> CParser TokenBasic TokenBasic
cpSyntax Text
"}"
Subst () e -> CParser TokenBasic (Subst () e)
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return Subst () e
𝓈
pMVarTail ∷ (Eq e,Substy () e e) ⇒ (() → CParser TokenBasic e) → Name → CParser TokenBasic (MVar () e)
pMVarTail :: forall e.
(Eq e, Substy () e e) =>
(() -> CParser TokenBasic e)
-> Name -> CParser TokenBasic (MVar () e)
pMVarTail () -> CParser TokenBasic e
pE Name
x = do
CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall (m :: * -> *) a. Functor m => m a -> m ()
void (CParser TokenBasic TokenBasic -> CParser TokenBasic ())
-> CParser TokenBasic TokenBasic -> CParser TokenBasic ()
forall a b. (a -> b) -> a -> b
$ Text -> CParser TokenBasic TokenBasic
cpSyntax Text
":m"
Subst () e
𝓈 ← Subst () e -> 𝑂 (Subst () e) -> Subst () e
forall a. a -> 𝑂 a -> a
ifNone Subst () e
forall a. Null a => a
null (𝑂 (Subst () e) -> Subst () e)
-> CParser TokenBasic (𝑂 (Subst () e))
-> CParser TokenBasic (Subst () e)
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ CParser TokenBasic (Subst () e)
-> CParser TokenBasic (𝑂 (Subst () e))
forall t a. Ord t => CParser t a -> CParser t (𝑂 a)
cpOptional (CParser TokenBasic (Subst () e)
-> CParser TokenBasic (𝑂 (Subst () e)))
-> CParser TokenBasic (Subst () e)
-> CParser TokenBasic (𝑂 (Subst () e))
forall a b. (a -> b) -> a -> b
$ (() -> CParser TokenBasic e) -> CParser TokenBasic (Subst () e)
forall e.
(Eq e, Substy () e e) =>
(() -> CParser TokenBasic e) -> CParser TokenBasic (Subst () e)
pSubst () -> CParser TokenBasic e
pE
MVar () e -> CParser TokenBasic (MVar () e)
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return (MVar () e -> CParser TokenBasic (MVar () e))
-> MVar () e -> CParser TokenBasic (MVar () e)
forall a b. (a -> b) -> a -> b
$ Subst () e -> Name -> MVar () e
forall s e. Subst s e -> Name -> MVar s e
MVar Subst () e
𝓈 Name
x
pMVar ∷ (Eq e,Substy () e e) ⇒ (() → CParser TokenBasic e) → CParser TokenBasic (MVar () e)
pMVar :: forall e.
(Eq e, Substy () e e) =>
(() -> CParser TokenBasic e) -> CParser TokenBasic (MVar () e)
pMVar () -> CParser TokenBasic e
pE = do
Name
x ← CParser TokenBasic Name
pName
(() -> CParser TokenBasic e)
-> Name -> CParser TokenBasic (MVar () e)
forall e.
(Eq e, Substy () e e) =>
(() -> CParser TokenBasic e)
-> Name -> CParser TokenBasic (MVar () e)
pMVarTail () -> CParser TokenBasic e
pE Name
x
pUVar ∷ (Eq e,Substy () e e) ⇒ (() → CParser TokenBasic e) → CParser TokenBasic (UVar () e)
pUVar :: forall e.
(Eq e, Substy () e e) =>
(() -> CParser TokenBasic e) -> CParser TokenBasic (UVar () e)
pUVar () -> CParser TokenBasic e
pE = [CParser TokenBasic (UVar () e)] -> CParser TokenBasic (UVar () e)
forall a t. (Monoid a, ToIter a t) => t -> a
concat
[ do DVar
x ← CParser TokenBasic DVar
pDVar
UVar () e -> CParser TokenBasic (UVar () e)
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return (UVar () e -> CParser TokenBasic (UVar () e))
-> UVar () e -> CParser TokenBasic (UVar () e)
forall a b. (a -> b) -> a -> b
$ DVar -> UVar () e
forall s e. DVar -> UVar s e
D_UVar DVar
x
, do Name
x ← CParser TokenBasic Name
pName
[CParser TokenBasic (UVar () e)] -> CParser TokenBasic (UVar () e)
forall a t. (Monoid a, ToIter a t) => t -> a
concat
[ NVar -> UVar () e
forall s e. NVar -> UVar s e
N_UVar (NVar -> UVar () e)
-> CParser TokenBasic NVar -> CParser TokenBasic (UVar () e)
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ Name -> CParser TokenBasic NVar
pNVarTail Name
x
, GVar -> UVar () e
forall s e. GVar -> UVar s e
G_UVar (GVar -> UVar () e)
-> CParser TokenBasic GVar -> CParser TokenBasic (UVar () e)
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ Name -> CParser TokenBasic GVar
pGVarTail Name
x
, MVar () e -> UVar () e
forall s e. MVar s e -> UVar s e
M_UVar (MVar () e -> UVar () e)
-> CParser TokenBasic (MVar () e) -> CParser TokenBasic (UVar () e)
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ (() -> CParser TokenBasic e)
-> Name -> CParser TokenBasic (MVar () e)
forall e.
(Eq e, Substy () e e) =>
(() -> CParser TokenBasic e)
-> Name -> CParser TokenBasic (MVar () e)
pMVarTail () -> CParser TokenBasic e
pE Name
x
]
]
instance (Ord s,Shrinky e) ⇒ Shrinky (UVar s e) where
shrink :: UVar s e -> 𝐼 (UVar s e)
shrink = \case
D_UVar DVar
x → DVar -> UVar s e
forall s e. DVar -> UVar s e
D_UVar (DVar -> UVar s e) -> 𝐼 DVar -> 𝐼 (UVar s e)
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ DVar -> 𝐼 DVar
forall a. Shrinky a => a -> 𝐼 a
shrink DVar
x
N_UVar NVar
x → NVar -> UVar s e
forall s e. NVar -> UVar s e
N_UVar (NVar -> UVar s e) -> 𝐼 NVar -> 𝐼 (UVar s e)
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ NVar -> 𝐼 NVar
forall a. Shrinky a => a -> 𝐼 a
shrink NVar
x
G_UVar GVar
x → GVar -> UVar s e
forall s e. GVar -> UVar s e
G_UVar (GVar -> UVar s e) -> 𝐼 GVar -> 𝐼 (UVar s e)
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ GVar -> 𝐼 GVar
forall a. Shrinky a => a -> 𝐼 a
shrink GVar
x
M_UVar MVar s e
x → MVar s e -> UVar s e
forall s e. MVar s e -> UVar s e
M_UVar (MVar s e -> UVar s e) -> 𝐼 (MVar s e) -> 𝐼 (UVar s e)
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ MVar s e -> 𝐼 (MVar s e)
forall a. Shrinky a => a -> 𝐼 a
shrink MVar s e
x