@@ -34,6 +34,7 @@ import Control.Monad (replicateM, (<=<))
34
34
import Control.Monad.Reader (Reader , runReader )
35
35
import Control.Monad.State.Strict (StateT , runStateT )
36
36
import Data.ByteString (ByteString )
37
+ import Data.ByteString.Base16 qualified as Base16
37
38
import Data.Functor ((<&>) )
38
39
import Data.Functor.Identity (Identity (runIdentity ))
39
40
import Data.List.NonEmpty qualified as NE
@@ -48,13 +49,11 @@ import System.Random.Stateful
48
49
RandomGen (genShortByteString , genWord32 , genWord64 ),
49
50
RandomGenM ,
50
51
StatefulGen (.. ),
51
- StdGen ,
52
52
UniformRange (uniformRM ),
53
53
applyRandomGenM ,
54
54
randomM ,
55
55
uniformByteStringM ,
56
56
)
57
- import qualified Data.ByteString.Base16 as Base16
58
57
59
58
--------------------------------------------------------------------------------
60
59
-- Generator infrastructure
@@ -110,8 +109,6 @@ instance (RandomGen g) => StatefulGen (CapGenM g) (M g) where
110
109
instance (RandomGen r ) => RandomGenM (CapGenM r ) r (M r ) where
111
110
applyRandomGenM f _ = state @ " randomSeed" f
112
111
113
- type Gen = M StdGen
114
-
115
112
runGen :: M g a -> GenEnv g -> GenState g -> (a , GenState g )
116
113
runGen (M m) env st = runReader (runStateT m st) env
117
114
@@ -141,21 +138,21 @@ genText n = pure $ T.pack $ take n ['a' ..]
141
138
-- Combinators
142
139
--------------------------------------------------------------------------------
143
140
144
- choose :: [a ] -> Gen a
141
+ choose :: ( RandomGen g ) => [a ] -> M g a
145
142
choose xs = genUniformRM (0 , length xs) >>= \ i -> pure $ xs !! i
146
143
147
- oneOf :: [ Gen a ] -> Gen a
144
+ oneOf :: ( RandomGen g ) => [ M g a ] -> M g a
148
145
oneOf xs = genUniformRM (0 , length xs) >>= \ i -> xs !! i
149
146
150
- oneOfGenerated :: Gen [a ] -> Gen a
147
+ oneOfGenerated :: ( RandomGen g ) => M g [a ] -> M g a
151
148
oneOfGenerated genXs = genXs >>= choose
152
149
153
150
--------------------------------------------------------------------------------
154
151
-- Postlude
155
152
--------------------------------------------------------------------------------
156
153
157
154
-- | Primitive types defined by the CDDL specification, with their generators
158
- genPostlude :: PTerm -> Gen Term
155
+ genPostlude :: ( RandomGen g ) => PTerm -> M g Term
159
156
genPostlude pt = case pt of
160
157
PTBool ->
161
158
genRandomM
@@ -233,7 +230,7 @@ pattern G xs = GroupTerm xs
233
230
-- Generator functions
234
231
--------------------------------------------------------------------------------
235
232
236
- genForCTree :: CTree MonoRef -> Gen WrappedTerm
233
+ genForCTree :: ( RandomGen g ) => CTree MonoRef -> M g WrappedTerm
237
234
genForCTree (CTree. Literal v) = S <$> genValue v
238
235
genForCTree (CTree. Postlude pt) = S <$> genPostlude pt
239
236
genForCTree (CTree. Map nodes) = do
@@ -322,12 +319,12 @@ genForCTree (CTree.Enum node) = do
322
319
_ -> error " Attempt to form an enum from something other than a group"
323
320
genForCTree (CTree. Unwrap node) = genForCTree =<< resolveIfRef node
324
321
325
- genForNode :: CTree. Node MonoRef -> Gen WrappedTerm
322
+ genForNode :: ( RandomGen g ) => CTree. Node MonoRef -> M g WrappedTerm
326
323
genForNode = genForCTree <=< resolveIfRef
327
324
328
325
-- | Take something which might be a reference and resolve it to the relevant
329
326
-- Tree, following multiple links if necessary.
330
- resolveIfRef :: CTree. Node MonoRef -> Gen (CTree MonoRef )
327
+ resolveIfRef :: ( RandomGen g ) => CTree. Node MonoRef -> M g (CTree MonoRef )
331
328
resolveIfRef (MIt a) = pure a
332
329
resolveIfRef (MRuleRef n) = do
333
330
(CTreeRoot cddl) <- ask @ " cddl"
@@ -343,7 +340,7 @@ resolveIfRef (MRuleRef n) = do
343
340
-- This will throw an error if the generated item does not correspond to a
344
341
-- single CBOR term (e.g. if the name resolves to a group, which cannot be
345
342
-- generated outside a context).
346
- genForName :: Name -> Gen Term
343
+ genForName :: ( RandomGen g ) => Name -> M g Term
347
344
genForName n = do
348
345
(CTreeRoot cddl) <- ask @ " cddl"
349
346
case Map. lookup n cddl of
@@ -359,9 +356,10 @@ genForName n = do
359
356
360
357
-- | Apply an occurence indicator to a group entry
361
358
applyOccurenceIndicator ::
359
+ (RandomGen g ) =>
362
360
OccurrenceIndicator ->
363
- Gen WrappedTerm ->
364
- Gen WrappedTerm
361
+ M g WrappedTerm ->
362
+ M g WrappedTerm
365
363
applyOccurenceIndicator OIOptional oldGen =
366
364
genRandomM >>= \ case
367
365
False -> pure $ G mempty
@@ -376,23 +374,23 @@ applyOccurenceIndicator (OIBounded mlb mub) oldGen =
376
374
genUniformRM (fromMaybe 0 mlb :: Word64 , fromMaybe 10 mub )
377
375
>>= \ i -> G <$> replicateM (fromIntegral i) oldGen
378
376
379
- genValue :: Value -> Gen Term
377
+ genValue :: ( RandomGen g ) => Value -> M g Term
380
378
genValue (VUInt i) = pure . TInt $ fromIntegral i
381
379
genValue (VNInt i) = pure . TInt $ fromIntegral (- i)
382
380
genValue (VBignum i) = pure $ TInteger i
383
381
genValue (VFloat16 i) = pure . THalf $ i
384
382
genValue (VFloat32 i) = pure . TFloat $ i
385
383
genValue (VFloat64 i) = pure . TDouble $ i
386
384
genValue (VText t) = pure $ TString t
387
- genValue (VBytes b) = case Base16. decode b of
385
+ genValue (VBytes b) = case Base16. decode b of
388
386
Right bHex -> pure $ TBytes bHex
389
387
Left err -> error $ " Unable to parse hex encoded bytestring: " <> err
390
388
391
389
--------------------------------------------------------------------------------
392
390
-- Generator functions
393
391
--------------------------------------------------------------------------------
394
392
395
- generateCBORTerm :: CTreeRoot' Identity MonoRef -> Name -> StdGen -> Term
393
+ generateCBORTerm :: ( RandomGen g ) => CTreeRoot' Identity MonoRef -> Name -> g -> Term
396
394
generateCBORTerm cddl n stdGen =
397
395
let genEnv = GenEnv {cddl, fakeSeed = CapGenM }
398
396
genState = GenState {randomSeed = stdGen}
0 commit comments