-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Fill-in-the-blanks - A library factoring out substitution from ASTs -- -- Please see the README on GitHub at -- https://github.com/ejconlon/blanks#readme @package blanks @version 0.4.2 module Blanks.Located -- | Because we defined a unique left adjoint, we have to define the unique -- right. newtype Colocated l a Colocated :: Reader l a -> Colocated l a [unColocated] :: Colocated l a -> Reader l a -- | This is basically the Env comonad, but with the env strict. -- It's also basically the Writer monad in certain contexts. We -- define a new, non-transforming datatype so we can pattern-match. data Located l a Located :: !l -> a -> Located l a [_locatedLoc] :: Located l a -> !l [_locatedVal] :: Located l a -> a askColocated :: Colocated l l colocated :: (l -> a) -> Colocated l a runColocated :: Colocated l a -> l -> a instance Data.Functor.Rep.Representable (Blanks.Located.Colocated l) instance Control.Monad.Reader.Class.MonadReader l (Blanks.Located.Colocated l) instance GHC.Base.Monad (Blanks.Located.Colocated l) instance GHC.Base.Applicative (Blanks.Located.Colocated l) instance GHC.Base.Functor (Blanks.Located.Colocated l) instance (Control.DeepSeq.NFData l, Control.DeepSeq.NFData a) => Control.DeepSeq.NFData (Blanks.Located.Located l a) instance GHC.Generics.Generic (Blanks.Located.Located l a) instance Data.Traversable.Traversable (Blanks.Located.Located l) instance Data.Foldable.Foldable (Blanks.Located.Located l) instance GHC.Base.Functor (Blanks.Located.Located l) instance (GHC.Show.Show l, GHC.Show.Show a) => GHC.Show.Show (Blanks.Located.Located l a) instance (GHC.Classes.Eq l, GHC.Classes.Eq a) => GHC.Classes.Eq (Blanks.Located.Located l a) instance Data.Distributive.Distributive (Blanks.Located.Colocated l) instance Data.Functor.Adjunction.Adjunction (Blanks.Located.Located l) (Blanks.Located.Colocated l) instance GHC.Base.Monoid l => GHC.Base.Applicative (Blanks.Located.Located l) instance GHC.Base.Monoid l => GHC.Base.Monad (Blanks.Located.Located l) instance GHC.Base.Monoid l => Control.Monad.Writer.Class.MonadWriter l (Blanks.Located.Located l) module Blanks.Name -- | Name is compared on value only, allowing you to define and use -- things like NameOnly in your BlankInfo values to make -- alpha-equivalent terms structurally (Eq) equivalent. data Name n a Name :: !n -> !a -> Name n a [_nameKey] :: Name n a -> !n [_nameValue] :: Name n a -> !a type NameOnly n = Name n () pattern NameOnly :: n -> NameOnly n instance (Control.DeepSeq.NFData n, Control.DeepSeq.NFData a) => Control.DeepSeq.NFData (Blanks.Name.Name n a) instance GHC.Generics.Generic (Blanks.Name.Name n a) instance Data.Traversable.Traversable (Blanks.Name.Name n) instance Data.Foldable.Foldable (Blanks.Name.Name n) instance GHC.Base.Functor (Blanks.Name.Name n) instance (GHC.Show.Show n, GHC.Show.Show a) => GHC.Show.Show (Blanks.Name.Name n a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Blanks.Name.Name n a) module Blanks.NatNewtype -- | A "natural isomorphism" between two functors, like exists derivably -- between newtyped functors and their wrapped types. The functional -- dependency requires that g be the newtype and m the -- wrapped type. class (forall a. Coercible (m a) (g a), forall a. Coercible (g a) (m a)) => NatNewtype (m :: Type -> Type) (g :: Type -> Type) | g -> m -- | Coerce from the newtype to the wrapped type. natNewtypeFrom :: NatNewtype m g => g a -> m a -- | Coerce from the wrapped type to the newtype. natNewtypeTo :: NatNewtype m g => m a -> g a module Blanks.Sub -- | Errors that happen in the course of instantiation, thrown by -- blankApply and related functions. data SubError ApplyError :: !Int -> !Int -> SubError UnboundError :: !Int -> SubError NonBinderError :: SubError -- | Some monadic context that lets you throw a SubError. Exists to -- let you rethrow to a more convenient context rather than pattern -- maching. class ThrowSub m throwSub :: ThrowSub m => SubError -> m a rethrowSub :: (Applicative m, ThrowSub m) => Either SubError a -> m a instance GHC.Show.Show Blanks.Sub.SubError instance GHC.Classes.Eq Blanks.Sub.SubError instance Blanks.Sub.ThrowSub (Data.Either.Either Blanks.Sub.SubError) instance Blanks.Sub.ThrowSub GHC.Types.IO instance GHC.Exception.Type.Exception Blanks.Sub.SubError -- | Internals. You will probably never need these. module Blanks.UnderScope data BinderScope n e BinderScope :: !Int -> !n -> e -> BinderScope n e [binderScopeArity] :: BinderScope n e -> !Int [binderScopeInfo] :: BinderScope n e -> !n [binderScopeBody] :: BinderScope n e -> e newtype BoundScope BoundScope :: Int -> BoundScope [unBoundScope] :: BoundScope -> Int newtype EmbedScope f e EmbedScope :: f e -> EmbedScope f e [unEmbedScope] :: EmbedScope f e -> f e newtype FreeScope a FreeScope :: a -> FreeScope a [unFreeScope] :: FreeScope a -> a data UnderScope n f e a UnderBoundScope :: !BoundScope -> UnderScope n f e a UnderFreeScope :: !FreeScope a -> UnderScope n f e a UnderBinderScope :: !BinderScope n e -> UnderScope n f e a UnderEmbedScope :: !EmbedScope f e -> UnderScope n f e a data UnderScopeFold n f e a r UnderScopeFold :: (BoundScope -> r) -> (FreeScope a -> r) -> (BinderScope n e -> r) -> (EmbedScope f e -> r) -> UnderScopeFold n f e a r [usfBound] :: UnderScopeFold n f e a r -> BoundScope -> r [usfFree] :: UnderScopeFold n f e a r -> FreeScope a -> r [usfBinder] :: UnderScopeFold n f e a r -> BinderScope n e -> r [usfEmbed] :: UnderScopeFold n f e a r -> EmbedScope f e -> r pattern UnderScopeBound :: Int -> UnderScope n f e a pattern UnderScopeFree :: a -> UnderScope n f e a pattern UnderScopeBinder :: Int -> n -> e -> UnderScope n f e a pattern UnderScopeEmbed :: f e -> UnderScope n f e a underScopeFold :: UnderScopeFold n f e a r -> UnderScope n f e a -> r underScopeShift :: Functor f => (Int -> Int -> e -> e) -> Int -> Int -> UnderScope n f e a -> UnderScope n f e a instance GHC.Base.Functor (Blanks.UnderScope.UnderScopeFold n f e a) instance (Control.DeepSeq.NFData a, Control.DeepSeq.NFData n, Control.DeepSeq.NFData e, Control.DeepSeq.NFData (f e)) => Control.DeepSeq.NFData (Blanks.UnderScope.UnderScope n f e a) instance GHC.Generics.Generic (Blanks.UnderScope.UnderScope n f e a) instance GHC.Base.Functor (Blanks.UnderScope.UnderScope n f e) instance (GHC.Show.Show a, GHC.Show.Show n, GHC.Show.Show e, GHC.Show.Show (f e)) => GHC.Show.Show (Blanks.UnderScope.UnderScope n f e a) instance (GHC.Classes.Eq a, GHC.Classes.Eq n, GHC.Classes.Eq e, GHC.Classes.Eq (f e)) => GHC.Classes.Eq (Blanks.UnderScope.UnderScope n f e a) instance Control.DeepSeq.NFData (f e) => Control.DeepSeq.NFData (Blanks.UnderScope.EmbedScope f e) instance GHC.Base.Functor f => GHC.Base.Functor (Blanks.UnderScope.EmbedScope f) instance GHC.Show.Show (f e) => GHC.Show.Show (Blanks.UnderScope.EmbedScope f e) instance GHC.Classes.Eq (f e) => GHC.Classes.Eq (Blanks.UnderScope.EmbedScope f e) instance (Control.DeepSeq.NFData n, Control.DeepSeq.NFData e) => Control.DeepSeq.NFData (Blanks.UnderScope.BinderScope n e) instance GHC.Generics.Generic (Blanks.UnderScope.BinderScope n e) instance Data.Traversable.Traversable (Blanks.UnderScope.BinderScope n) instance Data.Foldable.Foldable (Blanks.UnderScope.BinderScope n) instance GHC.Base.Functor (Blanks.UnderScope.BinderScope n) instance (GHC.Show.Show n, GHC.Show.Show e) => GHC.Show.Show (Blanks.UnderScope.BinderScope n e) instance (GHC.Classes.Eq n, GHC.Classes.Eq e) => GHC.Classes.Eq (Blanks.UnderScope.BinderScope n e) instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Blanks.UnderScope.FreeScope a) instance Data.Traversable.Traversable Blanks.UnderScope.FreeScope instance Data.Foldable.Foldable Blanks.UnderScope.FreeScope instance GHC.Base.Functor Blanks.UnderScope.FreeScope instance GHC.Show.Show a => GHC.Show.Show (Blanks.UnderScope.FreeScope a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Blanks.UnderScope.FreeScope a) instance Control.DeepSeq.NFData Blanks.UnderScope.BoundScope instance GHC.Show.Show Blanks.UnderScope.BoundScope instance GHC.Classes.Eq Blanks.UnderScope.BoundScope instance GHC.Base.Functor f => Data.Bifunctor.Bifunctor (Blanks.UnderScope.UnderScope n f) instance Data.Foldable.Foldable f => Data.Bifoldable.Bifoldable (Blanks.UnderScope.UnderScope n f) instance Data.Traversable.Traversable f => Data.Bitraversable.Bitraversable (Blanks.UnderScope.UnderScope n f) -- | Internals. You'd need to newtype ScopeW to implement your own -- Blank. module Blanks.ScopeW type ScopeC t u n f g = (Adjunction t u, Applicative u, Functor f, NatNewtype (ScopeW t n f g) g) newtype ScopeW t n f g a ScopeW :: t (UnderScope n f (g a) a) -> ScopeW t n f g a [unScopeW] :: ScopeW t n f g a -> t (UnderScope n f (g a) a) type ScopeWRawFold n f g a r = UnderScopeFold n f (g a) a r type ScopeWFold u n f g a r = ScopeWRawFold n f g a (u r) scopeWFree :: ScopeC t u n f g => a -> u (g a) scopeWEmbed :: ScopeC t u n f g => f (g a) -> u (g a) scopeWAbstract :: (ScopeC t u n f g, Eq a) => n -> Seq a -> g a -> u (g a) scopeWUnAbstract :: ScopeC t u n f g => Seq a -> g a -> g a scopeWInstantiate :: ScopeC t u n f g => Seq (u (g a)) -> g a -> g a scopeWApply :: ScopeC t u n f g => Seq (u (g a)) -> g a -> Either SubError (g a) scopeWBind :: ScopeC t u n f g => (a -> u (g b)) -> g a -> g b scopeWBindOpt :: ScopeC t u n f g => (a -> Maybe (u (g a))) -> g a -> g a scopeWLift :: (ScopeC t u n f g, Monad u, Traversable f) => f a -> u (g a) scopeWRawFold :: (NatNewtype (ScopeW t n f g) g, Functor t) => ScopeWRawFold n f g a r -> g a -> t r scopeWFold :: (NatNewtype (ScopeW t n f g) g, Adjunction t u) => ScopeWFold u n f g a r -> g a -> r scopeWLiftAnno :: (NatNewtype (ScopeW t n f g) g, Functor t) => t a -> g a scopeWHoistAnno :: (NatNewtype (ScopeW t n f g) g, NatNewtype (ScopeW w n f h) h, Functor t, Functor w, Functor f) => (forall x. t x -> w x) -> g a -> h a scopeWMapAnno :: ScopeC t u n f g => (t a -> t b) -> g a -> g b instance Control.DeepSeq.NFData (t (Blanks.UnderScope.UnderScope n f (g a) a)) => Control.DeepSeq.NFData (Blanks.ScopeW.ScopeW t n f g a) instance GHC.Classes.Eq (t (Blanks.UnderScope.UnderScope n f (g a) a)) => GHC.Classes.Eq (Blanks.ScopeW.ScopeW t n f g a) instance GHC.Show.Show (t (Blanks.UnderScope.UnderScope n f (g a) a)) => GHC.Show.Show (Blanks.ScopeW.ScopeW t n f g a) instance (GHC.Base.Functor t, GHC.Base.Functor f, GHC.Base.Functor g) => GHC.Base.Functor (Blanks.ScopeW.ScopeW t n f g) instance (Data.Foldable.Foldable t, Data.Foldable.Foldable f, Data.Foldable.Foldable g) => Data.Foldable.Foldable (Blanks.ScopeW.ScopeW t n f g) instance (Data.Traversable.Traversable t, Data.Traversable.Traversable f, Data.Traversable.Traversable g) => Data.Traversable.Traversable (Blanks.ScopeW.ScopeW t n f g) module Blanks.Interface -- | Indicates that g is a "scope" functor we can use for -- name-binding. (Behind-the-scenes, g must be a newtype wrapper -- over the ScopeW datatype.) Most of the time you will use -- Scope or LocScope directly, which are instances of -- this class. -- -- We use the pair of adjoint functors indexed by g to shift the -- burden of operating in context where it is more convenient. For -- example, LocScope uses a pair of functors that are -- essentially Env and Reader. The left adjoint -- Env lets us annotate every level of our expression tree with -- a location, and the right adjoint Reader informs us of that -- location so we don't have to make one up out of thin air! -- -- Scope uses the pair of functors Identity and -- Identity, which means there is no ability to store any -- additional information in the tree, but there's also no additional -- burden to provide that information. class (Adjunction (BlankLeft g) (BlankRight g), Applicative (BlankRight g), Functor (BlankFunctor g), NatNewtype (ScopeW (BlankLeft g) (BlankInfo g) (BlankFunctor g) g) g) => Blank (g :: Type -> Type) -- | The left adjoint functor used by g. type family BlankLeft (g :: Type -> Type) :: Type -> Type -- | The right adjoint functor used by g type family BlankRight (g :: Type -> Type) :: Type -> Type -- | The binder info used by g. type family BlankInfo (g :: Type -> Type) :: Type -- | The expression functor used by g. type family BlankFunctor (g :: Type -> Type) :: Type -> Type type BlankRawFold (g :: Type -> Type) (a :: Type) (r :: Type) = UnderScopeFold (BlankInfo g) (BlankFunctor g) (g a) a r type BlankFold (g :: Type -> Type) (a :: Type) (r :: Type) = BlankRawFold g a (BlankRight g r) -- | A pair of Blank functors that index the same info and embedded -- functors. Used to change adjoint functors. type BlankPair g h = (Blank g, Blank h, BlankInfo g ~ BlankInfo h, BlankFunctor g ~ BlankFunctor h) -- | Creates a free variable in context. blankFree :: Blank g => a -> BlankRight g (g a) -- | Embeds an expression functor in context. blankEmbed :: Blank g => BlankFunctor g (g a) -> BlankRight g (g a) -- | Binds free variables in an expression and returns a binder. blankAbstract :: (Blank g, Eq a) => BlankInfo g -> Seq a -> g a -> BlankRight g (g a) -- | blankAbstract for a single argument. blankAbstract1 :: (Blank g, Eq a) => BlankInfo g -> a -> g a -> BlankRight g (g a) -- | Un-bind free variables in an expression. Basically the inverse of -- blankAbstract. Take care to match the arity of the binder! -- (blankApply is safer.) blankUnAbstract :: Blank g => Seq a -> g a -> g a blankUnAbstract1 :: Blank g => a -> g a -> g a -- | Instantiate the bound variables in an expression with other -- expressions. Take care to match the arity of the binder! -- (blankApply is safer.) blankInstantiate :: Blank g => Seq (BlankRight g (g a)) -> g a -> g a -- | blankInstantiate for a single argument. blankInstantiate1 :: Blank g => BlankRight g (g a) -> g a -> g 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 blankInstantiate that fails -- loudly instead of silently! blankApply :: Blank g => Seq (BlankRight g (g a)) -> g a -> Either SubError (g a) -- | blankApply for a single argument. blankApply1 :: Blank g => BlankRight g (g a) -> g a -> Either SubError (g a) -- | A ThrowSub version of blankApply. blankApplyThrow :: (Blank g, ThrowSub m, Applicative m) => Seq (BlankRight g (g a)) -> g a -> m (g a) -- | A ThrowSub version of blankApply1. blankApply1Throw :: (Blank g, ThrowSub m, Applicative m) => BlankRight g (g a) -> g a -> m (g a) -- | Substitution as a kind of monadic bind. blankBind :: Blank g => (a -> BlankRight g (g b)) -> g a -> g b -- | Optional substitution as another kind of monadic bind. blankBindOpt :: Blank g => (a -> Maybe (BlankRight g (g a))) -> g a -> g a -- | Lift an expression functor into the scope functor. blankLift :: (Blank g, Monad (BlankRight g), Traversable (BlankFunctor g)) => BlankFunctor g a -> BlankRight g (g a) -- | Pattern match all cases of the scope functor. blankRawFold :: Blank g => BlankRawFold g a r -> g a -> BlankLeft g r -- | Pattern match all cases of the scope functor, and eliminate the -- adjoints. blankFold :: Blank g => BlankFold g a r -> g a -> r -- | Lift a value of your left adjoint functor (annotating the tree) into -- your scope functor. blankLiftAnno :: Blank g => BlankLeft g a -> g a -- | Apply a natural transformation to your left adjoint functor -- (annotating the tree) to change scope functors. blankHoistAnno :: BlankPair g h => (forall x. BlankLeft g x -> BlankLeft h x) -> g a -> h a -- | Apply a function to the free variables in scope in the context of the -- left adjoint functor. (Allows you to read annotations when fmapping.) blankMapAnno :: Blank g => (BlankLeft g a -> BlankLeft g b) -> g a -> g b module Blanks.Scope -- | A simple wrapper for your expression functor that knows how to -- name-bind. See Blank for usage, and see the patterns in this -- module for easy manipulation and inspection. newtype Scope n f a Scope :: ScopeW Identity n f (Scope n f) a -> Scope n f a [unScope] :: Scope n f a -> ScopeW Identity n f (Scope n f) a pattern ScopeBound :: Int -> Scope n f a pattern ScopeFree :: a -> Scope n f a pattern ScopeBinder :: Int -> n -> Scope n f a -> Scope n f a pattern ScopeEmbed :: f (Scope n f a) -> Scope n f a instance Data.Traversable.Traversable f => Data.Traversable.Traversable (Blanks.Scope.Scope n f) instance Data.Foldable.Foldable f => Data.Foldable.Foldable (Blanks.Scope.Scope n f) instance GHC.Base.Functor f => GHC.Base.Functor (Blanks.Scope.Scope n f) instance GHC.Base.Functor f => Blanks.Interface.Blank (Blanks.Scope.Scope n f) instance Blanks.NatNewtype.NatNewtype (Blanks.ScopeW.ScopeW Data.Functor.Identity.Identity n f (Blanks.Scope.Scope n f)) (Blanks.Scope.Scope n f) instance (Control.DeepSeq.NFData n, Control.DeepSeq.NFData a, Control.DeepSeq.NFData (f (Blanks.Scope.Scope n f a))) => Control.DeepSeq.NFData (Blanks.Scope.Scope n f a) instance GHC.Base.Functor f => GHC.Base.Applicative (Blanks.Scope.Scope n f) instance GHC.Base.Functor f => GHC.Base.Monad (Blanks.Scope.Scope n f) instance (GHC.Classes.Eq (f (Blanks.Scope.Scope n f a)), GHC.Classes.Eq n, GHC.Classes.Eq a) => GHC.Classes.Eq (Blanks.Scope.Scope n f a) instance (GHC.Show.Show (f (Blanks.Scope.Scope n f a)), GHC.Show.Show n, GHC.Show.Show a) => GHC.Show.Show (Blanks.Scope.Scope n f a) module Blanks.LocScope -- | A Scope annotated with some information between constructors. -- See Blank for usage, and see the patterns in this module for -- easy manipulation and inspection. newtype LocScope l n f a LocScope :: ScopeW (Located l) n f (LocScope l n f) a -> LocScope l n f a [unLocScope] :: LocScope l n f a -> ScopeW (Located l) n f (LocScope l n f) a pattern LocScopeBound :: l -> Int -> LocScope l n f a pattern LocScopeFree :: l -> a -> LocScope l n f a pattern LocScopeBinder :: l -> Int -> n -> LocScope l n f a -> LocScope l n f a pattern LocScopeEmbed :: l -> f (LocScope l n f a) -> LocScope l n f a -- | Extract the location (annotation) from this scope. locScopeLocation :: LocScope l n f a -> l -- | Forget all the annotations and yield a plain Scope. locScopeForget :: Functor f => LocScope l n f a -> Scope n f a instance Data.Traversable.Traversable f => Data.Traversable.Traversable (Blanks.LocScope.LocScope l n f) instance Data.Foldable.Foldable f => Data.Foldable.Foldable (Blanks.LocScope.LocScope l n f) instance GHC.Base.Functor f => GHC.Base.Functor (Blanks.LocScope.LocScope l n f) instance GHC.Base.Functor f => Blanks.Interface.Blank (Blanks.LocScope.LocScope l n f) instance Blanks.NatNewtype.NatNewtype (Blanks.ScopeW.ScopeW (Blanks.Located.Located l) n f (Blanks.LocScope.LocScope l n f)) (Blanks.LocScope.LocScope l n f) instance (Control.DeepSeq.NFData l, Control.DeepSeq.NFData n, Control.DeepSeq.NFData a, Control.DeepSeq.NFData (f (Blanks.LocScope.LocScope l n f a))) => Control.DeepSeq.NFData (Blanks.LocScope.LocScope l n f a) instance (GHC.Base.Monoid l, GHC.Base.Functor f) => GHC.Base.Applicative (Blanks.LocScope.LocScope l n f) instance (GHC.Base.Monoid l, GHC.Base.Functor f) => GHC.Base.Monad (Blanks.LocScope.LocScope l n f) instance (GHC.Base.Monoid l, GHC.Base.Functor f) => Control.Monad.Writer.Class.MonadWriter l (Blanks.LocScope.LocScope l n f) instance (GHC.Classes.Eq (f (Blanks.LocScope.LocScope l n f a)), GHC.Classes.Eq l, GHC.Classes.Eq n, GHC.Classes.Eq a) => GHC.Classes.Eq (Blanks.LocScope.LocScope l n f a) instance (GHC.Show.Show (f (Blanks.LocScope.LocScope l n f a)), GHC.Show.Show l, GHC.Show.Show n, GHC.Show.Show a) => GHC.Show.Show (Blanks.LocScope.LocScope l n f a) -- | You'll get most of what you want by just importing this module -- unqualified. See the Blanks class definition and related -- methods to manipulate variables and abstractions. See Scope for -- the basic wrapper and LocScope for a wrapper with annotations -- you can use for source locations and the like. See the test suite for -- examples. module Blanks