packages feed

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)