blanks-0.5.0: Fill-in-the-blanks - A library factoring out substitution from ASTs
Safe HaskellNone
LanguageHaskell2010

Blanks.Scope

Synopsis

Documentation

newtype Scope n f a Source #

A simple wrapper for your expression functor that knows how to name-bind. Create free variables is pure, bind them with >>=, and list free variables with folds. See LocScope for a version with additional annotations between layers.

Constructors

Scope 

Fields

Instances

Instances details
Functor f => Monad (Scope n f) Source # 
Instance details

Defined in Blanks.Scope

Methods

(>>=) :: Scope n f a -> (a -> Scope n f b) -> Scope n f b #

(>>) :: Scope n f a -> Scope n f b -> Scope n f b #

return :: a -> Scope n f a #

Functor f => Functor (Scope n f) Source # 
Instance details

Defined in Blanks.Scope

Methods

fmap :: (a -> b) -> Scope n f a -> Scope n f b #

(<$) :: a -> Scope n f b -> Scope n f a #

Functor f => Applicative (Scope n f) Source # 
Instance details

Defined in Blanks.Scope

Methods

pure :: a -> Scope n f a #

(<*>) :: Scope n f (a -> b) -> Scope n f a -> Scope n f b #

liftA2 :: (a -> b -> c) -> Scope n f a -> Scope n f b -> Scope n f c #

(*>) :: Scope n f a -> Scope n f b -> Scope n f b #

(<*) :: Scope n f a -> Scope n f b -> Scope n f a #

Foldable f => Foldable (Scope n f) Source # 
Instance details

Defined in Blanks.Scope

Methods

fold :: Monoid m => Scope n f m -> m #

foldMap :: Monoid m => (a -> m) -> Scope n f a -> m #

foldMap' :: Monoid m => (a -> m) -> Scope n f a -> m #

foldr :: (a -> b -> b) -> b -> Scope n f a -> b #

foldr' :: (a -> b -> b) -> b -> Scope n f a -> b #

foldl :: (b -> a -> b) -> b -> Scope n f a -> b #

foldl' :: (b -> a -> b) -> b -> Scope n f a -> b #

foldr1 :: (a -> a -> a) -> Scope n f a -> a #

foldl1 :: (a -> a -> a) -> Scope n f a -> a #

toList :: Scope n f a -> [a] #

null :: Scope n f a -> Bool #

length :: Scope n f a -> Int #

elem :: Eq a => a -> Scope n f a -> Bool #

maximum :: Ord a => Scope n f a -> a #

minimum :: Ord a => Scope n f a -> a #

sum :: Num a => Scope n f a -> a #

product :: Num a => Scope n f a -> a #

Traversable f => Traversable (Scope n f) Source # 
Instance details

Defined in Blanks.Scope

Methods

traverse :: Applicative f0 => (a -> f0 b) -> Scope n f a -> f0 (Scope n f b) #

sequenceA :: Applicative f0 => Scope n f (f0 a) -> f0 (Scope n f a) #

mapM :: Monad m => (a -> m b) -> Scope n f a -> m (Scope n f b) #

sequence :: Monad m => Scope n f (m a) -> m (Scope n f a) #

(Eq (f (Scope n f a)), Eq n, Eq a) => Eq (Scope n f a) Source # 
Instance details

Defined in Blanks.Scope

Methods

(==) :: Scope n f a -> Scope n f a -> Bool #

(/=) :: Scope n f a -> Scope n f a -> Bool #

(Show (f (Scope n f a)), Show n, Show a) => Show (Scope n f a) Source # 
Instance details

Defined in Blanks.Scope

Methods

showsPrec :: Int -> Scope n f a -> ShowS #

show :: Scope n f a -> String #

showList :: [Scope n f a] -> ShowS #

(NFData n, NFData a, NFData (f (Scope n f a))) => NFData (Scope n f a) Source # 
Instance details

Defined in Blanks.Scope

Methods

rnf :: Scope n f a -> () #

NatNewtype (ScopeW Identity n f (Scope n f)) (Scope n f) Source # 
Instance details

Defined in Blanks.Scope

pattern ScopeBound :: Int -> Scope n f a Source #

pattern ScopeFree :: a -> Scope n f a Source #

pattern ScopeBinder :: Int -> n -> Scope n f a -> Scope n f a Source #

pattern ScopeEmbed :: f (Scope n f a) -> Scope n f a Source #

scopeWFromInnerBinder :: ScopeWC t u n f g => BinderScope n (g a) -> u (g a) Source #

scopeBind :: Functor f => (a -> Scope n f b) -> Scope n f a -> Scope n f b Source #

Substitution as a kind of monadic bind.

scopeBindOpt :: Functor f => (a -> Maybe (Scope n f a)) -> Scope n f a -> Scope n f a Source #

Optional substitution as another kind of monadic bind.

scopeLift :: Traversable f => f a -> Scope n f a Source #

Lift an expression functor into the scope functor.

scopeInnerBinder :: (Functor f, Eq a) => n -> Seq a -> Scope n f a -> BinderScope n (Scope n f a) Source #

scopeInnerBinder1 :: (Functor f, Eq a) => n -> a -> Scope n f a -> BinderScope n (Scope n f a) Source #

scopeAbstract Source #

Arguments

:: (Functor f, Eq a) 
=> n

Annotation specific to your expression functor. Might contain original variable names and types, or might mark this as a "let" vs a "lambda"

-> Seq a

Free variables to bind, like the names of function parameters

-> Scope n f a

The expression to bind in, like the body of a function

-> Scope n f a 

Binds free variables in an expression and returns a binder.

scopeAbstract1 :: (Functor f, Eq a) => n -> a -> Scope n f a -> Scope n f a Source #

scopeAbstract for a single argument.

scopeUnAbstract Source #

Arguments

:: Functor f 
=> Seq a

The names of the variables you're freeing

-> Scope n f a

The expression to substitute in (typically a binder)

-> Scope n f a 

Un-bind free variables in an expression. Basically the inverse of scopeAbstract. Take care to match the arity of the binder! (scopeApply is safer.)

scopeUnAbstract1 :: Functor f => a -> Scope n f a -> Scope n f a Source #

scopeInstantiate Source #

Arguments

:: Functor f 
=> Seq (Scope n f a)

Expressions to substitute in place of bound vars

-> Scope n f a

The expression to substitute in (typically a binder)

-> Scope n f a 

Instantiate the bound variables in an expression with other expressions. Take care to match the arity of the binder! (scopeApply is safer.)

scopeInstantiate1 :: Functor f => Scope n f a -> Scope n f a -> Scope n f a Source #

scopeInstantiate for a single argument.

scopeApply Source #

Arguments

:: Functor f 
=> Seq (Scope n f a)

Expressions to substitute in place of bound vars

-> Scope n f a

The binder expression to substitute in

-> Either SubError (Scope n f a) 

Instantiates the bound variables in an expression with other expressions. Throws errors on mismatched arity, non binder expression, unbound vars, etc. A version of scopeInstantiate that fails loudly instead of silently!

scopeApply1 :: Functor f => Scope n f a -> Scope n f a -> Either SubError (Scope n f a) Source #

scopeApply for a single argument.