module UVMHS.Lang.ULC where
import UVMHS.Core
import UVMHS.Lib.Parser
import UVMHS.Lib.Pretty
import UVMHS.Lib.Annotated
import UVMHS.Lib.Substitution
import UVMHS.Lib.Rand
import UVMHS.Lib.Fuzzy
import UVMHS.Lib.Shrinky
import UVMHS.Lib.THLiftInstances ()
import qualified Language.Haskell.TH.Syntax as TH
import qualified Language.Haskell.TH.Quote as TH
import GHC.Generics as HS
import Control.Monad.Fail as HS
newtype ULCExp 𝒸 = ULCExp { forall 𝒸. ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
unULCExp ∷ 𝐴 𝒸 (ULCExp_R 𝒸) }
deriving (ULCExp 𝒸 -> ULCExp 𝒸 -> Bool
(ULCExp 𝒸 -> ULCExp 𝒸 -> Bool)
-> (ULCExp 𝒸 -> ULCExp 𝒸 -> Bool) -> Eq (ULCExp 𝒸)
forall 𝒸. ULCExp 𝒸 -> ULCExp 𝒸 -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall 𝒸. ULCExp 𝒸 -> ULCExp 𝒸 -> Bool
== :: ULCExp 𝒸 -> ULCExp 𝒸 -> Bool
$c/= :: forall 𝒸. ULCExp 𝒸 -> ULCExp 𝒸 -> Bool
/= :: ULCExp 𝒸 -> ULCExp 𝒸 -> Bool
Eq,(forall x. ULCExp 𝒸 -> Rep (ULCExp 𝒸) x)
-> (forall x. Rep (ULCExp 𝒸) x -> ULCExp 𝒸) -> Generic (ULCExp 𝒸)
forall x. Rep (ULCExp 𝒸) x -> ULCExp 𝒸
forall x. ULCExp 𝒸 -> Rep (ULCExp 𝒸) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall 𝒸 x. Rep (ULCExp 𝒸) x -> ULCExp 𝒸
forall 𝒸 x. ULCExp 𝒸 -> Rep (ULCExp 𝒸) x
$cfrom :: forall 𝒸 x. ULCExp 𝒸 -> Rep (ULCExp 𝒸) x
from :: forall x. ULCExp 𝒸 -> Rep (ULCExp 𝒸) x
$cto :: forall 𝒸 x. Rep (ULCExp 𝒸) x -> ULCExp 𝒸
to :: forall x. Rep (ULCExp 𝒸) x -> ULCExp 𝒸
Generic,Eq (ULCExp 𝒸)
Eq (ULCExp 𝒸) =>
(ULCExp 𝒸 -> ULCExp 𝒸 -> Ordering)
-> (ULCExp 𝒸 -> ULCExp 𝒸 -> Bool)
-> (ULCExp 𝒸 -> ULCExp 𝒸 -> Bool)
-> (ULCExp 𝒸 -> ULCExp 𝒸 -> Bool)
-> (ULCExp 𝒸 -> ULCExp 𝒸 -> Bool)
-> (ULCExp 𝒸 -> ULCExp 𝒸 -> ULCExp 𝒸)
-> (ULCExp 𝒸 -> ULCExp 𝒸 -> ULCExp 𝒸)
-> Ord (ULCExp 𝒸)
ULCExp 𝒸 -> ULCExp 𝒸 -> Bool
ULCExp 𝒸 -> ULCExp 𝒸 -> Ordering
ULCExp 𝒸 -> ULCExp 𝒸 -> ULCExp 𝒸
forall 𝒸. Eq (ULCExp 𝒸)
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall 𝒸. ULCExp 𝒸 -> ULCExp 𝒸 -> Bool
forall 𝒸. ULCExp 𝒸 -> ULCExp 𝒸 -> Ordering
forall 𝒸. ULCExp 𝒸 -> ULCExp 𝒸 -> ULCExp 𝒸
$ccompare :: forall 𝒸. ULCExp 𝒸 -> ULCExp 𝒸 -> Ordering
compare :: ULCExp 𝒸 -> ULCExp 𝒸 -> Ordering
$c< :: forall 𝒸. ULCExp 𝒸 -> ULCExp 𝒸 -> Bool
< :: ULCExp 𝒸 -> ULCExp 𝒸 -> Bool
$c<= :: forall 𝒸. ULCExp 𝒸 -> ULCExp 𝒸 -> Bool
<= :: ULCExp 𝒸 -> ULCExp 𝒸 -> Bool
$c> :: forall 𝒸. ULCExp 𝒸 -> ULCExp 𝒸 -> Bool
> :: ULCExp 𝒸 -> ULCExp 𝒸 -> Bool
$c>= :: forall 𝒸. ULCExp 𝒸 -> ULCExp 𝒸 -> Bool
>= :: ULCExp 𝒸 -> ULCExp 𝒸 -> Bool
$cmax :: forall 𝒸. ULCExp 𝒸 -> ULCExp 𝒸 -> ULCExp 𝒸
max :: ULCExp 𝒸 -> ULCExp 𝒸 -> ULCExp 𝒸
$cmin :: forall 𝒸. ULCExp 𝒸 -> ULCExp 𝒸 -> ULCExp 𝒸
min :: ULCExp 𝒸 -> ULCExp 𝒸 -> ULCExp 𝒸
Ord,Int -> ULCExp 𝒸 -> ShowS
[ULCExp 𝒸] -> ShowS
ULCExp 𝒸 -> String
(Int -> ULCExp 𝒸 -> ShowS)
-> (ULCExp 𝒸 -> String) -> ([ULCExp 𝒸] -> ShowS) -> Show (ULCExp 𝒸)
forall 𝒸. Show 𝒸 => Int -> ULCExp 𝒸 -> ShowS
forall 𝒸. Show 𝒸 => [ULCExp 𝒸] -> ShowS
forall 𝒸. Show 𝒸 => ULCExp 𝒸 -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall 𝒸. Show 𝒸 => Int -> ULCExp 𝒸 -> ShowS
showsPrec :: Int -> ULCExp 𝒸 -> ShowS
$cshow :: forall 𝒸. Show 𝒸 => ULCExp 𝒸 -> String
show :: ULCExp 𝒸 -> String
$cshowList :: forall 𝒸. Show 𝒸 => [ULCExp 𝒸] -> ShowS
showList :: [ULCExp 𝒸] -> ShowS
Show)
onULCExp ∷ (𝐴 𝒸 (ULCExp_R 𝒸) → 𝐴 𝒸' (ULCExp_R 𝒸')) → ULCExp 𝒸 → ULCExp 𝒸'
onULCExp :: forall 𝒸 𝒸'.
(𝐴 𝒸 (ULCExp_R 𝒸) -> 𝐴 𝒸' (ULCExp_R 𝒸')) -> ULCExp 𝒸 -> ULCExp 𝒸'
onULCExp 𝐴 𝒸 (ULCExp_R 𝒸) -> 𝐴 𝒸' (ULCExp_R 𝒸')
f = 𝐴 𝒸' (ULCExp_R 𝒸') -> ULCExp 𝒸'
forall 𝒸. 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸
ULCExp (𝐴 𝒸' (ULCExp_R 𝒸') -> ULCExp 𝒸')
-> (𝐴 𝒸 (ULCExp_R 𝒸) -> 𝐴 𝒸' (ULCExp_R 𝒸'))
-> 𝐴 𝒸 (ULCExp_R 𝒸)
-> ULCExp 𝒸'
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ 𝐴 𝒸 (ULCExp_R 𝒸) -> 𝐴 𝒸' (ULCExp_R 𝒸')
f (𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸')
-> (ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)) -> ULCExp 𝒸 -> ULCExp 𝒸'
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
forall 𝒸. ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
unULCExp
data ULCExp_R 𝒸 =
Var_ULC (UVar () (ULCExp 𝒸))
| Lam_ULC (𝑂 Name) (ULCExp 𝒸)
| App_ULC (ULCExp 𝒸) (ULCExp 𝒸)
deriving (ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool
(ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool)
-> (ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool) -> Eq (ULCExp_R 𝒸)
forall 𝒸. ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall 𝒸. ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool
== :: ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool
$c/= :: forall 𝒸. ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool
/= :: ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool
Eq,(forall x. ULCExp_R 𝒸 -> Rep (ULCExp_R 𝒸) x)
-> (forall x. Rep (ULCExp_R 𝒸) x -> ULCExp_R 𝒸)
-> Generic (ULCExp_R 𝒸)
forall x. Rep (ULCExp_R 𝒸) x -> ULCExp_R 𝒸
forall x. ULCExp_R 𝒸 -> Rep (ULCExp_R 𝒸) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall 𝒸 x. Rep (ULCExp_R 𝒸) x -> ULCExp_R 𝒸
forall 𝒸 x. ULCExp_R 𝒸 -> Rep (ULCExp_R 𝒸) x
$cfrom :: forall 𝒸 x. ULCExp_R 𝒸 -> Rep (ULCExp_R 𝒸) x
from :: forall x. ULCExp_R 𝒸 -> Rep (ULCExp_R 𝒸) x
$cto :: forall 𝒸 x. Rep (ULCExp_R 𝒸) x -> ULCExp_R 𝒸
to :: forall x. Rep (ULCExp_R 𝒸) x -> ULCExp_R 𝒸
HS.Generic,Eq (ULCExp_R 𝒸)
Eq (ULCExp_R 𝒸) =>
(ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Ordering)
-> (ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool)
-> (ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool)
-> (ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool)
-> (ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool)
-> (ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> ULCExp_R 𝒸)
-> (ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> ULCExp_R 𝒸)
-> Ord (ULCExp_R 𝒸)
ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool
ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Ordering
ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> ULCExp_R 𝒸
forall 𝒸. Eq (ULCExp_R 𝒸)
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall 𝒸. ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool
forall 𝒸. ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Ordering
forall 𝒸. ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> ULCExp_R 𝒸
$ccompare :: forall 𝒸. ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Ordering
compare :: ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Ordering
$c< :: forall 𝒸. ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool
< :: ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool
$c<= :: forall 𝒸. ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool
<= :: ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool
$c> :: forall 𝒸. ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool
> :: ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool
$c>= :: forall 𝒸. ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool
>= :: ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> Bool
$cmax :: forall 𝒸. ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> ULCExp_R 𝒸
max :: ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> ULCExp_R 𝒸
$cmin :: forall 𝒸. ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> ULCExp_R 𝒸
min :: ULCExp_R 𝒸 -> ULCExp_R 𝒸 -> ULCExp_R 𝒸
Ord,Int -> ULCExp_R 𝒸 -> ShowS
[ULCExp_R 𝒸] -> ShowS
ULCExp_R 𝒸 -> String
(Int -> ULCExp_R 𝒸 -> ShowS)
-> (ULCExp_R 𝒸 -> String)
-> ([ULCExp_R 𝒸] -> ShowS)
-> Show (ULCExp_R 𝒸)
forall 𝒸. Show 𝒸 => Int -> ULCExp_R 𝒸 -> ShowS
forall 𝒸. Show 𝒸 => [ULCExp_R 𝒸] -> ShowS
forall 𝒸. Show 𝒸 => ULCExp_R 𝒸 -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall 𝒸. Show 𝒸 => Int -> ULCExp_R 𝒸 -> ShowS
showsPrec :: Int -> ULCExp_R 𝒸 -> ShowS
$cshow :: forall 𝒸. Show 𝒸 => ULCExp_R 𝒸 -> String
show :: ULCExp_R 𝒸 -> String
$cshowList :: forall 𝒸. Show 𝒸 => [ULCExp_R 𝒸] -> ShowS
showList :: [ULCExp_R 𝒸] -> ShowS
Show)
makePrisms ''ULCExp_R
type ULCExpSrc = ULCExp (𝑃 SrcCxt)
type ULCExpRaw = ULCExp ()
wfULC ∷ ULCExp 𝒸 → 𝔹
wfULC :: forall 𝒸. ULCExp 𝒸 -> Bool
wfULC = (ULCExp 𝒸 -> ULCExp_R 𝒸)
-> (ULCExp_R 𝒸 -> Bool) -> ULCExp 𝒸 -> Bool
forall a b c. (a -> b) -> (b -> c) -> a -> c
pipe (𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp_R 𝒸
forall e a. 𝐴 e a -> a
aval (𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp_R 𝒸)
-> (ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)) -> ULCExp 𝒸 -> ULCExp_R 𝒸
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
forall 𝒸. ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
unULCExp) ((ULCExp_R 𝒸 -> Bool) -> ULCExp 𝒸 -> Bool)
-> (ULCExp_R 𝒸 -> Bool) -> ULCExp 𝒸 -> Bool
forall a b. (a -> b) -> a -> b
$ \case
Var_ULC UVar () (ULCExp 𝒸)
y → UVar () (ULCExp 𝒸) -> Bool
forall s e. Ord s => UVar s e -> Bool
wfUVar UVar () (ULCExp 𝒸)
y
Lam_ULC 𝑂 Name
_wO ULCExp 𝒸
e → ULCExp 𝒸 -> Bool
forall 𝒸. ULCExp 𝒸 -> Bool
wfULC ULCExp 𝒸
e
App_ULC ULCExp 𝒸
e₁ ULCExp 𝒸
e₂ → [Bool] -> Bool
forall t. ToIter Bool t => t -> Bool
and [ULCExp 𝒸 -> Bool
forall 𝒸. ULCExp 𝒸 -> Bool
wfULC ULCExp 𝒸
e₁,ULCExp 𝒸 -> Bool
forall 𝒸. ULCExp 𝒸 -> Bool
wfULC ULCExp 𝒸
e₂]
canonULC ∷ (Null 𝒸,Show 𝒸) ⇒ ULCExp 𝒸 → ULCExp 𝒸
canonULC :: forall 𝒸. (Null 𝒸, Show 𝒸) => ULCExp 𝒸 -> ULCExp 𝒸
canonULC = (𝐴 𝒸 (ULCExp_R 𝒸) -> 𝐴 𝒸 (ULCExp_R 𝒸)) -> ULCExp 𝒸 -> ULCExp 𝒸
forall 𝒸 𝒸'.
(𝐴 𝒸 (ULCExp_R 𝒸) -> 𝐴 𝒸' (ULCExp_R 𝒸')) -> ULCExp 𝒸 -> ULCExp 𝒸'
onULCExp ((𝐴 𝒸 (ULCExp_R 𝒸) -> 𝐴 𝒸 (ULCExp_R 𝒸)) -> ULCExp 𝒸 -> ULCExp 𝒸)
-> (𝐴 𝒸 (ULCExp_R 𝒸) -> 𝐴 𝒸 (ULCExp_R 𝒸)) -> ULCExp 𝒸 -> ULCExp 𝒸
forall a b. (a -> b) -> a -> b
$ (ULCExp_R 𝒸 -> ULCExp_R 𝒸) -> 𝐴 𝒸 (ULCExp_R 𝒸) -> 𝐴 𝒸 (ULCExp_R 𝒸)
forall a b e. (a -> b) -> 𝐴 e a -> 𝐴 e b
mapAVal ((ULCExp_R 𝒸 -> ULCExp_R 𝒸)
-> 𝐴 𝒸 (ULCExp_R 𝒸) -> 𝐴 𝒸 (ULCExp_R 𝒸))
-> (ULCExp_R 𝒸 -> ULCExp_R 𝒸)
-> 𝐴 𝒸 (ULCExp_R 𝒸)
-> 𝐴 𝒸 (ULCExp_R 𝒸)
forall a b. (a -> b) -> a -> b
$ \case
Var_ULC UVar () (ULCExp 𝒸)
x → UVar () (ULCExp 𝒸) -> ULCExp_R 𝒸
forall 𝒸. UVar () (ULCExp 𝒸) -> ULCExp_R 𝒸
Var_ULC (UVar () (ULCExp 𝒸) -> ULCExp_R 𝒸)
-> UVar () (ULCExp 𝒸) -> ULCExp_R 𝒸
forall a b. (a -> b) -> a -> b
$ (ULCExp 𝒸 -> ULCExp 𝒸) -> UVar () (ULCExp 𝒸) -> UVar () (ULCExp 𝒸)
forall s e.
(Ord s, Eq e, Substy s e e) =>
(e -> e) -> UVar s e -> UVar s e
canonUVar ULCExp 𝒸 -> ULCExp 𝒸
forall 𝒸. (Null 𝒸, Show 𝒸) => ULCExp 𝒸 -> ULCExp 𝒸
canonULC UVar () (ULCExp 𝒸)
x
Lam_ULC 𝑂 Name
xO ULCExp 𝒸
e → 𝑂 Name -> ULCExp 𝒸 -> ULCExp_R 𝒸
forall 𝒸. 𝑂 Name -> ULCExp 𝒸 -> ULCExp_R 𝒸
Lam_ULC 𝑂 Name
xO (ULCExp 𝒸 -> ULCExp_R 𝒸) -> ULCExp 𝒸 -> ULCExp_R 𝒸
forall a b. (a -> b) -> a -> b
$ ULCExp 𝒸 -> ULCExp 𝒸
forall 𝒸. (Null 𝒸, Show 𝒸) => ULCExp 𝒸 -> ULCExp 𝒸
canonULC ULCExp 𝒸
e
App_ULC ULCExp 𝒸
e₁ ULCExp 𝒸
e₂ → ULCExp 𝒸 -> ULCExp 𝒸 -> ULCExp_R 𝒸
forall 𝒸. ULCExp 𝒸 -> ULCExp 𝒸 -> ULCExp_R 𝒸
App_ULC (ULCExp 𝒸 -> ULCExp 𝒸
forall 𝒸. (Null 𝒸, Show 𝒸) => ULCExp 𝒸 -> ULCExp 𝒸
canonULC ULCExp 𝒸
e₁) (ULCExp 𝒸 -> ULCExp_R 𝒸) -> ULCExp 𝒸 -> ULCExp_R 𝒸
forall a b. (a -> b) -> a -> b
$ ULCExp 𝒸 -> ULCExp 𝒸
forall 𝒸. (Null 𝒸, Show 𝒸) => ULCExp 𝒸 -> ULCExp 𝒸
canonULC ULCExp 𝒸
e₂
syntaxULC ∷ LexerBasicSyntax
syntaxULC :: LexerBasicSyntax
syntaxULC = [LexerBasicSyntax] -> LexerBasicSyntax
forall a t. (Monoid a, ToIter a t) => t -> a
concat
[ LexerBasicSyntax
syntaxUVar
, LexerBasicSyntax
forall a. Null a => a
null { lexerBasicSyntaxPuns = pow ["(",")","->","→"]
, lexerBasicSyntaxKeys = pow ["lam","λ"]
}
]
lexULCExp ∷ Lexer CharClass ℂ TokenClassBasic ℕ64 TokenBasic
lexULCExp :: Lexer CharClass ℂ TokenClassBasic ℕ64 TokenBasic
lexULCExp = LexerBasicSyntax
-> Lexer CharClass ℂ TokenClassBasic ℕ64 TokenBasic
lexerBasic LexerBasicSyntax
syntaxULC
pULCExp ∷ CParser TokenBasic ULCExpSrc
pULCExp :: CParser TokenBasic ULCExpSrc
pULCExp = 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExpSrc
forall 𝒸. 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸
ULCExp (𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExpSrc)
-> CParser TokenBasic (𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)))
-> CParser TokenBasic ULCExpSrc
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ 𝕊
-> MixfixF TokenBasic (𝐴 (𝑃 SrcCxt)) (ULCExp_R (𝑃 SrcCxt))
-> CParser TokenBasic (𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)))
forall t a.
Ord t =>
𝕊 -> MixfixF t (𝐴 (𝑃 SrcCxt)) a -> CParser t (𝐴 (𝑃 SrcCxt) a)
fmixfixWithContextSet 𝕊
"exp" (MixfixF TokenBasic (𝐴 (𝑃 SrcCxt)) (ULCExp_R (𝑃 SrcCxt))
-> CParser TokenBasic (𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt))))
-> MixfixF TokenBasic (𝐴 (𝑃 SrcCxt)) (ULCExp_R (𝑃 SrcCxt))
-> CParser TokenBasic (𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)))
forall a b. (a -> b) -> a -> b
$ [MixfixF TokenBasic (𝐴 (𝑃 SrcCxt)) (ULCExp_R (𝑃 SrcCxt))]
-> MixfixF TokenBasic (𝐴 (𝑃 SrcCxt)) (ULCExp_R (𝑃 SrcCxt))
forall a t. (Monoid a, ToIter a t) => t -> a
concat
[ CParser TokenBasic (ULCExp_R (𝑃 SrcCxt))
-> MixfixF TokenBasic (𝐴 (𝑃 SrcCxt)) (ULCExp_R (𝑃 SrcCxt))
forall t a (f :: * -> *). CParser t a -> MixfixF t f a
fmixTerminal (CParser TokenBasic (ULCExp_R (𝑃 SrcCxt))
-> MixfixF TokenBasic (𝐴 (𝑃 SrcCxt)) (ULCExp_R (𝑃 SrcCxt)))
-> CParser TokenBasic (ULCExp_R (𝑃 SrcCxt))
-> MixfixF TokenBasic (𝐴 (𝑃 SrcCxt)) (ULCExp_R (𝑃 SrcCxt))
forall a b. (a -> b) -> a -> b
$ 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
cpSyntax 𝕊
"("
ULCExpSrc
e ← CParser TokenBasic ULCExpSrc
pULCExp
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
cpSyntax 𝕊
")"
ULCExp_R (𝑃 SrcCxt) -> CParser TokenBasic (ULCExp_R (𝑃 SrcCxt))
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return (ULCExp_R (𝑃 SrcCxt) -> CParser TokenBasic (ULCExp_R (𝑃 SrcCxt)))
-> ULCExp_R (𝑃 SrcCxt) -> CParser TokenBasic (ULCExp_R (𝑃 SrcCxt))
forall a b. (a -> b) -> a -> b
$ 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt)
forall e a. 𝐴 e a -> a
aval (𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt))
-> 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt)
forall a b. (a -> b) -> a -> b
$ ULCExpSrc -> 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt))
forall 𝒸. ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
unULCExp ULCExpSrc
e
, CParser TokenBasic (ULCExp_R (𝑃 SrcCxt))
-> MixfixF TokenBasic (𝐴 (𝑃 SrcCxt)) (ULCExp_R (𝑃 SrcCxt))
forall t a (f :: * -> *). CParser t a -> MixfixF t f a
fmixTerminal (CParser TokenBasic (ULCExp_R (𝑃 SrcCxt))
-> MixfixF TokenBasic (𝐴 (𝑃 SrcCxt)) (ULCExp_R (𝑃 SrcCxt)))
-> CParser TokenBasic (ULCExp_R (𝑃 SrcCxt))
-> MixfixF TokenBasic (𝐴 (𝑃 SrcCxt)) (ULCExp_R (𝑃 SrcCxt))
forall a b. (a -> b) -> a -> b
$ do
UVar () ULCExpSrc
x ← (() -> CParser TokenBasic ULCExpSrc)
-> CParser TokenBasic (UVar () ULCExpSrc)
forall e.
(Eq e, Substy () e e) =>
(() -> CParser TokenBasic e) -> CParser TokenBasic (UVar () e)
pUVar ((() -> CParser TokenBasic ULCExpSrc)
-> CParser TokenBasic (UVar () ULCExpSrc))
-> (() -> CParser TokenBasic ULCExpSrc)
-> CParser TokenBasic (UVar () ULCExpSrc)
forall a b. (a -> b) -> a -> b
$ \ () → CParser TokenBasic ULCExpSrc
pULCExp
ULCExp_R (𝑃 SrcCxt) -> CParser TokenBasic (ULCExp_R (𝑃 SrcCxt))
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return (ULCExp_R (𝑃 SrcCxt) -> CParser TokenBasic (ULCExp_R (𝑃 SrcCxt)))
-> ULCExp_R (𝑃 SrcCxt) -> CParser TokenBasic (ULCExp_R (𝑃 SrcCxt))
forall a b. (a -> b) -> a -> b
$ UVar () ULCExpSrc -> ULCExp_R (𝑃 SrcCxt)
forall 𝒸. UVar () (ULCExp 𝒸) -> ULCExp_R 𝒸
Var_ULC UVar () ULCExpSrc
x
, ℕ64
-> CParser
TokenBasic
(𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt))
-> MixfixF TokenBasic (𝐴 (𝑃 SrcCxt)) (ULCExp_R (𝑃 SrcCxt))
forall t (f :: * -> *) a.
ℕ64 -> CParser t (f a -> a) -> MixfixF t f a
fmixPrefix ℕ64
pLET (CParser
TokenBasic
(𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt))
-> MixfixF TokenBasic (𝐴 (𝑃 SrcCxt)) (ULCExp_R (𝑃 SrcCxt)))
-> CParser
TokenBasic
(𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt))
-> MixfixF TokenBasic (𝐴 (𝑃 SrcCxt)) (ULCExp_R (𝑃 SrcCxt))
forall a b. (a -> b) -> a -> b
$ 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
$ (𝕊 -> CParser TokenBasic TokenBasic)
-> [𝕊] -> [CParser TokenBasic TokenBasic]
forall a b. (a -> b) -> [a] -> [b]
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
map 𝕊 -> CParser TokenBasic TokenBasic
cpSyntax [𝕊
"lam",𝕊
"λ"]
𝑂 Name
xO ← CParser TokenBasic Name -> CParser TokenBasic (𝑂 Name)
forall t a. Ord t => CParser t a -> CParser t (𝑂 a)
cpOptional (CParser TokenBasic Name -> CParser TokenBasic (𝑂 Name))
-> CParser TokenBasic Name -> CParser TokenBasic (𝑂 Name)
forall a b. (a -> b) -> a -> b
$ CParser TokenBasic Name
pName
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
$ (𝕊 -> CParser TokenBasic TokenBasic)
-> [𝕊] -> [CParser TokenBasic TokenBasic]
forall a b. (a -> b) -> [a] -> [b]
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
map 𝕊 -> CParser TokenBasic TokenBasic
cpSyntax [𝕊
"->",𝕊
"→"]
(𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt))
-> CParser
TokenBasic
(𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt))
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return ((𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt))
-> CParser
TokenBasic
(𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt)))
-> (𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt))
-> CParser
TokenBasic
(𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt))
forall a b. (a -> b) -> a -> b
$ \ 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt))
e → 𝑂 Name -> ULCExpSrc -> ULCExp_R (𝑃 SrcCxt)
forall 𝒸. 𝑂 Name -> ULCExp 𝒸 -> ULCExp_R 𝒸
Lam_ULC 𝑂 Name
xO (ULCExpSrc -> ULCExp_R (𝑃 SrcCxt))
-> ULCExpSrc -> ULCExp_R (𝑃 SrcCxt)
forall a b. (a -> b) -> a -> b
$ 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExpSrc
forall 𝒸. 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸
ULCExp 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt))
e
, ℕ64
-> CParser
TokenBasic
(𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt))
-> 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt))
-> MixfixF TokenBasic (𝐴 (𝑃 SrcCxt)) (ULCExp_R (𝑃 SrcCxt))
forall t (f :: * -> *) a.
ℕ64 -> CParser t (f a -> f a -> a) -> MixfixF t f a
fmixInfixL ℕ64
pAPP (CParser
TokenBasic
(𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt))
-> 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt))
-> MixfixF TokenBasic (𝐴 (𝑃 SrcCxt)) (ULCExp_R (𝑃 SrcCxt)))
-> CParser
TokenBasic
(𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt))
-> 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt))
-> MixfixF TokenBasic (𝐴 (𝑃 SrcCxt)) (ULCExp_R (𝑃 SrcCxt))
forall a b. (a -> b) -> a -> b
$ (𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt))
-> 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt))
-> CParser
TokenBasic
(𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt))
-> 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt))
forall a. a -> CParser TokenBasic a
forall (m :: * -> *) a. Return m => a -> m a
return ((𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt))
-> 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt))
-> CParser
TokenBasic
(𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt))
-> 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt)))
-> (𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt))
-> 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt))
-> CParser
TokenBasic
(𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt))
-> 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExp_R (𝑃 SrcCxt))
forall a b. (a -> b) -> a -> b
$ \ 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt))
e₁ 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt))
e₂ →
ULCExpSrc -> ULCExpSrc -> ULCExp_R (𝑃 SrcCxt)
forall 𝒸. ULCExp 𝒸 -> ULCExp 𝒸 -> ULCExp_R 𝒸
App_ULC (𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExpSrc
forall 𝒸. 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸
ULCExp 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt))
e₁) (ULCExpSrc -> ULCExp_R (𝑃 SrcCxt))
-> ULCExpSrc -> ULCExp_R (𝑃 SrcCxt)
forall a b. (a -> b) -> a -> b
$ 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt)) -> ULCExpSrc
forall 𝒸. 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸
ULCExp 𝐴 (𝑃 SrcCxt) (ULCExp_R (𝑃 SrcCxt))
e₂
]
instance (Show 𝒸) ⇒ Pretty (ULCExp 𝒸) where pretty :: ULCExp 𝒸 -> Doc
pretty = ULCExp_R 𝒸 -> Doc
forall a. Pretty a => a -> Doc
pretty (ULCExp_R 𝒸 -> Doc)
-> (𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp_R 𝒸) -> 𝐴 𝒸 (ULCExp_R 𝒸) -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp_R 𝒸
forall e a. 𝐴 e a -> a
aval (𝐴 𝒸 (ULCExp_R 𝒸) -> Doc)
-> (ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)) -> ULCExp 𝒸 -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
forall 𝒸. ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
unULCExp
instance (Show 𝒸) ⇒ Pretty (ULCExp_R 𝒸) where
pretty :: ULCExp_R 𝒸 -> Doc
pretty = \case
Var_ULC UVar () (ULCExp 𝒸)
x → UVar () (ULCExp 𝒸) -> Doc
forall a. Pretty a => a -> Doc
pretty UVar () (ULCExp 𝒸)
x
Lam_ULC 𝑂 Name
xO ULCExp 𝒸
e → (Doc -> Doc -> Doc) -> Doc -> Doc -> Doc
forall a b c. (a -> b -> c) -> b -> a -> c
flip (ℕ64 -> Doc -> Doc -> Doc
ppPreSep ℕ64
pLET) (ULCExp 𝒸 -> Doc
forall a. Pretty a => a -> Doc
pretty ULCExp 𝒸
e) (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ 𝐼 Doc -> Doc
forall t. ToIter Doc t => t -> Doc
ppHorizontal (𝐼 Doc -> Doc) -> 𝐼 Doc -> Doc
forall a b. (a -> b) -> a -> b
$ [𝐼 Doc] -> 𝐼 Doc
forall a t. (Monoid a, ToIter a t) => t -> a
concat
[ Doc -> 𝐼 Doc
forall a. a -> 𝐼 a
single𝐼 (Doc -> 𝐼 Doc) -> Doc -> 𝐼 Doc
forall a b. (a -> b) -> a -> b
$ 𝕊 -> Doc
ppKey 𝕊
"λ"
, (() -> 𝐼 Doc) -> (Name -> 𝐼 Doc) -> 𝑂 Name -> 𝐼 Doc
forall b a. (() -> b) -> (a -> b) -> 𝑂 a -> b
elim𝑂 () -> 𝐼 Doc
forall a. Null a => a
null (Doc -> 𝐼 Doc
forall a t. Single a t => a -> t
single (Doc -> 𝐼 Doc) -> (Doc -> Doc) -> Doc -> 𝐼 Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ Doc -> Doc
ppBdrFmt (Doc -> 𝐼 Doc) -> (Name -> Doc) -> Name -> 𝐼 Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ Name -> Doc
forall a. Pretty a => a -> Doc
pretty) 𝑂 Name
xO
, Doc -> 𝐼 Doc
forall a. a -> 𝐼 a
single𝐼 (Doc -> 𝐼 Doc) -> Doc -> 𝐼 Doc
forall a b. (a -> b) -> a -> b
$ 𝕊 -> Doc
ppKey 𝕊
"→"
]
App_ULC ULCExp 𝒸
e₁ ULCExp 𝒸
e₂ → ℕ64 -> Doc -> Doc -> Doc -> Doc
ppInfl ℕ64
pAPP (ℕ64 -> Doc
ppSpace ℕ64
forall a. One a => a
one) (ULCExp 𝒸 -> Doc
forall a. Pretty a => a -> Doc
pretty ULCExp 𝒸
e₁) (Doc -> Doc) -> Doc -> Doc
forall a b. (a -> b) -> a -> b
$ ULCExp 𝒸 -> Doc
forall a. Pretty a => a -> Doc
pretty ULCExp 𝒸
e₂
instance Shrinky (ULCExp 𝒸) where
shrink :: ULCExp 𝒸 -> 𝐼 (ULCExp 𝒸)
shrink (ULCExp (𝐴 𝒸
𝒸 ULCExp_R 𝒸
e)) = 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸
forall 𝒸. 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸
ULCExp (𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸)
-> (ULCExp_R 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)) -> ULCExp_R 𝒸 -> ULCExp 𝒸
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ 𝒸 -> ULCExp_R 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
forall e a. e -> a -> 𝐴 e a
𝐴 𝒸
𝒸 (ULCExp_R 𝒸 -> ULCExp 𝒸) -> 𝐼 (ULCExp_R 𝒸) -> 𝐼 (ULCExp 𝒸)
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ ULCExp_R 𝒸 -> 𝐼 (ULCExp_R 𝒸)
forall a. Shrinky a => a -> 𝐼 a
shrink ULCExp_R 𝒸
e
instance Shrinky (ULCExp_R 𝒸) where
shrink :: ULCExp_R 𝒸 -> 𝐼 (ULCExp_R 𝒸)
shrink = \case
Var_ULC UVar () (ULCExp 𝒸)
x → UVar () (ULCExp 𝒸) -> ULCExp_R 𝒸
forall 𝒸. UVar () (ULCExp 𝒸) -> ULCExp_R 𝒸
Var_ULC (UVar () (ULCExp 𝒸) -> ULCExp_R 𝒸)
-> 𝐼 (UVar () (ULCExp 𝒸)) -> 𝐼 (ULCExp_R 𝒸)
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ UVar () (ULCExp 𝒸) -> 𝐼 (UVar () (ULCExp 𝒸))
forall a. Shrinky a => a -> 𝐼 a
shrink UVar () (ULCExp 𝒸)
x
Lam_ULC 𝑂 Name
xO ULCExp 𝒸
e → [𝐼 (ULCExp_R 𝒸)] -> 𝐼 (ULCExp_R 𝒸)
forall a t. (Monoid a, ToIter a t) => t -> a
concat
[ ULCExp_R 𝒸 -> 𝐼 (ULCExp_R 𝒸)
forall a t. Single a t => a -> t
single (ULCExp_R 𝒸 -> 𝐼 (ULCExp_R 𝒸)) -> ULCExp_R 𝒸 -> 𝐼 (ULCExp_R 𝒸)
forall a b. (a -> b) -> a -> b
$ 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp_R 𝒸
forall e a. 𝐴 e a -> a
aval (𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp_R 𝒸) -> 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp_R 𝒸
forall a b. (a -> b) -> a -> b
$ ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
forall 𝒸. ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
unULCExp ULCExp 𝒸
e
, do (𝑂 Name
xO',ULCExp 𝒸
e') ← (𝑂 Name, ULCExp 𝒸) -> 𝐼 (𝑂 Name, ULCExp 𝒸)
forall a. Shrinky a => a -> 𝐼 a
shrink (𝑂 Name
xO,ULCExp 𝒸
e) ; ULCExp_R 𝒸 -> 𝐼 (ULCExp_R 𝒸)
forall a. a -> 𝐼 a
forall (m :: * -> *) a. Return m => a -> m a
return (ULCExp_R 𝒸 -> 𝐼 (ULCExp_R 𝒸)) -> ULCExp_R 𝒸 -> 𝐼 (ULCExp_R 𝒸)
forall a b. (a -> b) -> a -> b
$ 𝑂 Name -> ULCExp 𝒸 -> ULCExp_R 𝒸
forall 𝒸. 𝑂 Name -> ULCExp 𝒸 -> ULCExp_R 𝒸
Lam_ULC 𝑂 Name
xO' ULCExp 𝒸
e'
]
App_ULC ULCExp 𝒸
e₁ ULCExp 𝒸
e₂ → [𝐼 (ULCExp_R 𝒸)] -> 𝐼 (ULCExp_R 𝒸)
forall a t. (Monoid a, ToIter a t) => t -> a
concat
[ ULCExp_R 𝒸 -> 𝐼 (ULCExp_R 𝒸)
forall a t. Single a t => a -> t
single (ULCExp_R 𝒸 -> 𝐼 (ULCExp_R 𝒸)) -> ULCExp_R 𝒸 -> 𝐼 (ULCExp_R 𝒸)
forall a b. (a -> b) -> a -> b
$ 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp_R 𝒸
forall e a. 𝐴 e a -> a
aval (𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp_R 𝒸) -> 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp_R 𝒸
forall a b. (a -> b) -> a -> b
$ ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
forall 𝒸. ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
unULCExp ULCExp 𝒸
e₁
, ULCExp_R 𝒸 -> 𝐼 (ULCExp_R 𝒸)
forall a t. Single a t => a -> t
single (ULCExp_R 𝒸 -> 𝐼 (ULCExp_R 𝒸)) -> ULCExp_R 𝒸 -> 𝐼 (ULCExp_R 𝒸)
forall a b. (a -> b) -> a -> b
$ 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp_R 𝒸
forall e a. 𝐴 e a -> a
aval (𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp_R 𝒸) -> 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp_R 𝒸
forall a b. (a -> b) -> a -> b
$ ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
forall 𝒸. ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
unULCExp ULCExp 𝒸
e₂
, do (ULCExp 𝒸
e₁',ULCExp 𝒸
e₂') ← (ULCExp 𝒸, ULCExp 𝒸) -> 𝐼 (ULCExp 𝒸, ULCExp 𝒸)
forall a. Shrinky a => a -> 𝐼 a
shrink (ULCExp 𝒸
e₁,ULCExp 𝒸
e₂) ; ULCExp_R 𝒸 -> 𝐼 (ULCExp_R 𝒸)
forall a. a -> 𝐼 a
forall (m :: * -> *) a. Return m => a -> m a
return (ULCExp_R 𝒸 -> 𝐼 (ULCExp_R 𝒸)) -> ULCExp_R 𝒸 -> 𝐼 (ULCExp_R 𝒸)
forall a b. (a -> b) -> a -> b
$ ULCExp 𝒸 -> ULCExp 𝒸 -> ULCExp_R 𝒸
forall 𝒸. ULCExp 𝒸 -> ULCExp 𝒸 -> ULCExp_R 𝒸
App_ULC ULCExp 𝒸
e₁' ULCExp 𝒸
e₂'
]
deriving instance (TH.Lift 𝒸) ⇒ TH.Lift (ULCExp 𝒸)
deriving instance (TH.Lift 𝒸) ⇒ TH.Lift (ULCExp_R 𝒸)
ulc ∷ TH.QuasiQuoter
ulc :: QuasiQuoter
ulc = (String -> Q Exp)
-> (String -> Q Pat)
-> (String -> Q Type)
-> (String -> Q [Dec])
-> QuasiQuoter
TH.QuasiQuoter String -> Q Exp
qe String -> Q Pat
forall {b} {a}. b -> Q a
qp String -> Q Type
forall {b} {a}. b -> Q a
qt String -> Q [Dec]
forall {b} {a}. b -> Q a
qd
where
qe :: String -> Q Exp
qe String
s = do
Loc
l ← Q Loc
TH.location
let lS :: 𝕊
lS = [𝕊] -> 𝕊
forall a t. (Monoid a, ToIter a t) => t -> a
concat [String -> 𝕊
frhsChars (String -> 𝕊) -> String -> 𝕊
forall a b. (a -> b) -> a -> b
$ Loc -> String
TH.loc_module Loc
l,𝕊
":",ℤ64 -> 𝕊
forall a. Show a => a -> 𝕊
show𝕊 (ℤ64 -> 𝕊) -> ℤ64 -> 𝕊
forall a b. (a -> b) -> a -> b
$ (ℤ64 ∧ ℤ64) -> ℤ64
forall a b. (a ∧ b) -> a
fst ((ℤ64 ∧ ℤ64) -> ℤ64) -> (ℤ64 ∧ ℤ64) -> ℤ64
forall a b. (a -> b) -> a -> b
$ CharPos -> ℤ64 ∧ ℤ64
forall a b. CHS a b => b -> a
frhs (CharPos -> ℤ64 ∧ ℤ64) -> CharPos -> ℤ64 ∧ ℤ64
forall a b. (a -> b) -> a -> b
$ Loc -> CharPos
TH.loc_start Loc
l]
𝕍 (ParserToken TokenBasic)
ts ← case Lexer CharClass ℂ TokenClassBasic ℕ64 TokenBasic
-> 𝕊 -> 𝕍 (ParserToken ℂ) -> Doc ∨ 𝕍 (PreParserToken TokenBasic)
forall c t o u w.
(Show u, Ord c, Ord t, Pretty t, Classified c t, Eq o, Eq u,
Plus u) =>
Lexer c t o u w
-> 𝕊 -> 𝕍 (ParserToken t) -> Doc ∨ 𝕍 (PreParserToken w)
tokenize Lexer CharClass ℂ TokenClassBasic ℕ64 TokenBasic
lexULCExp 𝕊
lS (𝕍 (ParserToken ℂ) -> Doc ∨ 𝕍 (PreParserToken TokenBasic))
-> 𝕍 (ParserToken ℂ) -> Doc ∨ 𝕍 (PreParserToken TokenBasic)
forall a b. (a -> b) -> a -> b
$ 𝕊 -> 𝕍 (ParserToken ℂ)
tokens (𝕊 -> 𝕍 (ParserToken ℂ)) -> 𝕊 -> 𝕍 (ParserToken ℂ)
forall a b. (a -> b) -> a -> b
$ String -> 𝕊
frhsChars String
s of
Inl Doc
r → do
String -> Q (𝕍 (ParserToken TokenBasic))
forall a. String -> Q a
forall (m :: * -> *) a. MonadFail m => String -> m a
HS.fail (String -> Q (𝕍 (ParserToken TokenBasic)))
-> String -> Q (𝕍 (ParserToken TokenBasic))
forall a b. (a -> b) -> a -> b
$ 𝕊 -> String
tohsChars (𝕊 -> String) -> 𝕊 -> String
forall a b. (a -> b) -> a -> b
$ 𝕊 -> 𝕊 -> 𝕊 -> 𝕊
replace𝕊 𝕊
"\n" 𝕊
"\n " (𝕊 -> 𝕊) -> 𝕊 -> 𝕊
forall a b. (a -> b) -> a -> b
$ Doc -> 𝕊
ppRender (Doc -> 𝕊) -> Doc -> 𝕊
forall a b. (a -> b) -> a -> b
$ [Doc] -> Doc
forall t. ToIter Doc t => t -> Doc
ppVertical
[ 𝕊 -> Doc
ppHeader 𝕊
"[Lexing Failure]"
, Doc
r
]
Inr 𝕍 (PreParserToken TokenBasic)
xs → 𝕍 (ParserToken TokenBasic) -> Q (𝕍 (ParserToken TokenBasic))
forall a. a -> Q a
forall (m :: * -> *) a. Return m => a -> m a
return (𝕍 (ParserToken TokenBasic) -> Q (𝕍 (ParserToken TokenBasic)))
-> 𝕍 (ParserToken TokenBasic) -> Q (𝕍 (ParserToken TokenBasic))
forall a b. (a -> b) -> a -> b
$ 𝕍 (PreParserToken TokenBasic) -> 𝕍 (ParserToken TokenBasic)
forall t. 𝕍 (PreParserToken t) -> 𝕍 (ParserToken t)
finalizeTokens 𝕍 (PreParserToken TokenBasic)
xs
let eC :: Doc ∨ ULCExpSrc
eC = CParser TokenBasic ULCExpSrc
-> 𝕊 -> 𝕍 (ParserToken TokenBasic) -> Doc ∨ ULCExpSrc
forall a t ts.
(Pretty a, ToIter (ParserToken t) ts, Ord t) =>
CParser t a -> 𝕊 -> ts -> Doc ∨ a
parse CParser TokenBasic ULCExpSrc
pULCExp 𝕊
lS 𝕍 (ParserToken TokenBasic)
ts
case Doc ∨ ULCExpSrc
eC of
Inl Doc
r → do
String -> Q Exp
forall a. String -> Q a
forall (m :: * -> *) a. MonadFail m => String -> m a
HS.fail (String -> Q Exp) -> String -> Q Exp
forall a b. (a -> b) -> a -> b
$ 𝕊 -> String
tohsChars (𝕊 -> String) -> 𝕊 -> String
forall a b. (a -> b) -> a -> b
$ 𝕊 -> 𝕊 -> 𝕊 -> 𝕊
replace𝕊 𝕊
"\n" 𝕊
"\n " (𝕊 -> 𝕊) -> 𝕊 -> 𝕊
forall a b. (a -> b) -> a -> b
$ Doc -> 𝕊
ppRender (Doc -> 𝕊) -> Doc -> 𝕊
forall a b. (a -> b) -> a -> b
$ [Doc] -> Doc
forall t. ToIter Doc t => t -> Doc
ppVertical
[ 𝕊 -> Doc
ppHeader 𝕊
"[Parsing Failure]"
, Doc
r
]
Inr ULCExpSrc
e → [| e |]
qp :: b -> Q a
qp = Q a -> b -> Q a
forall a b. a -> b -> a
const (Q a -> b -> Q a) -> Q a -> b -> Q a
forall a b. (a -> b) -> a -> b
$ String -> Q a
forall a. String -> Q a
forall (m :: * -> *) a. MonadFail m => String -> m a
HS.fail String
"quoting patterns not supported"
qt :: b -> Q a
qt = Q a -> b -> Q a
forall a b. a -> b -> a
const (Q a -> b -> Q a) -> Q a -> b -> Q a
forall a b. (a -> b) -> a -> b
$ String -> Q a
forall a. String -> Q a
forall (m :: * -> *) a. MonadFail m => String -> m a
HS.fail String
"quoting types not supported"
qd :: b -> Q a
qd = Q a -> b -> Q a
forall a b. a -> b -> a
const (Q a -> b -> Q a) -> Q a -> b -> Q a
forall a b. (a -> b) -> a -> b
$ String -> Q a
forall a. String -> Q a
forall (m :: * -> *) a. MonadFail m => String -> m a
HS.fail String
"quoting declarations not supported"
instance Fuzzy ULCExpRaw where
fuzzy :: FuzzyM ULCExpRaw
fuzzy = do
ℕ64
d ← (FuzzyEnv ⟢ ℕ64) -> FuzzyM ℕ64
forall r'. (FuzzyEnv ⟢ r') -> FuzzyM r'
forall r (m :: * -> *) r'. MonadReader r m => (r ⟢ r') -> m r'
askL FuzzyEnv ⟢ ℕ64
fuzzyEnvDepthL
𝐴 () (ULCExp_R ()) -> ULCExpRaw
forall 𝒸. 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸
ULCExp (𝐴 () (ULCExp_R ()) -> ULCExpRaw)
-> (ULCExp_R () -> 𝐴 () (ULCExp_R ())) -> ULCExp_R () -> ULCExpRaw
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ () -> ULCExp_R () -> 𝐴 () (ULCExp_R ())
forall e a. e -> a -> 𝐴 e a
𝐴 () (ULCExp_R () -> ULCExpRaw)
-> FuzzyM (ULCExp_R ()) -> FuzzyM ULCExpRaw
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ [ℕ64 ∧ (() -> FuzzyM (ULCExp_R ()))] -> FuzzyM (ULCExp_R ())
forall t (m :: * -> *) a.
(Monad m, MonadRand m, ToIter (ℕ64 ∧ (() -> m a)) t) =>
t -> m a
wrchoose
[ ℕ64
-> (() -> FuzzyM (ULCExp_R ()))
-> ℕ64 ∧ (() -> FuzzyM (ULCExp_R ()))
forall a b. a -> b -> a ∧ b
(:*) ℕ64
forall a. One a => a
one ((() -> FuzzyM (ULCExp_R ()))
-> ℕ64 ∧ (() -> FuzzyM (ULCExp_R ())))
-> (() -> FuzzyM (ULCExp_R ()))
-> ℕ64 ∧ (() -> FuzzyM (ULCExp_R ()))
forall a b. (a -> b) -> a -> b
$ \ () → UVar () ULCExpRaw -> ULCExp_R ()
forall 𝒸. UVar () (ULCExp 𝒸) -> ULCExp_R 𝒸
Var_ULC (UVar () ULCExpRaw -> ULCExp_R ())
-> FuzzyM (UVar () ULCExpRaw) -> FuzzyM (ULCExp_R ())
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ FuzzyM (UVar () ULCExpRaw)
forall a. Fuzzy a => FuzzyM a
fuzzy
, ℕ64
-> (() -> FuzzyM (ULCExp_R ()))
-> ℕ64 ∧ (() -> FuzzyM (ULCExp_R ()))
forall a b. a -> b -> a ∧ b
(:*) ℕ64
d ((() -> FuzzyM (ULCExp_R ()))
-> ℕ64 ∧ (() -> FuzzyM (ULCExp_R ())))
-> (() -> FuzzyM (ULCExp_R ()))
-> ℕ64 ∧ (() -> FuzzyM (ULCExp_R ()))
forall a b. (a -> b) -> a -> b
$ \ () → [() -> FuzzyM (ULCExp_R ())] -> FuzzyM (ULCExp_R ())
forall (m :: * -> *) a t.
(Monad m, MonadRand m, ToIter (() -> m a) t) =>
t -> m a
rchoose
[ \ () → do
𝑂 Name
xO ← FuzzyM (𝑂 Name)
forall a. Fuzzy a => FuzzyM a
fuzzy
ULCExpRaw
e ← FuzzyM ULCExpRaw
forall a. Fuzzy a => FuzzyM a
fuzzyRec
ULCExp_R () -> FuzzyM (ULCExp_R ())
forall a. a -> FuzzyM a
forall (m :: * -> *) a. Return m => a -> m a
return (ULCExp_R () -> FuzzyM (ULCExp_R ()))
-> ULCExp_R () -> FuzzyM (ULCExp_R ())
forall a b. (a -> b) -> a -> b
$ 𝑂 Name -> ULCExpRaw -> ULCExp_R ()
forall 𝒸. 𝑂 Name -> ULCExp 𝒸 -> ULCExp_R 𝒸
Lam_ULC 𝑂 Name
xO ULCExpRaw
e
, \ () → do
ULCExpRaw
e₁ ← FuzzyM ULCExpRaw
forall a. Fuzzy a => FuzzyM a
fuzzyRec
ULCExpRaw
e₂ ← FuzzyM ULCExpRaw
forall a. Fuzzy a => FuzzyM a
fuzzyRec
ULCExp_R () -> FuzzyM (ULCExp_R ())
forall a. a -> FuzzyM a
forall (m :: * -> *) a. Return m => a -> m a
return (ULCExp_R () -> FuzzyM (ULCExp_R ()))
-> ULCExp_R () -> FuzzyM (ULCExp_R ())
forall a b. (a -> b) -> a -> b
$ ULCExpRaw -> ULCExpRaw -> ULCExp_R ()
forall 𝒸. ULCExp 𝒸 -> ULCExp 𝒸 -> ULCExp_R 𝒸
App_ULC ULCExpRaw
e₁ ULCExpRaw
e₂
]
]
instance (Null 𝒸) ⇒ SVarView () (ULCExp 𝒸) where
svarL :: () -> ULCExp 𝒸 ⌲ SVar
svarL () =
let ctor ∷ SVar → ULCExp 𝒸
ctor :: SVar -> ULCExp 𝒸
ctor = 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸
forall 𝒸. 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸
ULCExp (𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸)
-> (ULCExp_R 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)) -> ULCExp_R 𝒸 -> ULCExp 𝒸
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ 𝒸 -> ULCExp_R 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
forall e a. e -> a -> 𝐴 e a
𝐴 𝒸
forall a. Null a => a
null (ULCExp_R 𝒸 -> ULCExp 𝒸)
-> (UVar () (ULCExp 𝒸) -> ULCExp_R 𝒸)
-> UVar () (ULCExp 𝒸)
-> ULCExp 𝒸
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ UVar () (ULCExp 𝒸) -> ULCExp_R 𝒸
forall 𝒸. UVar () (ULCExp 𝒸) -> ULCExp_R 𝒸
Var_ULC (UVar () (ULCExp 𝒸) -> ULCExp 𝒸)
-> (SVar -> UVar () (ULCExp 𝒸)) -> SVar -> ULCExp 𝒸
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ (UVar () (ULCExp 𝒸) ⌲ SVar) -> SVar -> UVar () (ULCExp 𝒸)
forall a b. (a ⌲ b) -> b -> a
construct UVar () (ULCExp 𝒸) ⌲ SVar
forall s e. UVar s e ⌲ SVar
svar_UVarL
dtor ∷ ULCExp 𝒸 → 𝑂 SVar
dtor :: ULCExp 𝒸 -> 𝑂 SVar
dtor ULCExp 𝒸
e = (ULCExp_R 𝒸 ⌲ SVar) -> ULCExp_R 𝒸 -> 𝑂 SVar
forall a b. (a ⌲ b) -> a -> 𝑂 b
view (UVar () (ULCExp 𝒸) ⌲ SVar
forall s e. UVar s e ⌲ SVar
svar_UVarL (UVar () (ULCExp 𝒸) ⌲ SVar)
-> (ULCExp_R 𝒸 ⌲ UVar () (ULCExp 𝒸)) -> ULCExp_R 𝒸 ⌲ SVar
forall b c a. (b ⌲ c) -> (a ⌲ b) -> a ⌲ c
forall {k} (t :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Transitive t =>
t b c -> t a b -> t a c
⊚ ULCExp_R 𝒸 ⌲ UVar () (ULCExp 𝒸)
forall 𝒸. ULCExp_R 𝒸 ⌲ UVar () (ULCExp 𝒸)
var_ULCL) (ULCExp_R 𝒸 -> 𝑂 SVar) -> ULCExp_R 𝒸 -> 𝑂 SVar
forall a b. (a -> b) -> a -> b
$ 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp_R 𝒸
forall e a. 𝐴 e a -> a
aval (𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp_R 𝒸) -> 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp_R 𝒸
forall a b. (a -> b) -> a -> b
$ ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
forall 𝒸. ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
unULCExp ULCExp 𝒸
e
in (SVar -> ULCExp 𝒸) -> (ULCExp 𝒸 -> 𝑂 SVar) -> ULCExp 𝒸 ⌲ SVar
forall b a. (b -> a) -> (a -> 𝑂 b) -> a ⌲ b
prism SVar -> ULCExp 𝒸
ctor ULCExp 𝒸 -> 𝑂 SVar
dtor
instance (Null 𝒸,Show 𝒸) ⇒ Substy () (ULCExp 𝒸) (ULCExp 𝒸) where
substy :: ULCExp 𝒸 -> SubstyM () (ULCExp 𝒸) (ULCExp 𝒸)
substy = (ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸))
-> (𝐴 𝒸 (ULCExp_R 𝒸) -> SubstyM () (ULCExp 𝒸) (ULCExp 𝒸))
-> ULCExp 𝒸
-> SubstyM () (ULCExp 𝒸) (ULCExp 𝒸)
forall a b c. (a -> b) -> (b -> c) -> a -> c
pipe ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
forall 𝒸. ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
unULCExp ((𝐴 𝒸 (ULCExp_R 𝒸) -> SubstyM () (ULCExp 𝒸) (ULCExp 𝒸))
-> ULCExp 𝒸 -> SubstyM () (ULCExp 𝒸) (ULCExp 𝒸))
-> (𝐴 𝒸 (ULCExp_R 𝒸) -> SubstyM () (ULCExp 𝒸) (ULCExp 𝒸))
-> ULCExp 𝒸
-> SubstyM () (ULCExp 𝒸) (ULCExp 𝒸)
forall a b. (a -> b) -> a -> b
$ \ (𝐴 𝒸
𝒸 ULCExp_R 𝒸
e₀) → 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸
forall 𝒸. 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸
ULCExp (𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸)
-> SubstyM () (ULCExp 𝒸) (𝐴 𝒸 (ULCExp_R 𝒸))
-> SubstyM () (ULCExp 𝒸) (ULCExp 𝒸)
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ case ULCExp_R 𝒸
e₀ of
Var_ULC UVar () (ULCExp 𝒸)
x → ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
forall 𝒸. ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
unULCExp (ULCExp 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸))
-> SubstyM () (ULCExp 𝒸) (ULCExp 𝒸)
-> SubstyM () (ULCExp 𝒸) (𝐴 𝒸 (ULCExp_R 𝒸))
forall (t :: * -> *) a b. Functor t => (a -> b) -> t a -> t b
^$ (UVar () (ULCExp 𝒸) -> ULCExp 𝒸)
-> () -> UVar () (ULCExp 𝒸) -> SubstyM () (ULCExp 𝒸) (ULCExp 𝒸)
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 (𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸
forall 𝒸. 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸
ULCExp (𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸)
-> (ULCExp_R 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)) -> ULCExp_R 𝒸 -> ULCExp 𝒸
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ 𝒸 -> ULCExp_R 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
forall e a. e -> a -> 𝐴 e a
𝐴 𝒸
𝒸 (ULCExp_R 𝒸 -> ULCExp 𝒸)
-> (UVar () (ULCExp 𝒸) -> ULCExp_R 𝒸)
-> UVar () (ULCExp 𝒸)
-> ULCExp 𝒸
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ UVar () (ULCExp 𝒸) -> ULCExp_R 𝒸
forall 𝒸. UVar () (ULCExp 𝒸) -> ULCExp_R 𝒸
Var_ULC) () UVar () (ULCExp 𝒸)
x
Lam_ULC 𝑂 Name
xO ULCExp 𝒸
e → SubstyM () (ULCExp 𝒸) (𝐴 𝒸 (ULCExp_R 𝒸))
-> SubstyM () (ULCExp 𝒸) (𝐴 𝒸 (ULCExp_R 𝒸))
forall (m :: * -> *) a. (Monad m, MonadUCont m) => m a -> m a
ureset (SubstyM () (ULCExp 𝒸) (𝐴 𝒸 (ULCExp_R 𝒸))
-> SubstyM () (ULCExp 𝒸) (𝐴 𝒸 (ULCExp_R 𝒸)))
-> SubstyM () (ULCExp 𝒸) (𝐴 𝒸 (ULCExp_R 𝒸))
-> SubstyM () (ULCExp 𝒸) (𝐴 𝒸 (ULCExp_R 𝒸))
forall a b. (a -> b) -> a -> b
$ do
case 𝑂 Name
xO of
𝑂 Name
None → () -> SubstyM () (ULCExp 𝒸) ()
forall s e. (Ord s, Ord e) => s -> SubstyM s e ()
substyDBdr ()
Some Name
x → () -> (SVar -> ULCExp 𝒸) -> Name -> SubstyM () (ULCExp 𝒸) ()
forall s e.
(Ord s, Ord e, Substy s e e) =>
s -> (SVar -> e) -> Name -> SubstyM s e ()
substyBdr () (𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸
forall 𝒸. 𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸
ULCExp (𝐴 𝒸 (ULCExp_R 𝒸) -> ULCExp 𝒸)
-> (ULCExp_R 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)) -> ULCExp_R 𝒸 -> ULCExp 𝒸
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ 𝒸 -> ULCExp_R 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
forall e a. e -> a -> 𝐴 e a
𝐴 𝒸
𝒸 (ULCExp_R 𝒸 -> ULCExp 𝒸)
-> (UVar () (ULCExp 𝒸) -> ULCExp_R 𝒸)
-> UVar () (ULCExp 𝒸)
-> ULCExp 𝒸
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ UVar () (ULCExp 𝒸) -> ULCExp_R 𝒸
forall 𝒸. UVar () (ULCExp 𝒸) -> ULCExp_R 𝒸
Var_ULC (UVar () (ULCExp 𝒸) -> ULCExp 𝒸)
-> (SVar -> UVar () (ULCExp 𝒸)) -> SVar -> ULCExp 𝒸
forall b c a. (b -> c) -> (a -> b) -> a -> c
∘ SVar -> UVar () (ULCExp 𝒸)
forall s e. SVar -> UVar s e
uvar_SVar) Name
x
ULCExp 𝒸
e' ← ULCExp 𝒸 -> SubstyM () (ULCExp 𝒸) (ULCExp 𝒸)
forall s e a. Substy s e a => a -> SubstyM s e a
substy ULCExp 𝒸
e
𝐴 𝒸 (ULCExp_R 𝒸) -> SubstyM () (ULCExp 𝒸) (𝐴 𝒸 (ULCExp_R 𝒸))
forall a. a -> SubstyM () (ULCExp 𝒸) a
forall (m :: * -> *) a. Return m => a -> m a
return (𝐴 𝒸 (ULCExp_R 𝒸) -> SubstyM () (ULCExp 𝒸) (𝐴 𝒸 (ULCExp_R 𝒸)))
-> 𝐴 𝒸 (ULCExp_R 𝒸) -> SubstyM () (ULCExp 𝒸) (𝐴 𝒸 (ULCExp_R 𝒸))
forall a b. (a -> b) -> a -> b
$ 𝒸 -> ULCExp_R 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
forall e a. e -> a -> 𝐴 e a
𝐴 𝒸
𝒸 (ULCExp_R 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)) -> ULCExp_R 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
forall a b. (a -> b) -> a -> b
$ 𝑂 Name -> ULCExp 𝒸 -> ULCExp_R 𝒸
forall 𝒸. 𝑂 Name -> ULCExp 𝒸 -> ULCExp_R 𝒸
Lam_ULC 𝑂 Name
xO ULCExp 𝒸
e'
App_ULC ULCExp 𝒸
e₁ ULCExp 𝒸
e₂ → do
ULCExp 𝒸
e₁' ← ULCExp 𝒸 -> SubstyM () (ULCExp 𝒸) (ULCExp 𝒸)
forall s e a. Substy s e a => a -> SubstyM s e a
substy ULCExp 𝒸
e₁
ULCExp 𝒸
e₂' ← ULCExp 𝒸 -> SubstyM () (ULCExp 𝒸) (ULCExp 𝒸)
forall s e a. Substy s e a => a -> SubstyM s e a
substy ULCExp 𝒸
e₂
𝐴 𝒸 (ULCExp_R 𝒸) -> SubstyM () (ULCExp 𝒸) (𝐴 𝒸 (ULCExp_R 𝒸))
forall a. a -> SubstyM () (ULCExp 𝒸) a
forall (m :: * -> *) a. Return m => a -> m a
return (𝐴 𝒸 (ULCExp_R 𝒸) -> SubstyM () (ULCExp 𝒸) (𝐴 𝒸 (ULCExp_R 𝒸)))
-> 𝐴 𝒸 (ULCExp_R 𝒸) -> SubstyM () (ULCExp 𝒸) (𝐴 𝒸 (ULCExp_R 𝒸))
forall a b. (a -> b) -> a -> b
$ 𝒸 -> ULCExp_R 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
forall e a. e -> a -> 𝐴 e a
𝐴 𝒸
𝒸 (ULCExp_R 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)) -> ULCExp_R 𝒸 -> 𝐴 𝒸 (ULCExp_R 𝒸)
forall a b. (a -> b) -> a -> b
$ ULCExp 𝒸 -> ULCExp 𝒸 -> ULCExp_R 𝒸
forall 𝒸. ULCExp 𝒸 -> ULCExp 𝒸 -> ULCExp_R 𝒸
App_ULC ULCExp 𝒸
e₁' ULCExp 𝒸
e₂'