@@ -25,11 +25,11 @@ import Codec.CBOR.Cuddle.CDDL (
25
25
Value (.. ),
26
26
ValueVariant (.. ),
27
27
)
28
- import Codec.CBOR.Cuddle.CDDL.CTree (CTree , CTreeRoot' (.. ))
28
+ import Codec.CBOR.Cuddle.CDDL.CTree (CTree , CTreeRoot (.. ))
29
29
import Codec.CBOR.Cuddle.CDDL.CTree qualified as CTree
30
30
import Codec.CBOR.Cuddle.CDDL.CtlOp qualified as CtlOp
31
31
import Codec.CBOR.Cuddle.CDDL.Postlude (PTerm (.. ))
32
- import Codec.CBOR.Cuddle.CDDL.Resolve (MonoRef (.. ))
32
+ import Codec.CBOR.Cuddle.CDDL.Resolve (MonoRef (.. ), MonoReferenced )
33
33
import Codec.CBOR.Term (Term (.. ))
34
34
import Codec.CBOR.Term qualified as CBOR
35
35
import Codec.CBOR.Write qualified as CBOR
@@ -41,7 +41,6 @@ import Data.Bifunctor (second)
41
41
import Data.ByteString (ByteString )
42
42
import Data.ByteString.Base16 qualified as Base16
43
43
import Data.Functor ((<&>) )
44
- import Data.Functor.Identity (Identity (runIdentity ))
45
44
import Data.List.NonEmpty qualified as NE
46
45
import Data.Map.Strict qualified as Map
47
46
import Data.Maybe (fromMaybe )
@@ -69,7 +68,7 @@ import System.Random.Stateful (
69
68
70
69
-- | Generator context, parametrised over the type of the random seed
71
70
newtype GenEnv = GenEnv
72
- { cddl :: CTreeRoot' Identity MonoRef
71
+ { cddl :: CTreeRoot MonoReferenced
73
72
}
74
73
deriving (Generic )
75
74
@@ -121,8 +120,8 @@ newtype M g a = M {runM :: StateT (GenState g) (Reader GenEnv) a}
121
120
()
122
121
(MonadState (StateT (GenState g ) (Reader GenEnv )))
123
122
deriving
124
- ( HasSource " cddl" (CTreeRoot' Identity MonoRef )
125
- , HasReader " cddl" (CTreeRoot' Identity MonoRef )
123
+ ( HasSource " cddl" (CTreeRoot MonoReferenced )
124
+ , HasReader " cddl" (CTreeRoot MonoReferenced )
126
125
)
127
126
via Field
128
127
" cddl"
@@ -253,11 +252,11 @@ pattern G xs = GroupTerm xs
253
252
-- Generator functions
254
253
--------------------------------------------------------------------------------
255
254
256
- genForCTree :: RandomGen g => CTree MonoRef -> M g WrappedTerm
255
+ genForCTree :: RandomGen g => CTree MonoReferenced -> M g WrappedTerm
257
256
genForCTree (CTree. Literal v) = S <$> genValue v
258
257
genForCTree (CTree. Postlude pt) = S <$> genPostlude pt
259
258
genForCTree (CTree. Map nodes) = do
260
- items <- pairTermList . flattenWrappedList <$> traverse genForNode nodes
259
+ items <- pairTermList . flattenWrappedList <$> traverse genForCTree nodes
261
260
case items of
262
261
Just ts ->
263
262
let
@@ -270,17 +269,17 @@ genForCTree (CTree.Map nodes) = do
270
269
pure . S $ TMap tsNodup
271
270
Nothing -> error " Single terms in map context"
272
271
genForCTree (CTree. Array nodes) = do
273
- items <- singleTermList . flattenWrappedList <$> traverse genForNode nodes
272
+ items <- singleTermList . flattenWrappedList <$> traverse genForCTree nodes
274
273
case items of
275
274
Just ts -> pure . S $ TList ts
276
275
Nothing -> error " Something weird happened which shouldn't be possible"
277
276
genForCTree (CTree. Choice (NE. toList -> nodes)) = do
278
277
ix <- genUniformRM (0 , length nodes - 1 )
279
- genForNode $ nodes !! ix
280
- genForCTree (CTree. Group nodes) = G <$> traverse genForNode nodes
278
+ genForCTree $ nodes !! ix
279
+ genForCTree (CTree. Group nodes) = G <$> traverse genForCTree nodes
281
280
genForCTree (CTree. KV key value _cut) = do
282
- kg <- genForNode key
283
- vg <- genForNode value
281
+ kg <- genForCTree key
282
+ vg <- genForCTree value
284
283
case (kg, vg) of
285
284
(S k, S v) -> pure $ P k v
286
285
_ ->
@@ -290,11 +289,11 @@ genForCTree (CTree.KV key value _cut) = do
290
289
<> " => "
291
290
<> show value
292
291
genForCTree (CTree. Occur item occurs) =
293
- applyOccurenceIndicator occurs (genForNode item)
292
+ applyOccurenceIndicator occurs (genForCTree item)
294
293
genForCTree (CTree. Range from to _bounds) = do
295
294
-- TODO Handle bounds correctly
296
- term1 <- genForNode from
297
- term2 <- genForNode to
295
+ term1 <- genForCTree from
296
+ term2 <- genForCTree to
298
297
case (term1, term2) of
299
298
(S (TInt a), S (TInt b)) -> genUniformRM (a, b) <&> S . TInt
300
299
(S (TInt a), S (TInteger b)) -> genUniformRM (fromIntegral a, b) <&> S . TInteger
@@ -304,27 +303,23 @@ genForCTree (CTree.Range from to _bounds) = do
304
303
(S (TDouble a), S (TDouble b)) -> genUniformRM (a, b) <&> S . TDouble
305
304
x -> error $ " Cannot apply range operator to non-numeric types: " <> show x
306
305
genForCTree (CTree. Control op target controller) = do
307
- tt <- resolveIfRef target
308
- ct <- resolveIfRef controller
309
- case (op, ct) of
310
- (CtlOp. Le , CTree. Literal (Value (VUInt n) _)) -> case tt of
306
+ case (op, controller) of
307
+ (CtlOp. Le , CTree. Literal (Value (VUInt n) _)) -> case target of
311
308
CTree. Postlude PTUInt -> S . TInteger <$> genUniformRM (0 , fromIntegral n)
312
309
_ -> error " Cannot apply le operator to target"
313
310
(CtlOp. Le , _) -> error $ " Invalid controller for .le operator: " <> show controller
314
- (CtlOp. Lt , CTree. Literal (Value (VUInt n) _)) -> case tt of
311
+ (CtlOp. Lt , CTree. Literal (Value (VUInt n) _)) -> case target of
315
312
CTree. Postlude PTUInt -> S . TInteger <$> genUniformRM (0 , fromIntegral n - 1 )
316
313
_ -> error " Cannot apply lt operator to target"
317
314
(CtlOp. Lt , _) -> error $ " Invalid controller for .lt operator: " <> show controller
318
- (CtlOp. Size , CTree. Literal (Value (VUInt n) _)) -> case tt of
315
+ (CtlOp. Size , CTree. Literal (Value (VUInt n) _)) -> case target of
319
316
CTree. Postlude PTText -> S . TString <$> genText (fromIntegral n)
320
317
CTree. Postlude PTBytes -> S . TBytes <$> genBytes (fromIntegral n)
321
318
CTree. Postlude PTUInt -> S . TInteger <$> genUniformRM (0 , 2 ^ n - 1 )
322
319
_ -> error " Cannot apply size operator to target "
323
320
(CtlOp. Size , CTree. Range {CTree. from, CTree. to}) -> do
324
- f <- resolveIfRef from
325
- t <- resolveIfRef to
326
- case (f, t) of
327
- (CTree. Literal (Value (VUInt f1) _), CTree. Literal (Value (VUInt t1) _)) -> case tt of
321
+ case (from, to) of
322
+ (CTree. Literal (Value (VUInt f1) _), CTree. Literal (Value (VUInt t1) _)) -> case target of
328
323
CTree. Postlude PTText ->
329
324
genUniformRM (fromIntegral f1, fromIntegral t1)
330
325
>>= (fmap (S . TString ) . genText)
@@ -334,7 +329,7 @@ genForCTree (CTree.Control op target controller) = do
334
329
CTree. Postlude PTUInt ->
335
330
S . TInteger
336
331
<$> genUniformRM (fromIntegral f1, fromIntegral t1)
337
- _ -> error $ " Cannot apply size operator to target: " <> show tt
332
+ _ -> error $ " Cannot apply size operator to target: " <> show target
338
333
_ ->
339
334
error $
340
335
" Invalid controller for .size operator: "
@@ -344,39 +339,38 @@ genForCTree (CTree.Control op target controller) = do
344
339
" Invalid controller for .size operator: "
345
340
<> show controller
346
341
(CtlOp. Cbor , _) -> do
347
- enc <- genForCTree ct
342
+ enc <- genForCTree controller
348
343
case enc of
349
344
S x -> pure . S . TBytes . CBOR. toStrictByteString $ CBOR. encodeTerm x
350
345
_ -> error " Controller does not correspond to a single term"
351
- _ -> genForNode target
352
- genForCTree (CTree. Enum node) = do
353
- tree <- resolveIfRef node
346
+ _ -> genForCTree target
347
+ genForCTree (CTree. Enum tree) = do
354
348
case tree of
355
- CTree. Group nodes -> do
356
- ix <- genUniformRM (0 , length nodes )
357
- genForNode $ nodes !! ix
349
+ CTree. Group trees -> do
350
+ ix <- genUniformRM (0 , length trees )
351
+ genForCTree $ trees !! ix
358
352
_ -> error " Attempt to form an enum from something other than a group"
359
- genForCTree (CTree. Unwrap node) = genForCTree =<< resolveIfRef node
353
+ genForCTree (CTree. Unwrap node) = genForCTree node
360
354
genForCTree (CTree. Tag tag node) = do
361
- enc <- genForNode node
355
+ enc <- genForCTree node
362
356
case enc of
363
357
S x -> pure $ S $ TTagged tag x
364
358
_ -> error " Tag controller does not correspond to a single term"
359
+ genForCTree (CTree. CTreeE x) = genForNode x
365
360
366
- genForNode :: RandomGen g => CTree. Node MonoRef -> M g WrappedTerm
367
- genForNode = genForCTree <=< resolveIfRef
361
+ genForNode :: RandomGen g => CTree. Node MonoReferenced -> M g WrappedTerm
362
+ genForNode = genForCTree <=< resolveRef
368
363
369
364
-- | Take something which might be a reference and resolve it to the relevant
370
365
-- Tree, following multiple links if necessary.
371
- resolveIfRef :: RandomGen g => CTree. Node MonoRef -> M g (CTree MonoRef )
372
- resolveIfRef (MIt a) = pure a
373
- resolveIfRef (MRuleRef n) = do
366
+ resolveRef :: RandomGen g => CTree. Node MonoReferenced -> M g (CTree MonoReferenced )
367
+ resolveRef (MRuleRef n) = do
374
368
(CTreeRoot cddl) <- ask @ " cddl"
375
369
-- Since we follow a reference, we increase the 'depth' of the gen monad.
376
370
modify @ " depth" (+ 1 )
377
371
case Map. lookup n cddl of
378
372
Nothing -> error $ " Unbound reference: " <> show n
379
- Just val -> resolveIfRef $ runIdentity val
373
+ Just val -> pure val
380
374
381
375
-- | Generate a CBOR Term corresponding to a top-level name.
382
376
--
@@ -392,7 +386,7 @@ genForName n = do
392
386
case Map. lookup n cddl of
393
387
Nothing -> error $ " Unbound reference: " <> show n
394
388
Just val ->
395
- genForNode (runIdentity val) >>= \ case
389
+ genForCTree val >>= \ case
396
390
S x -> pure x
397
391
_ ->
398
392
error $
@@ -440,13 +434,13 @@ genValueVariant (VBool b) = pure $ TBool b
440
434
-- Generator functions
441
435
--------------------------------------------------------------------------------
442
436
443
- generateCBORTerm :: RandomGen g => CTreeRoot' Identity MonoRef -> Name -> g -> Term
437
+ generateCBORTerm :: RandomGen g => CTreeRoot MonoReferenced -> Name -> g -> Term
444
438
generateCBORTerm cddl n stdGen =
445
439
let genEnv = GenEnv {cddl}
446
440
genState = GenState {randomSeed = stdGen, depth = 1 }
447
441
in evalGen (genForName n) genEnv genState
448
442
449
- generateCBORTerm' :: RandomGen g => CTreeRoot' Identity MonoRef -> Name -> g -> (Term , g )
443
+ generateCBORTerm' :: RandomGen g => CTreeRoot MonoReferenced -> Name -> g -> (Term , g )
450
444
generateCBORTerm' cddl n stdGen =
451
445
let genEnv = GenEnv {cddl}
452
446
genState = GenState {randomSeed = stdGen, depth = 1 }
0 commit comments