25
25
-- generic arguments bound.
26
26
module Codec.CBOR.Cuddle.CDDL.Resolve (
27
27
buildResolvedCTree ,
28
- monoCTree ,
29
28
buildRefCTree ,
30
29
asMap ,
31
30
buildMonoCTree ,
@@ -323,10 +322,10 @@ postludeBinding =
323
322
, (Name " null" mempty , PTNil )
324
323
]
325
324
326
- data BindingEnv poly f = BindingEnv
325
+ data BindingEnv poly f g = BindingEnv
327
326
{ global :: Map. Map Name (poly (CTree. Node f ))
328
327
-- ^ Global name bindings via 'RuleDef'
329
- , local :: Map. Map Name (CTree. Node f )
328
+ , local :: Map. Map Name (CTree. Node g )
330
329
-- ^ Local bindings for generic parameters
331
330
}
332
331
deriving (Generic )
@@ -354,7 +353,7 @@ deriving instance Eq (CTreeRoot DistRef)
354
353
instance Hashable (CTreeRoot DistRef )
355
354
356
355
resolveRef ::
357
- BindingEnv (ParametrisedWith [Name ]) OrRef ->
356
+ BindingEnv (ParametrisedWith [Name ]) OrRef OrRef ->
358
357
CTree. Node OrRef ->
359
358
Either NameResolutionFailure (DistRef (CTree DistRef ))
360
359
resolveRef env (It a) = DIt <$> resolveCTree env a
@@ -375,7 +374,7 @@ resolveRef env (Ref n args) = case Map.lookup n postludeBinding of
375
374
Nothing -> Left $ UnboundReference n
376
375
377
376
resolveCTree ::
378
- BindingEnv (ParametrisedWith [Name ]) OrRef ->
377
+ BindingEnv (ParametrisedWith [Name ]) OrRef OrRef ->
379
378
CTree OrRef ->
380
379
Either NameResolutionFailure (CTree DistRef )
381
380
resolveCTree e = CTree. traverseCTree (resolveRef e)
@@ -407,7 +406,7 @@ deriving instance
407
406
Show (poly (CTree. Node MonoRef )) =>
408
407
Show (CTreeRoot' poly MonoRef )
409
408
410
- type MonoEnv = BindingEnv (ParametrisedWith [Name ]) DistRef
409
+ type MonoEnv = BindingEnv (ParametrisedWith [Name ]) DistRef MonoRef
411
410
412
411
-- | We introduce additional bindings in the state
413
412
type MonoState = Map. Map Name (CTree. Node MonoRef )
@@ -432,10 +431,10 @@ newtype MonoM a = MonoM
432
431
deriving
433
432
( HasSource
434
433
" local"
435
- (Map. Map Name (CTree. Node DistRef ))
434
+ (Map. Map Name (CTree. Node MonoRef ))
436
435
, HasReader
437
436
" local"
438
- (Map. Map Name (CTree. Node DistRef ))
437
+ (Map. Map Name (CTree. Node MonoRef ))
439
438
)
440
439
via Field
441
440
" local"
@@ -490,11 +489,12 @@ synthMono n@(Name origName _) args =
490
489
Just (Unparametrised _) -> throwNR $ MismatchingArgs n []
491
490
Just (Parametrised r params') ->
492
491
if length params' == length args
493
- then
494
- let localBinds = Map. fromList $ zip params' args
495
- in Reader. local @ " local" (Map. union localBinds) $ do
496
- foo <- resolveGenericRef r
497
- modify @ " synth" $ Map. insert fresh foo
492
+ then do
493
+ rargs <- traverse resolveGenericRef args
494
+ let localBinds = Map. fromList $ zip params' rargs
495
+ Reader. local @ " local" (Map. union localBinds) $ do
496
+ foo <- resolveGenericRef r
497
+ modify @ " synth" $ Map. insert fresh foo
498
498
else throwNR $ MismatchingArgs n params'
499
499
Nothing -> throwNR $ UnboundReference n
500
500
pure fresh
@@ -512,7 +512,7 @@ resolveGenericRef (RuleRef n margs) =
512
512
resolveGenericRef (GenericRef n) = do
513
513
localBinds <- ask @ " local"
514
514
case Map. lookup n localBinds of
515
- Just node -> resolveGenericRef node
515
+ Just node -> pure node
516
516
Nothing -> throwNR $ UnboundReference n
517
517
518
518
resolveGenericCTree ::
0 commit comments