27 lines
843 B
Haskell
27 lines
843 B
Haskell
|
|
module Elaborator where
|
||
|
|
|
||
|
|
import Data.List (elemIndex)
|
||
|
|
import Expr (Expr)
|
||
|
|
import qualified Expr as E
|
||
|
|
import IR (IRExpr)
|
||
|
|
import qualified IR as I
|
||
|
|
|
||
|
|
type Binders = [Text]
|
||
|
|
|
||
|
|
elaborate :: IRExpr -> State Binders Expr
|
||
|
|
elaborate (I.Var n) = do
|
||
|
|
binders <- get
|
||
|
|
pure $ E.Var n . fromIntegral <$> elemIndex n binders ?: E.Free n
|
||
|
|
elaborate (I.Level level) = pure $ E.Level level
|
||
|
|
elaborate (I.App m n) = E.App <$> elaborate m <*> elaborate n
|
||
|
|
elaborate (I.Abs x t b) = do
|
||
|
|
t' <- elaborate t
|
||
|
|
modify (x :)
|
||
|
|
E.Abs x t' <$> elaborate b
|
||
|
|
elaborate (I.Pi x t b) = do
|
||
|
|
t' <- elaborate t
|
||
|
|
modify (x :)
|
||
|
|
E.Pi x t' <$> elaborate b
|
||
|
|
elaborate (I.Let name Nothing val body) = E.Let name Nothing <$> elaborate val <*> elaborate body
|
||
|
|
elaborate (I.Let name (Just t) val body) = E.Let name . Just <$> elaborate t <*> elaborate val <*> elaborate body
|