module Text.GrammarCombinators.Base.MultiRec(
module Generics.MultiRec.Base,
module Generics.MultiRec.HFunctor,
IL(IL, unIL),
SubPF(SubPF)
) where
import Text.GrammarCombinators.Base.Domain
import Control.Applicative
import Generics.MultiRec.Base
import Generics.MultiRec.HFunctor
data IL xi r ix = IL {
unIL :: [r xi]
}
instance (El phi xi) => HFunctor phi (IL xi) where
hmapA = hmapAIL
hmapAIL :: forall phi a r r' xi ix. (Applicative a, El phi xi) => (forall ix1. phi ix1 -> r ix1 -> a (r' ix1))
-> phi ix -> IL xi r ix -> a (IL xi r' ix)
hmapAIL f _ (IL l) =
let
as :: [a (r' xi)]
as = map (f proof) l
as' :: a [r' xi]
as' = foldr (liftA2 (:)) (pure []) as
in liftA IL as'
data SubPF (phi :: * -> *) (phi' :: * -> *) unusedPhi' supIxT r ix where
SubPF :: phi' ix -> PF phi' (SubVal supIxT r) ix -> SubPF phi phi' phi' supIxT r (supIxT ix)
instance (HFunctor phi' (PF phi'), DomainEmbedding phi phi' supIxT) =>
HFunctor phi (SubPF phi phi' phi' supIxT) where
hmapA = hmapSubPF
hmapSubPF :: forall phi r a r' phi' supIxT ix.
(Applicative a, HFunctor phi' (PF phi'), DomainEmbedding phi phi' supIxT) =>
(forall ix1. phi ix1 -> r ix1 -> a (r' ix1)) ->
phi ix ->
SubPF phi phi' phi' supIxT r ix ->
a (SubPF phi phi' phi' supIxT r' ix)
hmapSubPF f _ (SubPF (idx :: phi' ix') pfb) =
let
subF :: forall ix2. phi' ix2 -> SubVal supIxT r ix2 -> a (SubVal supIxT r' ix2)
subF idx' v = liftA MkSubVal $ f (supIx idx') $ unSubVal v
pfm :: a (PF phi' (SubVal supIxT r') ix')
pfm = hmapA subF idx pfb
in liftA (SubPF idx) pfm