TMP
This commit is contained in:
parent
67de82edec
commit
5c643a3b63
58
tools/lsp/squirrel/src/AST/ScopeHelpers.hs
Normal file
58
tools/lsp/squirrel/src/AST/ScopeHelpers.hs
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
|
||||||
|
module AST.ScopeHelpers where
|
||||||
|
|
||||||
|
import Control.Monad.State
|
||||||
|
|
||||||
|
data Define n e ty a = Define
|
||||||
|
{ recursive :: Bool
|
||||||
|
, name :: n a
|
||||||
|
, body :: Maybe (e a)
|
||||||
|
, ty :: Maybe (ty a)
|
||||||
|
}
|
||||||
|
deriving stock (Functor, Foldable, Traversable)
|
||||||
|
|
||||||
|
data Block f a = Block
|
||||||
|
{ body :: f a
|
||||||
|
}
|
||||||
|
deriving stock (Functor, Foldable, Traversable)
|
||||||
|
|
||||||
|
class UpdatableScopes n e ty f where
|
||||||
|
updateScopes :: (a -> ScopeM n e ty (f b)) -> f a -> ScopeM n e ty (f b)
|
||||||
|
|
||||||
|
type ScopeM n e ty = State [Env n e ty]
|
||||||
|
|
||||||
|
newtype Env n e ty = Env
|
||||||
|
{ _eDecls :: [ScopedDecl n e ty]
|
||||||
|
}
|
||||||
|
deriving newtype (Semigroup, Monoid)
|
||||||
|
|
||||||
|
data ScopedDecl n e ty = ScopedDecl
|
||||||
|
{ _sdName :: n ()
|
||||||
|
, _sdBody :: Maybe (e ())
|
||||||
|
, _sdType :: Maybe (ty ())
|
||||||
|
}
|
||||||
|
|
||||||
|
data Kind = Star
|
||||||
|
|
||||||
|
define :: (Functor n, Functor b, Functor ty) => Define n b ty a -> ScopeM n b ty ()
|
||||||
|
define (Define _ n e ty) = do
|
||||||
|
modify \(Env top : rest) ->
|
||||||
|
Env (sd : top) : rest
|
||||||
|
where
|
||||||
|
sd = ScopedDecl
|
||||||
|
(void n)
|
||||||
|
(void <$> e)
|
||||||
|
(void <$> ty)
|
||||||
|
|
||||||
|
instance
|
||||||
|
( UpdatableScopes n e ty n
|
||||||
|
, UpdatableScopes n e ty e
|
||||||
|
, UpdatableScopes n e ty ty
|
||||||
|
)
|
||||||
|
=>
|
||||||
|
UpdatableScopes n e ty (Define n e ty)
|
||||||
|
where
|
||||||
|
updateScopes action def@(Define recur name body ty) = do
|
||||||
|
define def
|
||||||
|
name' <- updateScopes action name
|
||||||
|
_
|
Loading…
Reference in New Issue
Block a user