{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE TypeFamilyDependencies #-}
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE IncoherentInstances #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE UnicodeSyntax #-}
module Language.Grammars.AspectAG
(
Rule, CRule(..),
syndef, syndefM, syn,
synmod, synmodM,
inh, inhdef, inhdefM,
inhmod, inhmodM,
emptyRule,
emptyRuleAtPrd,
ext,
emptyAspect,
singAsp,
extAspect,
comAspect,
(.+:),(◃),
(.:+.),(▹),
(.:+:),(⋈),
CAspect(..),
Label(Label), Prod(..), T(..), NT(..), Child(..), Att(..),
(.#), (#.), (=.), (.=), (.*), (*.),
emptyAtt,
ter,
at, lhs,
sem_Lit,
knitAspect,
traceAspect,
traceRule,
copyAtChi,
use,
emptyAspectC,
emptyAspectForProds,
module Data.GenRec,
module Language.Grammars.AspectAG.HList
)
where
import Language.Grammars.AspectAG.HList
import Language.Grammars.AspectAG.RecordInstances
import Data.Type.Require hiding (emptyCtx)
import Data.GenRec
import Data.GenRec.Label
import Data.Kind
import Data.Proxy
import GHC.TypeLits
import Data.Maybe
import Data.Type.Equality
import Control.Monad.Reader
class SemLit a where
sem_Lit :: a -> Attribution ('[] :: [(Att,Type)])
-> Attribution '[ '( 'Att "term" a , a)]
lit :: Label ('Att "term" a)
instance SemLit a where
sem_Lit a _ = (Label =. a) *. emptyAtt
lit = Label @ ('Att "term" a)
data Fam (prd :: Prod)
(c :: [(Child, [(Att, Type)])])
(p :: [(Att, Type)]) :: Type
where
Fam :: ChAttsRec prd c -> Attribution p -> Fam prd c p
chi :: Fam prd c p -> ChAttsRec prd c
chi (Fam c p) = c
par :: Fam prd c p -> Attribution p
par (Fam c p) = p
prd :: Fam prd c p -> Label prd
prd (Fam c p) = Label
type Rule
(prd :: Prod)
(sc :: [(Child, [(Att, Type)])])
(ip :: [(Att, Type)])
(ic :: [(Child, [(Att, Type)])])
(sp :: [(Att, Type)])
(ic' :: [(Child, [(Att, Type)])])
(sp' :: [(Att, Type)])
= Fam prd sc ip -> Fam prd ic sp -> Fam prd ic' sp'
newtype CRule (ctx :: [ErrorMessage]) prd sc ip ic sp ic' sp'
= CRule { mkRule :: (Proxy ctx -> Rule prd sc ip ic sp ic' sp')}
emptyRule =
CRule $ \Proxy -> \fam inp -> inp
emptyRuleAtPrd :: Label prd -> CRule ctx prd sc ip ic' sp' ic' sp'
emptyRuleAtPrd Label = emptyRule
newtype CAspect (ctx :: [ErrorMessage]) (asp :: [(Prod, Type)] )
= CAspect { mkAspect :: Proxy ctx -> Aspect asp}
emptyAspect :: CAspect ctx '[]
emptyAspect = CAspect $ const EmptyRec
comAspect ::
( Require (OpComAsp al ar) ctx
, ReqR (OpComAsp al ar) ~ Aspect asp
)
=> CAspect ctx al -> CAspect ctx ar -> CAspect ctx asp
comAspect al ar
= CAspect $ \ctx -> req ctx (OpComAsp (mkAspect al ctx) (mkAspect ar ctx))
traceAspect (_ :: Proxy (e::ErrorMessage))
= mapCAspect $ \(_ :: Proxy ctx) -> Proxy @ ((Text "aspect ":<>: e) : ctx)
traceRule (_ :: Proxy (e::ErrorMessage))
= mapCRule $ \(_ :: Proxy ctx) -> Proxy @ ((Text "rule ":<>: e) : ctx)
mapCRule :: (Proxy ctx -> Proxy ctx')
-> CRule ctx' prd sc ip ic sp ic' sp'
-> CRule ctx prd sc ip ic sp ic' sp'
mapCRule fctx (CRule frule) = CRule $ frule . fctx
mapCAspect fctx (CAspect fasp) = CAspect $
mapCtxRec fctx . fasp . fctx
class MapCtxAsp (r :: [(Prod,Type)]) (ctx :: [ErrorMessage])
(ctx' :: [ErrorMessage]) where
type ResMapCtx r ctx ctx' :: [(Prod,Type)]
mapCtxRec :: (Proxy ctx -> Proxy ctx')
-> Aspect r -> Aspect (ResMapCtx r ctx ctx')
instance
( MapCtxAsp r ctx ctx'
, ResMapCtx r ctx ctx' ~ r'
)
=>
MapCtxAsp ( '(l, CRule ctx' prd sc ip ic sp ic' sp') ': r) ctx ctx' where
type ResMapCtx ( '(l, CRule ctx' prd sc ip ic sp ic' sp') ': r) ctx ctx'
= '(l, CRule ctx prd sc ip ic sp ic' sp') ': ResMapCtx r ctx ctx'
mapCtxRec fctx (ConsRec (TagField c l r) rs) = (ConsRec (TagField c l
(mapCRule fctx r))
(mapCtxRec fctx rs))
instance MapCtxAsp ('[] :: [(Prod,Type)]) ctx ctx' where
type ResMapCtx ('[] :: [(Prod,Type)]) ctx ctx'
= '[]
mapCtxRec _ EmptyRec = EmptyRec
extAspect
:: ExtAspect ctx prd sc ip ic sp ic' sp' a asp =>
CRule ctx prd sc ip ic sp ic' sp'
-> CAspect ctx a -> CAspect ctx asp
extAspect rule (CAspect fasp)
= CAspect $ \ctx -> req ctx (OpComRA rule (fasp ctx))
type ExtAspect ctx prd sc ip ic sp ic' sp' a asp
= (Require
(OpComRA ctx prd (CRule ctx prd sc ip ic sp ic' sp') a) ctx,
ReqR (OpComRA ctx prd (CRule ctx prd sc ip ic sp ic' sp') a)
~ Rec PrdReco asp)
(.+:) = extAspect
infixr 3 .+:
(◃) = extAspect
infixr 3 ◃
(.:+.) = flip extAspect
infixl 3 .:+.
(▹) = flip extAspect
infixl 3 ▹
(.:+:) = comAspect
infixr 4 .:+:
(⋈) = comAspect
infixr 4 ⋈
ext' :: CRule ctx prd sc ip ic sp ic' sp'
-> CRule ctx prd sc ip a b ic sp
-> CRule ctx prd sc ip a b ic' sp'
(CRule f) `ext'` (CRule g)
= CRule $ \ctx input -> f ctx input . g ctx input
ext :: RequireEq prd prd' (Text "ext":ctx)
=> CRule ctx prd sc ip ic sp ic' sp'
-> CRule ctx prd' sc ip a b ic sp
-> CRule ctx prd sc ip a b ic' sp'
ext = ext'
singAsp r
= r .+: emptyAspect
infixr 6 .+.
(.+.) = ext
data OpComRA (ctx :: [ErrorMessage])
(prd :: Prod)
(rule :: Type)
(a :: [(Prod, Type)]) where
OpComRA :: CRule ctx prd sc ip ic sp ic' sp'
-> Aspect a -> OpComRA ctx prd (CRule ctx prd sc ip ic sp ic' sp') a
data OpComRA' (cmp :: Ordering)
(ctx :: [ErrorMessage])
(prd :: Prod)
(rule :: Type)
(a :: [(Prod, Type)]) where
OpComRA' :: Proxy cmp
-> CRule ctx prd sc ip ic sp ic' sp'
-> Aspect a
-> OpComRA' cmp ctx prd (CRule ctx prd sc ip ic sp ic' sp') a
cRuleToTagField :: (CRule ctx prd sc ip ic sp ic' sp')
-> TagField PrdReco prd (CRule ctx prd sc ip ic sp ic' sp')
cRuleToTagField =
TagField Label Label
instance
Require (OpComRA ctx prd (CRule ctx prd sc ip ic sp ic' sp') '[]) ctx where
type ReqR (OpComRA ctx prd (CRule ctx prd sc ip ic sp ic' sp') '[]) =
Aspect '[ '(prd, CRule ctx prd sc ip ic sp ic' sp')]
req ctx (OpComRA rule EmptyRec) =
ConsRec (cRuleToTagField rule) EmptyRec
instance
Require (OpComRA' (Cmp prd prd') ctx prd rule ( '(prd', rule') ': asp )) ctx
=>
Require (OpComRA ctx prd rule ( '(prd', rule') ': asp )) ctx where
type ReqR (OpComRA ctx prd rule ( '(prd', rule') ': asp )) =
ReqR (OpComRA' (Cmp prd prd') ctx prd rule ( '(prd', rule') ': asp ))
req ctx (OpComRA rule asp) =
req ctx (OpComRA' (Proxy @ (Cmp prd prd')) rule asp)
instance
( Require (OpUpdate PrdReco prd (CRule ctx prd sc ip ic sp ic'' sp'') a) ctx
, Require (OpLookup PrdReco prd a) ctx
, ReqR (OpLookup PrdReco prd a) ~ CRule ctx prd sc ip ic sp ic' sp'
, (IC (ReqR (OpLookup PrdReco prd a))) ~ ic
, (SP (ReqR (OpLookup PrdReco prd a))) ~ sp
) =>
Require
(OpComRA' 'EQ ctx prd (CRule ctx prd sc ip ic' sp' ic'' sp'') a) ctx where
type ReqR (OpComRA' 'EQ ctx prd (CRule ctx prd sc ip ic' sp' ic'' sp'') a) =
ReqR (OpUpdate PrdReco prd
(CRule ctx prd sc ip
(IC (ReqR (OpLookup PrdReco prd a)))
(SP (ReqR (OpLookup PrdReco prd a)))
ic'' sp'') a)
req ctx (OpComRA' _ crule asp) =
let prd = Label @ prd
oldRule = req ctx (OpLookup prd asp)
newRule = crule `ext` oldRule
in req ctx (OpUpdate prd newRule asp)
instance
( Require (OpComRA ctx prd rule asp) ctx
, ReqR (OpComRA ctx prd rule asp) ~ Aspect a0
)
=>
Require (OpComRA' 'GT ctx prd rule ( '(prd' , rule') ': asp)) ctx where
type ReqR (OpComRA' 'GT ctx prd rule ( '(prd' , rule') ': asp)) =
Aspect ( '(prd' , rule') ': UnWrap (ReqR (OpComRA ctx prd rule asp)))
req ctx (OpComRA' _ crule (ConsRec crule' asp)) =
ConsRec crule' $ req ctx (OpComRA crule asp)
instance
Require (OpComRA' 'LT ctx prd rule ( '(prd' , rule') ': asp)) ctx where
type ReqR (OpComRA' 'LT ctx prd rule ( '(prd' , rule') ': asp)) =
Aspect ( '(prd, rule) ': '(prd' , rule') ': asp)
req ctx (OpComRA' _ crule asp) =
ConsRec (TagField Label Label crule) asp
data OpComAsp (al :: [(Prod, Type)])
(ar :: [(Prod, Type)]) where
OpComAsp :: Aspect al -> Aspect ar -> OpComAsp al ar
instance
Require (OpComAsp '[] ar) ctx where
type ReqR (OpComAsp '[] ar) = Aspect ar
req ctx (OpComAsp _ ar) = ar
instance
( (ReqR (OpComRA ctx prd (CRule ctx prd sc ip ic sp ic' sp') ar))
~ (Rec PrdReco
(UnWrap
(ReqR (OpComRA ctx prd (CRule ctx prd sc ip ic sp ic' sp') ar))))
, ReqR (OpComRA ctx prd (CRule ctx prd sc ip ic sp ic' sp') ar)
~ Rec PrdReco ar0
, (Require (OpComAsp al ar0) ctx)
, (Require
(OpComRA ctx prd (CRule ctx prd sc ip ic sp ic' sp') ar) ctx)
) =>
Require (OpComAsp
('(prd, CRule ctx prd sc ip ic sp ic' sp') ': al) ar) ctx where
type ReqR (OpComAsp ('(prd, CRule ctx prd sc ip ic sp ic' sp') ': al) ar) =
ReqR (OpComAsp al
(UnWrap (ReqR
(OpComRA ctx prd (CRule ctx prd sc ip ic sp ic' sp') ar))))
req ctx (OpComAsp (ConsRec (TagField _ _ rul) al) ar)
= req ctx (OpComAsp al (req ctx (OpComRA rul ar)))
type family IC (rule :: Type) where
IC (Rule prd sc ip ic sp ic' sp') = ic
IC (CRule ctx prd sc ip ic sp ic' sp') = ic
type family SP (rule :: Type) where
SP (Rule prd sc ip ic sp ic' sp') = sp
SP (CRule ctx prd sc ip ic sp ic' sp') = sp
type family Syndef t t' ctx ctx' att sp sp' prd :: Constraint where
Syndef t t' ctx ctx' att sp sp' prd =
( RequireEq t t' ctx'
, RequireR (OpExtend AttReco ('Att att t) t sp) ctx (Attribution sp')
, ctx'
~ ((Text "syndef("
:<>: ShowTE ('Att att t) :<>: Text ", "
:<>: ShowTE prd :<>: Text ")") ': ctx)
)
syndef
:: Syndef t t' ctx ctx' att sp sp' prd
=> forall sc ip ic . Label ('Att att t)
-> Label prd
-> (Proxy ctx' -> Fam prd sc ip -> t')
-> CRule ctx prd sc ip ic sp ic sp'
syndef att prd f
= CRule $ \ctx inp (Fam ic sp)
-> Fam ic $ req ctx (OpExtend att (f Proxy inp) sp)
syndefM
:: Syndef t t' ctx ctx' att sp sp' prd
=> Label ('Att att t)
-> Label prd
-> Reader (Proxy ctx', Fam prd sc ip) t'
-> CRule ctx prd sc ip ic sp ic sp'
syndefM att prd = syndef att prd . def
syn = syndefM
inh = inhdefM
synmod
:: RequireR (OpUpdate AttReco ('Att att t) t r) ctx (Attribution sp')
=> Label ('Att att t)
-> Label prd
-> (Proxy
((('Text "synmod(" ':<>: ShowTE ('Att att t)) :<>: Text ", "
':<>: ShowTE prd :<>: Text ")")
: ctx)
-> Fam prd sc ip -> t)
-> CRule ctx prd sc ip ic' r ic' sp'
synmod att prd f
= CRule $ \ctx inp (Fam ic sp)
-> Fam ic $ req ctx (OpUpdate att (f Proxy inp) sp)
synmodM
:: RequireR (OpUpdate AttReco ('Att att t) t r) ctx (Attribution sp')
=> Label ('Att att t)
-> Label prd
-> Reader ( Proxy ((('Text "synmod(" ':<>: ShowTE ('Att att t)) :<>: Text ", "
':<>: ShowTE prd :<>: Text ")")
: ctx)
, Fam prd sc ip)
t
-> CRule ctx prd sc ip ic' r ic' sp'
synmodM att prd = synmod att prd . def
type family Inhdef t t' ctx ctx' att r v2 prd nt chi ntch ic ic' n where
Inhdef t t' ctx ctx' att r v2 prd nt chi ntch ic ic' n =
( RequireEq t t' ctx'
, RequireR (OpExtend AttReco ('Att att t) t r) ctx (Attribution v2)
, RequireR (OpUpdate (ChiReco ('Prd prd nt))
('Chi chi ('Prd prd nt) ntch) v2 ic) ctx
(ChAttsRec ('Prd prd nt) ic')
, RequireR (OpLookup (ChiReco ('Prd prd nt))
('Chi chi ('Prd prd nt) ntch) ic) ctx
(Attribution r)
, RequireEq ntch ('Left n) ctx'
, ctx' ~ ((Text "inhdef("
:<>: ShowTE ('Att att t) :<>: Text ", "
:<>: ShowTE ('Prd prd nt) :<>: Text ", "
:<>: ShowTE ('Chi chi ('Prd prd nt) ntch) :<>: Text ")")
': ctx)
)
inhdef
:: Inhdef t t' ctx ctx' att r v2 prd nt chi ntch ic ic' n
=>
Label ('Att att t)
-> Label ('Prd prd nt)
-> Label ('Chi chi ('Prd prd nt) ntch)
-> (Proxy ctx' -> Fam ('Prd prd nt) sc ip -> t')
-> forall sp . CRule ctx ('Prd prd nt) sc ip ic sp ic' sp
inhdef att prd chi f
= CRule $ \ctx inp (Fam ic sp)
-> let ic' = req ctx (OpUpdate chi catts' ic)
catts = req ctx (OpLookup chi ic)
catts'= req ctx (OpExtend att (f Proxy inp) catts)
in Fam ic' sp
inhdefM
:: Inhdef t t' ctx ctx' att r v2 prd nt chi ntch ic ic' n
=>
Label ('Att att t)
-> Label ('Prd prd nt)
-> Label ('Chi chi ('Prd prd nt) ntch)
-> Reader (Proxy ctx', Fam ('Prd prd nt) sc ip) t'
-> CRule ctx ('Prd prd nt) sc ip ic sp ic' sp
inhdefM att prd chi = inhdef att prd chi . def
inhmod
:: ( RequireEq t t' ctx'
, RequireR (OpUpdate AttReco ('Att att t) t r) ctx
(Attribution v2)
, RequireR (OpUpdate (ChiReco ('Prd prd nt))
('Chi chi ('Prd prd nt) ntch) v2 ic) ctx
(ChAttsRec ('Prd prd nt) ic')
, RequireR (OpLookup (ChiReco ('Prd prd nt))
('Chi chi ('Prd prd nt) ntch) ic) ctx
(Attribution r)
, RequireEq ntch ('Left n) ctx'
, ctx' ~ ((Text "inhmod("
:<>: ShowTE ('Att att t) :<>: Text ", "
:<>: ShowTE ('Prd prd nt) :<>: Text ", "
:<>: ShowTE ('Chi chi ('Prd prd nt) ntch) :<>: Text ")")
': ctx))
=>
Label ('Att att t)
-> Label ('Prd prd nt)
-> Label ('Chi chi ('Prd prd nt) ntch)
-> (Proxy ctx' -> Fam ('Prd prd nt) sc ip -> t')
-> CRule ctx ('Prd prd nt) sc ip ic sp ic' sp
inhmod att prd chi f
= CRule $ \ctx inp (Fam ic sp)
-> let ic' = req ctx (OpUpdate chi catts' ic)
catts = req ctx (OpLookup chi ic)
catts'= req ctx (OpUpdate att (f Proxy inp) catts)
in Fam ic' sp
inhmodM
:: ( RequireEq t t' ctx'
, RequireR (OpUpdate AttReco ('Att att t) t r) ctx
(Attribution v2)
, RequireR (OpUpdate (ChiReco ('Prd prd nt))
('Chi chi ('Prd prd nt) ntch) v2 ic) ctx
(ChAttsRec ('Prd prd nt) ic')
, RequireR (OpLookup (ChiReco ('Prd prd nt))
('Chi chi ('Prd prd nt) ntch) ic) ctx
(Attribution r)
, RequireEq ntch ('Left n) ctx'
, ctx' ~ ((Text "inhmod("
:<>: ShowTE ('Att att t) :<>: Text ", "
:<>: ShowTE ('Prd prd nt) :<>: Text ", "
:<>: ShowTE ('Chi chi ('Prd prd nt) ntch) :<>: Text ")")
': ctx))
=>
Label ('Att att t)
-> Label ('Prd prd nt)
-> Label ('Chi chi ('Prd prd nt) ntch)
-> Reader (Proxy ctx', Fam ('Prd prd nt) sc ip) t'
-> CRule ctx ('Prd prd nt) sc ip ic sp ic' sp
inhmodM att prd chi = inhmod att prd chi . def
data Lhs
lhs :: Label Lhs
lhs = Label
class At pos att m where
type ResAt pos att m
at :: Label pos -> Label att -> m (ResAt pos att m)
instance ( RequireR (OpLookup (ChiReco prd) ('Chi ch prd nt) chi) ctx
(Attribution r)
, RequireR (OpLookup AttReco ('Att att t) r) ctx t'
, RequireEq prd prd' ctx
, RequireEq t t' ctx
, RequireEq ('Chi ch prd nt) ('Chi ch prd ('Left ('NT n))) ctx
)
=> At ('Chi ch prd nt) ('Att att t)
(Reader (Proxy ctx, Fam prd' chi par)) where
type ResAt ('Chi ch prd nt) ('Att att t) (Reader (Proxy ctx, Fam prd' chi par))
= t
at ch att
= liftM (\(ctx, Fam chi _) -> let atts = req ctx (OpLookup ch chi)
in req ctx (OpLookup att atts))
ask
instance
( RequireR (OpLookup AttReco ('Att att t) par) ctx t'
, RequireEq t t' ctx
)
=> At Lhs ('Att att t) (Reader (Proxy ctx, Fam prd chi par)) where
type ResAt Lhs ('Att att t) (Reader (Proxy ctx, Fam prd chi par))
= t
at lhs att
= liftM (\(ctx, Fam _ par) -> req ctx (OpLookup att par)) ask
def :: Reader (Proxy ctx, Fam prd chi par) a
-> (Proxy ctx -> (Fam prd chi par) -> a)
def = curry . runReader
ter :: ( RequireR (OpLookup (ChiReco prd) pos chi) ctx
(Attribution r)
, RequireR (OpLookup AttReco ('Att "term" t) r) ctx t'
, RequireEq prd prd' ctx
, RequireEq t t' ctx
, RequireEq pos ('Chi ch prd (Right ('T t))) ctx
, m ~ Reader (Proxy ctx, Fam prd' chi par) )
=> Label pos -> m (ResAt pos ('Att "term" t) m)
ter (ch :: Label ('Chi ch prd (Right ('T t))))
= liftM (\(ctx, Fam chi _) -> let atts = req ctx (OpLookup ch chi)
in req ctx (OpLookup (lit @ t) atts))
ask
class Kn (fcr :: [(Child, Type)]) (prd :: Prod) where
type ICh fcr :: [(Child, [(Att, Type)])]
type SCh fcr :: [(Child, [(Att, Type)])]
kn :: Record fcr -> ChAttsRec prd (ICh fcr) -> ChAttsRec prd (SCh fcr)
instance Kn '[] prod where
type ICh '[] = '[]
type SCh '[] = '[]
kn _ _ = emptyCh
instance ( lch ~ 'Chi l prd nt
, Kn fc prd
) =>
Kn ( '(lch , Attribution ich -> Attribution sch) ': fc) prd where
type ICh ( '(lch , Attribution ich -> Attribution sch) ': fc)
= '(lch , ich) ': ICh fc
type SCh ( '(lch , Attribution ich -> Attribution sch) ': fc)
= '(lch , sch) ': SCh fc
kn ((ConsRec (TagField _ lch fch) (fcr :: Record fc)))
= \((ConsRec pich icr) :: ChAttsRec prd ( '(lch, ich) ': ICh fc))
-> let scr = kn fcr icr
ich = unTaggedChAttr pich
in ConsRec (TaggedChAttr lch
(fch ich)) scr
emptyCtx = Proxy @ '[]
knit'
:: ( Kn fc prd
, Empties fc prd)
=> CRule '[] prd (SCh fc) ip (EmptiesR fc) '[] (ICh fc) sp
-> Record fc -> Attribution ip -> Attribution sp
knit' (rule :: CRule '[] prd (SCh fc) ip
(EmptiesR fc) '[] (ICh fc) sp)
(fc :: Record fc) ip =
let (Fam ic sp) = mkRule rule emptyCtx
(Fam sc ip) (Fam ec emptyAtt)
sc = kn fc ic
ec = empties fc
in sp
class Empties (fc :: [(Child,Type)]) (prd :: Prod) where
type EmptiesR fc :: [(Child, [(Att, Type)])]
empties :: Record fc -> ChAttsRec prd (EmptiesR fc)
instance Empties '[] prd where
type EmptiesR '[] = '[]
empties _ = emptyCh
instance
( Empties fcr prd
, chi ~ 'Chi ch prd nt
)
=>
Empties ( '(chi, Attribution e -> Attribution a) ': fcr) prd where
type EmptiesR ( '(chi, Attribution e -> Attribution a) ': fcr) =
'(chi, '[]) ': EmptiesR fcr
empties (ConsRec (TagField labelc
(labelch :: Label chi) fch) r) =
ConsRec (TagField (Label @(ChiReco prd)) labelch emptyAtt) $ empties r
knit (ctx :: Proxy ctx)
(rule :: CRule ctx prd (SCh fc) ip (EmptiesR fc) '[] (ICh fc) sp)
(fc :: Record fc)
(ip :: Attribution ip)
= let (Fam ic sp) = mkRule rule ctx
(Fam sc ip) (Fam ec emptyAtt)
sc = kn fc ic
ec = empties fc
in sp
knitAspect (prd :: Label prd) asp fc ip
= let ctx = Proxy @ '[]
ctx' = Proxy @ '[Text "knit" :<>: ShowTE prd]
in knit ctx (req ctx' (OpLookup prd ((mkAspect asp) ctx))) fc ip
class Use (att :: Att) (prd :: Prod) (nts :: [NT]) (a :: Type) sc
where
usechi :: Label att -> Label prd -> KList nts -> (a -> a -> a) -> ChAttsRec prd sc
-> Maybe a
class Use' (mnts :: Bool) (att :: Att) (prd :: Prod) (nts :: [NT])
(a :: Type) sc
where
usechi' :: Proxy mnts -> Label att -> Label prd -> KList nts
-> (a -> a -> a)
-> ChAttsRec prd sc -> Maybe a
instance Use prd att nts a '[] where
usechi _ _ _ _ _ = Nothing
instance
( HMember' nt nts
, HMemberRes' nt nts ~ mnts
, Use' mnts att prd nts a ( '( 'Chi ch prd ('Left nt), attr) ': cs))
=>
Use att prd nts a ( '( 'Chi ch prd ('Left nt), attr) ': cs) where
usechi att prd nts op ch
= usechi' (Proxy @ mnts) att prd nts op ch
instance
Use att prd nts a cs
=>
Use att prd nts a ( '( 'Chi ch prd ('Right t), attr) ': cs) where
usechi att prd nts op (ConsRec _ ch)
= usechi att prd nts op ch
instance
Use att prd nts a cs
=>
Use' False att prd nts a ( '( 'Chi ch prd ('Left nt), attr) ': cs) where
usechi' _ att prd nts op (ConsRec _ cs) = usechi att prd nts op cs
instance
( Require (OpLookup AttReco att attr)
'[('Text "looking up attribute " ':<>: ShowTE att)
':$$: ('Text "on " ':<>: ShowTE attr)]
, ReqR (OpLookup AttReco att attr) ~ a
, Use att prd nts a cs
, WrapField (ChiReco prd) attr ~ Attribution attr)
=>
Use' True att prd nts a ( '( 'Chi ch prd ('Left nt), attr) : cs) where
usechi' _ att prd nts op (ConsRec lattr scr) =
let attr = unTaggedChAttr lattr
val = attr #. att
in Just $ maybe val (op val) $ usechi att prd nts op scr
use
:: UseC att prd nts t' sp sc sp' ctx
=> Label ('Att att t')
-> Label prd
-> KList nts
-> (t' -> t' -> t')
-> t'
-> forall ip ic' . CRule ctx prd sc ip ic' sp ic' sp'
use att prd nts op unit
= syndef att prd
$ \_ fam -> maybe unit id (usechi att prd nts op $ chi fam)
type UseC att prd nts t' sp sc sp' ctx =
( Require (OpExtend AttReco ('Att att t') t' sp) ctx
, Use ('Att att t') prd nts t' sc
, ReqR (OpExtend AttReco ('Att att t') t' sp)
~ Rec AttReco sp'
)
class EmptyAspectSameShape (es1 :: [k]) (es2 :: [m])
instance (es2 ~ '[]) => EmptyAspectSameShape '[] es2
instance (EmptyAspectSameShape xs ys, es2 ~ ( '(y1,y2,y3,y4) ': ys))
=> EmptyAspectSameShape (x ': xs) es2
class
EmptyAspectSameShape prds polyArgs
=>
EmptyAspect (prds :: [Prod])
(polyArgs :: [([(Child, [(Att, Type)])], [(Att, Type)],
[(Child, [(Att, Type)])], [(Att, Type)] )])
ctx where
type EmptyAspectR prds polyArgs ctx :: [(Prod, Type)]
emptyAspectC :: KList prds -> Proxy polyArgs
-> CAspect ctx (EmptyAspectR prds polyArgs ctx)
instance
EmptyAspect '[] '[] ctx where
type EmptyAspectR '[] '[] ctx = '[]
emptyAspectC _ _ = emptyAspect
instance
( EmptyAspect prds polys ctx
, ExtAspect ctx prd sc ip ic sp ic sp
(EmptyAspectR prds polys ctx)
(EmptyAspectR (prd ': prds) ( '(sc, ip, ic, sp) ': polys) ctx)
)
=>
EmptyAspect (prd ': prds) ( '(sc, ip, ic, sp) ': polys) ctx where
type EmptyAspectR (prd ': prds) ( '(sc, ip, ic, sp) ': polys) ctx =
UnWrap (ReqR (OpComRA '[] prd ((CRule '[] prd sc ip ic sp ic sp))
(EmptyAspectR prds polys ctx)))
emptyAspectC (KCons prd prds) (p :: Proxy ( '(sc, ip, ic, sp) ': polys)) =
(emptyRule :: CRule ctx prd sc ip ic sp ic sp)
.+: emptyAspectC @prds @polys prds (Proxy @ polys)
emptyAspectForProds prdList = emptyAspectC prdList Proxy
copyAtChi att chi
= inh att (prdFromChi chi) chi (at lhs att)
class CopyAtChiList (att :: Att)
(chi :: [Child])
(polyArgs :: [([(Child, [(Att, Type)])], [(Att, Type)],
[(Child, [(Att, Type)])], [(Att, Type)],
[(Child, [(Att, Type)])], [(Att, Type)] )])
ctx where
type CopyAtChiListR att chi polyArgs ctx :: [(Prod, Type)]
copyAtChiList :: Label att -> KList chi -> Proxy polyArgs
-> CAspect ctx (CopyAtChiListR att chi polyArgs ctx)
instance CopyAtChiList att '[] '[] ctx where
type CopyAtChiListR att '[] '[] ctx = '[]
copyAtChiList _ _ _ = emptyAspect