@@ -25,7 +25,17 @@ import Codec.CBOR.Cuddle.CDDL (
2525 Value (.. ),
2626 ValueVariant (.. ),
2727 )
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+ )
2939import Codec.CBOR.Cuddle.CDDL.CTree qualified as CTree
3040import Codec.CBOR.Cuddle.CDDL.CtlOp qualified as CtlOp
3141import Codec.CBOR.Cuddle.CDDL.Postlude (PTerm (.. ))
@@ -53,6 +63,7 @@ import System.Random.Stateful (
5363 Random ,
5464 RandomGen (.. ),
5565 StateGenM (.. ),
66+ StatefulGen (.. ),
5667 UniformRange (uniformRM ),
5768 randomM ,
5869 uniformByteStringM ,
@@ -207,53 +218,11 @@ genPostlude pt = case pt of
207218 PTNil -> pure TNull
208219 PTUndefined -> pure $ TSimple 23
209220
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-
252221--------------------------------------------------------------------------------
253222-- Generator functions
254223--------------------------------------------------------------------------------
255224
256- genForCTree :: RandomGen g => CTree MonoRef -> M g WrappedTerm
225+ genForCTree :: forall g . RandomGen g => CTree MonoRef -> M g WrappedTerm
257226genForCTree (CTree. Literal v) = S <$> genValue v
258227genForCTree (CTree. Postlude pt) = S <$> genPostlude pt
259228genForCTree (CTree. Map nodes) = do
@@ -362,6 +331,7 @@ genForCTree (CTree.Tag tag node) = do
362331 case enc of
363332 S x -> pure $ S $ TTagged tag x
364333 _ -> error " Tag controller does not correspond to a single term"
334+ genForCTree (CTree. WithGen gen _) = gen StateGenM
365335
366336genForNode :: RandomGen g => CTree. Node MonoRef -> M g WrappedTerm
367337genForNode = genForCTree <=< resolveIfRef
@@ -446,7 +416,8 @@ generateCBORTerm cddl n stdGen =
446416 genState = GenState {randomSeed = stdGen, depth = 1 }
447417 in evalGen (genForName n) genEnv genState
448418
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 )
450421generateCBORTerm' cddl n stdGen =
451422 let genEnv = GenEnv {cddl}
452423 genState = GenState {randomSeed = stdGen, depth = 1 }
0 commit comments