@@ -25,7 +25,17 @@ 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 (
29
+ CTree ,
30
+ CTreeRoot' (.. ),
31
+ WrappedTerm ,
32
+ flattenWrappedList ,
33
+ pairTermList ,
34
+ singleTermList ,
35
+ pattern G ,
36
+ pattern P ,
37
+ pattern S ,
38
+ )
29
39
import Codec.CBOR.Cuddle.CDDL.CTree qualified as CTree
30
40
import Codec.CBOR.Cuddle.CDDL.CtlOp qualified as CtlOp
31
41
import Codec.CBOR.Cuddle.CDDL.Postlude (PTerm (.. ))
@@ -53,6 +63,7 @@ import System.Random.Stateful (
53
63
Random ,
54
64
RandomGen (.. ),
55
65
StateGenM (.. ),
66
+ StatefulGen (.. ),
56
67
UniformRange (uniformRM ),
57
68
randomM ,
58
69
uniformByteStringM ,
@@ -207,53 +218,11 @@ genPostlude pt = case pt of
207
218
PTNil -> pure TNull
208
219
PTUndefined -> pure $ TSimple 23
209
220
210
- --------------------------------------------------------------------------------
211
- -- Kinds of terms
212
- --------------------------------------------------------------------------------
213
-
214
- data WrappedTerm
215
- = SingleTerm Term
216
- | PairTerm Term Term
217
- | GroupTerm [WrappedTerm ]
218
- deriving (Eq , Show )
219
-
220
- -- | Recursively flatten wrapped list. That is, expand any groups out to their
221
- -- individual entries.
222
- flattenWrappedList :: [WrappedTerm ] -> [WrappedTerm ]
223
- flattenWrappedList [] = []
224
- flattenWrappedList (GroupTerm xxs : xs) =
225
- flattenWrappedList xxs <> flattenWrappedList xs
226
- flattenWrappedList (y : xs) = y : flattenWrappedList xs
227
-
228
- pattern S :: Term -> WrappedTerm
229
- pattern S t = SingleTerm t
230
-
231
- -- | Convert a list of wrapped terms to a list of terms. If any 'PairTerm's are
232
- -- present, we just take their "value" part.
233
- singleTermList :: [WrappedTerm ] -> Maybe [Term ]
234
- singleTermList [] = Just []
235
- singleTermList (S x : xs) = (x : ) <$> singleTermList xs
236
- singleTermList (P _ y : xs) = (y : ) <$> singleTermList xs
237
- singleTermList _ = Nothing
238
-
239
- pattern P :: Term -> Term -> WrappedTerm
240
- pattern P t1 t2 = PairTerm t1 t2
241
-
242
- -- | Convert a list of wrapped terms to a list of pairs of terms, or fail if any
243
- -- 'SingleTerm's are present.
244
- pairTermList :: [WrappedTerm ] -> Maybe [(Term , Term )]
245
- pairTermList [] = Just []
246
- pairTermList (P x y : xs) = ((x, y) : ) <$> pairTermList xs
247
- pairTermList _ = Nothing
248
-
249
- pattern G :: [WrappedTerm ] -> WrappedTerm
250
- pattern G xs = GroupTerm xs
251
-
252
221
--------------------------------------------------------------------------------
253
222
-- Generator functions
254
223
--------------------------------------------------------------------------------
255
224
256
- genForCTree :: RandomGen g => CTree MonoRef -> M g WrappedTerm
225
+ genForCTree :: forall g . RandomGen g => CTree MonoRef -> M g WrappedTerm
257
226
genForCTree (CTree. Literal v) = S <$> genValue v
258
227
genForCTree (CTree. Postlude pt) = S <$> genPostlude pt
259
228
genForCTree (CTree. Map nodes) = do
@@ -362,6 +331,7 @@ genForCTree (CTree.Tag tag node) = do
362
331
case enc of
363
332
S x -> pure $ S $ TTagged tag x
364
333
_ -> error " Tag controller does not correspond to a single term"
334
+ genForCTree (CTree. WithGen gen _) = gen StateGenM
365
335
366
336
genForNode :: RandomGen g => CTree. Node MonoRef -> M g WrappedTerm
367
337
genForNode = genForCTree <=< resolveIfRef
@@ -446,7 +416,8 @@ generateCBORTerm cddl n stdGen =
446
416
genState = GenState {randomSeed = stdGen, depth = 1 }
447
417
in evalGen (genForName n) genEnv genState
448
418
449
- generateCBORTerm' :: RandomGen g => CTreeRoot' Identity MonoRef -> Name -> g -> (Term , g )
419
+ generateCBORTerm' ::
420
+ (RandomGen g , StatefulGen g (M g )) => CTreeRoot' Identity MonoRef -> Name -> g -> (Term , g )
450
421
generateCBORTerm' cddl n stdGen =
451
422
let genEnv = GenEnv {cddl}
452
423
genState = GenState {randomSeed = stdGen, depth = 1 }
0 commit comments