module A.I ( RM, UM, ISt (..)
           , ib, 
           ) where

import           A
import           C
import           Control.Monad.Trans.State.Strict (State, gets, modify, runState, state)
import           Data.Bifunctor                   (second)
import           Data.Foldable                    (traverse_)
import qualified Data.IntMap                      as IM
import           Nm
import           R
import           Ty
import           U

data ISt a = ISt { forall a. ISt a -> Renames
renames :: !Renames, forall a. ISt a -> IntMap (E a)
binds :: IM.IntMap (E a) }

instance HasRenames (ISt a) where rename :: Lens' (ISt a) Renames
rename Renames -> f Renames
f ISt a
s = (Renames -> ISt a) -> f Renames -> f (ISt a)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Renames
x -> ISt a
s { renames = x }) (Renames -> f Renames
f (ISt a -> Renames
forall a. ISt a -> Renames
renames ISt a
s))

type RM a = State (ISt a); type UM = State Int

bind :: Nm a -> E a -> RM a ()
bind :: forall a. Nm a -> E a -> RM a ()
bind (Nm Text
_ (U Int
u) a
_) E a
e = (ISt a -> ISt a) -> StateT (ISt a) Identity ()
forall (m :: * -> *) s. Monad m => (s -> s) -> StateT s m ()
modify (\(ISt Renames
r IntMap (E a)
bs) -> Renames -> IntMap (E a) -> ISt a
forall a. Renames -> IntMap (E a) -> ISt a
ISt Renames
r (Int -> E a -> IntMap (E a) -> IntMap (E a)
forall a. Int -> a -> IntMap a -> IntMap a
IM.insert Int
u E a
e IntMap (E a)
bs))

runI :: Int -> State (ISt a) a -> (a, Int)
runI Int
i = (ISt a -> Int) -> (a, ISt a) -> (a, Int)
forall b c a. (b -> c) -> (a, b) -> (a, c)
forall (p :: * -> * -> *) b c a.
Bifunctor p =>
(b -> c) -> p a b -> p a c
second (Renames -> Int
max_(Renames -> Int) -> (ISt a -> Renames) -> ISt a -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
.ISt a -> Renames
forall a. ISt a -> Renames
renames) ((a, ISt a) -> (a, Int))
-> (State (ISt a) a -> (a, ISt a)) -> State (ISt a) a -> (a, Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (State (ISt a) a -> ISt a -> (a, ISt a))
-> ISt a -> State (ISt a) a -> (a, ISt a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip State (ISt a) a -> ISt a -> (a, ISt a)
forall s a. State s a -> s -> (a, s)
runState (Renames -> IntMap (E a) -> ISt a
forall a. Renames -> IntMap (E a) -> ISt a
ISt (Int -> IntMap Int -> Renames
Rs Int
i IntMap Int
forall a. Monoid a => a
mempty) IntMap (E a)
forall a. Monoid a => a
mempty)

ib :: Int -> Program T -> (E T, Int)
ib :: Int -> Program T -> (E T, Int)
ib Int
i = (E T -> Int -> (E T, Int)) -> (E T, Int) -> (E T, Int)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((Int -> E T -> (E T, Int)) -> E T -> Int -> (E T, Int)
forall a b c. (a -> b -> c) -> b -> a -> c
flip Int -> E T -> (E T, Int)
forall {a}. Int -> E a -> (E a, Int)
β)((E T, Int) -> (E T, Int))
-> (Program T -> (E T, Int)) -> Program T -> (E T, Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Int -> State (ISt T) (E T) -> (E T, Int)
forall {a} {a}. Int -> State (ISt a) a -> (a, Int)
runI Int
i(State (ISt T) (E T) -> (E T, Int))
-> (Program T -> State (ISt T) (E T)) -> Program T -> (E T, Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Program T -> State (ISt T) (E T)
iP where iP :: Program T -> State (ISt T) (E T)
iP (Program [D T]
ds E T
e) = (D T -> StateT (ISt T) Identity ())
-> [D T] -> StateT (ISt T) Identity ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
(a -> f b) -> t a -> f ()
traverse_ D T -> StateT (ISt T) Identity ()
iD [D T]
ds StateT (ISt T) Identity ()
-> State (ISt T) (E T) -> State (ISt T) (E T)
forall a b.
StateT (ISt T) Identity a
-> StateT (ISt T) Identity b -> StateT (ISt T) Identity b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> E T -> State (ISt T) (E T)
iE E T
e

β :: Int -> E a -> (E a, Int)
β Int
i = Int -> State (ISt a) (E a) -> (E a, Int)
forall {a} {a}. Int -> State (ISt a) a -> (a, Int)
runI Int
i(State (ISt a) (E a) -> (E a, Int))
-> (E a -> State (ISt a) (E a)) -> E a -> (E a, Int)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.E a -> State (ISt a) (E a)
forall a. E a -> RM a (E a)
bM(E a -> State (ISt a) (E a))
-> (E a -> E a) -> E a -> State (ISt a) (E a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Int
i Int -> E a -> E a
forall a b. a -> b -> b
`seq`)

 :: E a -> UM (E a)
lβ :: forall a. E a -> UM (E a)
 E a
e = (Int -> (E a, Int)) -> StateT Int Identity (E a)
forall (m :: * -> *) s a. Monad m => (s -> (a, s)) -> StateT s m a
state (Int -> E a -> (E a, Int)
forall {a}. Int -> E a -> (E a, Int)
`β` E a
e)

iD :: D T -> RM T ()
iD :: D T -> StateT (ISt T) Identity ()
iD (FunDecl Nm T
n [] E T
e) = do {eI <- E T -> State (ISt T) (E T)
iE E T
e; bind n eI}
iD SetFS{} = () -> StateT (ISt T) Identity ()
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (); iD SetRS{} = () -> StateT (ISt T) Identity ()
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (); iD D T
SetAsv = () -> StateT (ISt T) Identity ()
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (); iD D T
SetUsv = () -> StateT (ISt T) Identity ()
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (); iD D T
SetCsv = () -> StateT (ISt T) Identity ()
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
iD SetORS{} = () -> StateT (ISt T) Identity ()
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (); iD SetOFS{} = () -> StateT (ISt T) Identity ()
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (); iD FlushDecl{} = () -> StateT (ISt T) Identity ()
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
iD FunDecl{} = StateT (ISt T) Identity ()
forall {a}. a
desugar

desugar :: a
desugar = [Char] -> a
forall a. HasCallStack => [Char] -> a
error [Char]
"Internal error. Should have been de-sugared in an earlier stage!"

bM :: E a -> RM a (E a)
bM :: forall a. E a -> RM a (E a)
bM (EApp a
_ (EApp a
_ (Lam a
_ Nm a
n (Lam a
_ Nm a
n' E a
e')) E a
e'') E a
e) = do
    eI <- E a -> RM a (E a)
forall a. E a -> RM a (E a)
bM E a
e; bind n' eI
    eI'' <- bM e''; bind n eI''
    bM e'
bM (EApp a
_ (Lam a
_ Nm a
n E a
e') E a
e) = do
    eI <- E a -> RM a (E a)
forall a. E a -> RM a (E a)
bM E a
e; bind n eI
    bM e'
bM (EApp a
l E a
e0 E a
e1) = do
    e0' <- E a -> RM a (E a)
forall a. E a -> RM a (E a)
bM E a
e0; e1' <- bM e1
    case e0' of
        Lam{} -> E a -> RM a (E a)
forall a. E a -> RM a (E a)
bM (a -> E a -> E a -> E a
forall a. a -> E a -> E a -> E a
EApp a
l E a
e0' E a
e1')
        E a
_     -> E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> E a -> E a -> E a
forall a. a -> E a -> E a -> E a
EApp a
l E a
e0' E a
e1')
bM e :: E a
e@(Var a
_ (Nm Text
_ (U Int
i) a
_)) = do
    st <- (ISt a -> IntMap (E a)) -> StateT (ISt a) Identity (IntMap (E a))
forall (m :: * -> *) s a. Monad m => (s -> a) -> StateT s m a
gets ISt a -> IntMap (E a)
forall a. ISt a -> IntMap (E a)
binds
    case IM.lookup i st of
        Just E a
e' -> E a -> RM a (E a)
forall s (m :: * -> *) a.
(HasRenames s, MonadState s m) =>
E a -> m (E a)
rE E a
e'
        Maybe (E a)
Nothing -> E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e
bM (Let a
l (Nm a
n, E a
e') E a
e) = do
    e'B <- E a -> RM a (E a)
forall a. E a -> RM a (E a)
bM E a
e'; eB <- bM e
    pure $ Let l (n, e'B) eB
bM (Tup a
l [E a]
es) = a -> [E a] -> E a
forall a. a -> [E a] -> E a
Tup a
l ([E a] -> E a) -> StateT (ISt a) Identity [E a] -> RM a (E a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (E a -> RM a (E a)) -> [E a] -> StateT (ISt a) Identity [E a]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse E a -> RM a (E a)
forall a. E a -> RM a (E a)
bM [E a]
es; bM (Arr a
l Vector (E a)
es) = a -> Vector (E a) -> E a
forall a. a -> Vector (E a) -> E a
Arr a
l (Vector (E a) -> E a)
-> StateT (ISt a) Identity (Vector (E a)) -> RM a (E a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (E a -> RM a (E a))
-> Vector (E a) -> StateT (ISt a) Identity (Vector (E a))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Vector a -> f (Vector b)
traverse E a -> RM a (E a)
forall a. E a -> RM a (E a)
bM Vector (E a)
es
bM (Rec a
l [(Nm a, E a)]
es) = a -> [(Nm a, E a)] -> E a
forall a. a -> [(Nm a, E a)] -> E a
Rec a
l ([(Nm a, E a)] -> E a)
-> StateT (ISt a) Identity [(Nm a, E a)] -> RM a (E a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((Nm a, E a) -> StateT (ISt a) Identity (Nm a, E a))
-> [(Nm a, E a)] -> StateT (ISt a) Identity [(Nm a, E a)]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse ((E a -> RM a (E a))
-> (Nm a, E a) -> StateT (ISt a) Identity (Nm a, E a)
forall (m :: * -> *) b b' a.
Functor m =>
(b -> m b') -> (a, b) -> m (a, b')
secondM E a -> RM a (E a)
forall a. E a -> RM a (E a)
bM) [(Nm a, E a)]
es
bM (Anchor a
l [E a]
es) = a -> [E a] -> E a
forall a. a -> [E a] -> E a
Anchor a
l ([E a] -> E a) -> StateT (ISt a) Identity [E a] -> RM a (E a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (E a -> RM a (E a)) -> [E a] -> StateT (ISt a) Identity [E a]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse E a -> RM a (E a)
forall a. E a -> RM a (E a)
bM [E a]
es; bM (OptionVal a
l Maybe (E a)
es) = a -> Maybe (E a) -> E a
forall a. a -> Maybe (E a) -> E a
OptionVal a
l (Maybe (E a) -> E a)
-> StateT (ISt a) Identity (Maybe (E a)) -> RM a (E a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (E a -> RM a (E a))
-> Maybe (E a) -> StateT (ISt a) Identity (Maybe (E a))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse E a -> RM a (E a)
forall a. E a -> RM a (E a)
bM Maybe (E a)
es
bM (Lam a
l Nm a
n E a
e) = a -> Nm a -> E a -> E a
forall a. a -> Nm a -> E a -> E a
Lam a
l Nm a
n (E a -> E a) -> RM a (E a) -> RM a (E a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> E a -> RM a (E a)
forall a. E a -> RM a (E a)
bM E a
e
bM (Implicit a
l E a
e) = a -> E a -> E a
forall a. a -> E a -> E a
Implicit a
l (E a -> E a) -> RM a (E a) -> RM a (E a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> E a -> RM a (E a)
forall a. E a -> RM a (E a)
bM E a
e
bM (Guarded a
l E a
e0 E a
e1) = a -> E a -> E a -> E a
forall a. a -> E a -> E a -> E a
Guarded a
l (E a -> E a -> E a)
-> RM a (E a) -> StateT (ISt a) Identity (E a -> E a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> E a -> RM a (E a)
forall a. E a -> RM a (E a)
bM E a
e0 StateT (ISt a) Identity (E a -> E a) -> RM a (E a) -> RM a (E a)
forall a b.
StateT (ISt a) Identity (a -> b)
-> StateT (ISt a) Identity a -> StateT (ISt a) Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> E a -> RM a (E a)
forall a. E a -> RM a (E a)
bM E a
e1
bM (Cond a
l E a
p E a
e0 E a
e1) = a -> E a -> E a -> E a -> E a
forall a. a -> E a -> E a -> E a -> E a
Cond a
l (E a -> E a -> E a -> E a)
-> RM a (E a) -> StateT (ISt a) Identity (E a -> E a -> E a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> E a -> RM a (E a)
forall a. E a -> RM a (E a)
bM E a
p StateT (ISt a) Identity (E a -> E a -> E a)
-> RM a (E a) -> StateT (ISt a) Identity (E a -> E a)
forall a b.
StateT (ISt a) Identity (a -> b)
-> StateT (ISt a) Identity a -> StateT (ISt a) Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> E a -> RM a (E a)
forall a. E a -> RM a (E a)
bM E a
e0 StateT (ISt a) Identity (E a -> E a) -> RM a (E a) -> RM a (E a)
forall a b.
StateT (ISt a) Identity (a -> b)
-> StateT (ISt a) Identity a -> StateT (ISt a) Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> E a -> RM a (E a)
forall a. E a -> RM a (E a)
bM E a
e1
bM e :: E a
e@Column{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e; bM e :: E a
e@IParseCol{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e; bM e :: E a
e@FParseCol{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e; bM e :: E a
e@AllField{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e
bM e :: E a
e@LastField{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e; bM e :: E a
e@Field{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e; bM e :: E a
e@FieldList{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e; bM e :: E a
e@ParseCol{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e
bM e :: E a
e@AllColumn{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e; bM e :: E a
e@FParseAllCol{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e; bM e :: E a
e@IParseAllCol{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e; bM e :: E a
e@ParseAllCol{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e
bM e :: E a
e@RC{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e; bM e :: E a
e@Lit{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e; bM e :: E a
e@RegexLit{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e
bM e :: E a
e@BB{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e; bM e :: E a
e@NB{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e; bM e :: E a
e@UB{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e; bM e :: E a
e@TB{} = E a -> RM a (E a)
forall a. a -> StateT (ISt a) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E a
e
bM ResVar{} = RM a (E a)
forall {a}. a
desugar; bM Dfn{} = RM a (E a)
forall {a}. a
desugar; bM Paren{} = RM a (E a)
forall {a}. a
desugar
bM RwT{} = RM a (E a)
forall {a}. a
desugar; bM RwB{} = RM a (E a)
forall {a}. a
desugar; bM F{} = [Char] -> RM a (E a)
forall a. HasCallStack => [Char] -> a
error [Char]
"impossible."

iE :: E T -> RM T (E T)
iE :: E T -> State (ISt T) (E T)
iE e :: E T
e@NB{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e; iE e :: E T
e@UB{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e; iE e :: E T
e@BB{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e; iE e :: E T
e@TB{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e
iE e :: E T
e@Column{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e; iE e :: E T
e@ParseCol{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e; iE e :: E T
e@IParseCol{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e; iE e :: E T
e@FParseCol{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e
iE e :: E T
e@Field{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e; iE e :: E T
e@LastField{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e; iE e :: E T
e@AllField{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e; iE e :: E T
e@FieldList{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e
iE e :: E T
e@AllColumn{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e; iE e :: E T
e@FParseAllCol{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e; iE e :: E T
e@IParseAllCol{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e; iE e :: E T
e@ParseAllCol{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e
iE e :: E T
e@Lit{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e
iE e :: E T
e@RegexLit{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e; iE e :: E T
e@RC{} = E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e
iE (EApp T
t E T
e E T
e') = T -> E T -> E T -> E T
forall a. a -> E a -> E a -> E a
EApp T
t (E T -> E T -> E T)
-> State (ISt T) (E T) -> StateT (ISt T) Identity (E T -> E T)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> E T -> State (ISt T) (E T)
iE E T
e StateT (ISt T) Identity (E T -> E T)
-> State (ISt T) (E T) -> State (ISt T) (E T)
forall a b.
StateT (ISt T) Identity (a -> b)
-> StateT (ISt T) Identity a -> StateT (ISt T) Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> E T -> State (ISt T) (E T)
iE E T
e'
iE (Guarded T
t E T
p E T
e) = T -> E T -> E T -> E T
forall a. a -> E a -> E a -> E a
Guarded T
t (E T -> E T -> E T)
-> State (ISt T) (E T) -> StateT (ISt T) Identity (E T -> E T)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> E T -> State (ISt T) (E T)
iE E T
p StateT (ISt T) Identity (E T -> E T)
-> State (ISt T) (E T) -> State (ISt T) (E T)
forall a b.
StateT (ISt T) Identity (a -> b)
-> StateT (ISt T) Identity a -> StateT (ISt T) Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> E T -> State (ISt T) (E T)
iE E T
e
iE (Implicit T
t E T
e) = T -> E T -> E T
forall a. a -> E a -> E a
Implicit T
t (E T -> E T) -> State (ISt T) (E T) -> State (ISt T) (E T)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> E T -> State (ISt T) (E T)
iE E T
e
iE (Lam T
t Nm T
n E T
e) = T -> Nm T -> E T -> E T
forall a. a -> Nm a -> E a -> E a
Lam T
t Nm T
n (E T -> E T) -> State (ISt T) (E T) -> State (ISt T) (E T)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> E T -> State (ISt T) (E T)
iE E T
e
iE (Tup T
t [E T]
es) = T -> [E T] -> E T
forall a. a -> [E a] -> E a
Tup T
t ([E T] -> E T)
-> StateT (ISt T) Identity [E T] -> State (ISt T) (E T)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (E T -> State (ISt T) (E T))
-> [E T] -> StateT (ISt T) Identity [E T]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse E T -> State (ISt T) (E T)
iE [E T]
es
iE (Rec T
t [(Nm T, E T)]
es) = T -> [(Nm T, E T)] -> E T
forall a. a -> [(Nm a, E a)] -> E a
Rec T
t ([(Nm T, E T)] -> E T)
-> StateT (ISt T) Identity [(Nm T, E T)] -> State (ISt T) (E T)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((Nm T, E T) -> StateT (ISt T) Identity (Nm T, E T))
-> [(Nm T, E T)] -> StateT (ISt T) Identity [(Nm T, E T)]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse ((E T -> State (ISt T) (E T))
-> (Nm T, E T) -> StateT (ISt T) Identity (Nm T, E T)
forall (m :: * -> *) b b' a.
Functor m =>
(b -> m b') -> (a, b) -> m (a, b')
secondM E T -> State (ISt T) (E T)
iE) [(Nm T, E T)]
es
iE (Arr T
t Vector (E T)
es) = T -> Vector (E T) -> E T
forall a. a -> Vector (E a) -> E a
Arr T
t (Vector (E T) -> E T)
-> StateT (ISt T) Identity (Vector (E T)) -> State (ISt T) (E T)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (E T -> State (ISt T) (E T))
-> Vector (E T) -> StateT (ISt T) Identity (Vector (E T))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Vector a -> f (Vector b)
traverse E T -> State (ISt T) (E T)
iE Vector (E T)
es
iE (Anchor T
t [E T]
es) = T -> [E T] -> E T
forall a. a -> [E a] -> E a
Anchor T
t ([E T] -> E T)
-> StateT (ISt T) Identity [E T] -> State (ISt T) (E T)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (E T -> State (ISt T) (E T))
-> [E T] -> StateT (ISt T) Identity [E T]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse E T -> State (ISt T) (E T)
iE [E T]
es
iE (OptionVal T
t Maybe (E T)
es) = T -> Maybe (E T) -> E T
forall a. a -> Maybe (E a) -> E a
OptionVal T
t (Maybe (E T) -> E T)
-> StateT (ISt T) Identity (Maybe (E T)) -> State (ISt T) (E T)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (E T -> State (ISt T) (E T))
-> Maybe (E T) -> StateT (ISt T) Identity (Maybe (E T))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Maybe a -> f (Maybe b)
traverse E T -> State (ISt T) (E T)
iE Maybe (E T)
es
iE (Cond T
t E T
p E T
e E T
e') = T -> E T -> E T -> E T -> E T
forall a. a -> E a -> E a -> E a -> E a
Cond T
t (E T -> E T -> E T -> E T)
-> State (ISt T) (E T)
-> StateT (ISt T) Identity (E T -> E T -> E T)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> E T -> State (ISt T) (E T)
iE E T
p StateT (ISt T) Identity (E T -> E T -> E T)
-> State (ISt T) (E T) -> StateT (ISt T) Identity (E T -> E T)
forall a b.
StateT (ISt T) Identity (a -> b)
-> StateT (ISt T) Identity a -> StateT (ISt T) Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> E T -> State (ISt T) (E T)
iE E T
e StateT (ISt T) Identity (E T -> E T)
-> State (ISt T) (E T) -> State (ISt T) (E T)
forall a b.
StateT (ISt T) Identity (a -> b)
-> StateT (ISt T) Identity a -> StateT (ISt T) Identity b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> E T -> State (ISt T) (E T)
iE E T
e'
iE (Let T
_ (Nm T
n, E T
e') E T
e) = do
    eI <- E T -> State (ISt T) (E T)
iE E T
e'; bind n eI; iE e
iE e :: E T
e@(Var T
t (Nm Text
_ (U Int
i) T
_)) = do
    st <- (ISt T -> IntMap (E T)) -> StateT (ISt T) Identity (IntMap (E T))
forall (m :: * -> *) s a. Monad m => (s -> a) -> StateT s m a
gets ISt T -> IntMap (E T)
forall a. ISt a -> IntMap (E a)
binds
    case IM.lookup i st of
        Just E T
e' -> do {er <- E T -> State (ISt T) (E T)
forall s (m :: * -> *) a.
(HasRenames s, MonadState s m) =>
E a -> m (E a)
rE E T
e'; pure $ fmap (aT (match (eLoc er) t)) er}
        Maybe (E T)
Nothing -> E T -> State (ISt T) (E T)
forall a. a -> StateT (ISt T) Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure E T
e
iE Dfn{} = State (ISt T) (E T)
forall {a}. a
desugar; iE Paren{} = State (ISt T) (E T)
forall {a}. a
desugar; iE ResVar{} = State (ISt T) (E T)
forall {a}. a
desugar
iE RwB{} = State (ISt T) (E T)
forall {a}. a
desugar; iE RwT{} = State (ISt T) (E T)
forall {a}. a
desugar; iE F{} = [Char] -> State (ISt T) (E T)
forall a. HasCallStack => [Char] -> a
error [Char]
"impossible."