mulang-4.4.0: src/Language/Mulang/Inspector/Contextualized.hs
module Language.Mulang.Inspector.Contextualized (
decontextualize,
contextualize,
contextualized,
contextualizedBind,
boundContextualize,
contextualizedScoped,
contextualizedScopedList,
contextualizedTransitive,
contextualizedTransitiveList,
ContextualizedInspection,
ContextualizedModifier,
ContextualizedBoundInspection) where
import Language.Mulang.Ast
import Language.Mulang.Identifier (IdentifierPredicate)
import Language.Mulang.Inspector.Bound (BoundInspection)
import Language.Mulang.Inspector.Combiner (scoped, scopedList, transitive, transitiveList, Modifier)
import Language.Mulang.Inspector.Primitive (Inspection)
type ContextualizedInspection = Expression -> Inspection
type ContextualizedBoundInspection = IdentifierPredicate -> ContextualizedInspection
type ContextualizedModifier = ContextualizedInspection -> ContextualizedInspection
--
-- Lifts
--
contextualize :: Inspection -> ContextualizedInspection
contextualize = const
-- Generalized version of bind to accept contextualized inspections
contextualizedBind :: ContextualizedInspection -> ContextualizedBoundInspection
contextualizedBind = const
-- Generalized version of contextualize to accept bound inspections
boundContextualize :: BoundInspection -> ContextualizedBoundInspection
boundContextualize i = contextualize . i
--
-- Unlift
--
decontextualize :: ContextualizedInspection -> Inspection
decontextualize inspection = \expression -> inspection expression expression
--
-- Modifiers
--
contextualized :: Modifier -> ContextualizedModifier
contextualized f inspection = \context -> f (inspection context)
contextualizedScoped :: Identifier -> ContextualizedModifier
contextualizedScoped scope = contextualized (scoped scope)
contextualizedScopedList :: [Identifier] -> ContextualizedModifier
contextualizedScopedList scope = contextualized (scopedList scope)
contextualizedTransitive :: Identifier -> ContextualizedModifier
contextualizedTransitive scope = contextualized (transitive scope)
contextualizedTransitiveList :: [Identifier] -> ContextualizedModifier
contextualizedTransitiveList scope = contextualized (transitiveList scope)