6
6
{-# LANGUAGE LambdaCase #-}
7
7
{-# LANGUAGE OverloadedStrings #-}
8
8
{-# LANGUAGE PatternSynonyms #-}
9
+ {-# LANGUAGE ScopedTypeVariables #-}
10
+ {-# LANGUAGE TypeApplications #-}
9
11
{-# LANGUAGE TypeFamilies #-}
10
12
{-# LANGUAGE ViewPatterns #-}
11
13
@@ -70,10 +72,8 @@ import System.Random.Stateful (
70
72
--------------------------------------------------------------------------------
71
73
72
74
-- | Generator context, parametrised over the type of the random seed
73
- data GenEnv g = GenEnv
75
+ newtype GenEnv = GenEnv
74
76
{ cddl :: CTreeRoot' Identity MonoRef
75
- , fakeSeed :: CapGenM g
76
- -- ^ Access the "fake" seed, necessary to recursively call generators
77
77
}
78
78
deriving (Generic )
79
79
@@ -88,34 +88,28 @@ data GenState g = GenState
88
88
}
89
89
deriving (Generic )
90
90
91
- newtype M g a = M { runM :: StateT (GenState g ) (Reader ( GenEnv g ) ) a }
91
+ newtype M g a = M { runM :: StateT (GenState g ) (Reader GenEnv ) a }
92
92
deriving (Functor , Applicative , Monad )
93
93
deriving
94
94
(HasSource " randomSeed" g , HasSink " randomSeed" g , HasState " randomSeed" g )
95
95
via Field
96
96
" randomSeed"
97
97
()
98
- (MonadState (StateT (GenState g ) (Reader ( GenEnv g ) )))
98
+ (MonadState (StateT (GenState g ) (Reader GenEnv )))
99
99
deriving
100
100
(HasSource " depth" Int , HasSink " depth" Int , HasState " depth" Int )
101
101
via Field
102
102
" depth"
103
103
()
104
- (MonadState (StateT (GenState g ) (Reader ( GenEnv g ) )))
104
+ (MonadState (StateT (GenState g ) (Reader GenEnv )))
105
105
deriving
106
106
( HasSource " cddl" (CTreeRoot' Identity MonoRef )
107
107
, HasReader " cddl" (CTreeRoot' Identity MonoRef )
108
108
)
109
109
via Field
110
110
" cddl"
111
111
()
112
- (Lift (StateT (GenState g ) (MonadReader (Reader (GenEnv g )))))
113
- deriving
114
- (HasSource " fakeSeed" (CapGenM g ), HasReader " fakeSeed" (CapGenM g ))
115
- via Field
116
- " fakeSeed"
117
- ()
118
- (Lift (StateT (GenState g ) (MonadReader (Reader (GenEnv g )))))
112
+ (Lift (StateT (GenState g ) (MonadReader (Reader GenEnv ))))
119
113
120
114
-- | Opaque type carrying the type of a pure PRNG inside a capability-style
121
115
-- state monad.
@@ -143,21 +137,18 @@ instance RandomGen r => RandomGenM (CapGenM r) r (M r) where
143
137
applyRandomGenM f _ = state @ " randomSeed" f
144
138
#endif
145
139
146
- runGen :: M g a -> GenEnv g -> GenState g -> (a , GenState g )
140
+ runGen :: M g a -> GenEnv -> GenState g -> (a , GenState g )
147
141
runGen m env st = runReader (runStateT (runM m) st) env
148
142
149
- evalGen :: M g a -> GenEnv g -> GenState g -> a
143
+ evalGen :: M g a -> GenEnv -> GenState g -> a
150
144
evalGen m env = fst . runGen m env
151
145
152
- asksM :: forall tag r m a . HasReader tag r m => (r -> m a ) -> m a
153
- asksM f = f =<< ask @ tag
154
-
155
146
--------------------------------------------------------------------------------
156
147
-- Wrappers around some Random function in Gen
157
148
--------------------------------------------------------------------------------
158
149
159
150
genUniformRM :: forall a g . (UniformRange a , RandomGen g ) => (a , a ) -> M g a
160
- genUniformRM = asksM @ " fakeSeed " . uniformRM
151
+ genUniformRM r = uniformRM r ( CapGenM @ g )
161
152
162
153
-- | Generate a random number in a given range, biased increasingly towards the
163
154
-- lower end as the depth parameter increases.
@@ -167,9 +158,8 @@ genDepthBiasedRM ::
167
158
(a , a ) ->
168
159
M g a
169
160
genDepthBiasedRM bounds = do
170
- fs <- ask @ " fakeSeed"
171
161
d <- get @ " depth"
172
- samples <- replicateM d (uniformRM bounds fs )
162
+ samples <- replicateM d (genUniformRM bounds)
173
163
pure $ minimum samples
174
164
175
165
-- | Generates a bool, increasingly likely to be 'False' as the depth increases.
@@ -179,10 +169,10 @@ genDepthBiasedBool = do
179
169
and <$> replicateM d genRandomM
180
170
181
171
genRandomM :: forall g a . (Random a , RandomGen g ) => M g a
182
- genRandomM = asksM @ " fakeSeed " randomM
172
+ genRandomM = randomM ( CapGenM @ g )
183
173
184
174
genBytes :: forall g . RandomGen g => Int -> M g ByteString
185
- genBytes n = asksM @ " fakeSeed " $ uniformByteStringM n
175
+ genBytes n = uniformByteStringM n ( CapGenM @ g )
186
176
187
177
genText :: forall g . RandomGen g => Int -> M g Text
188
178
genText n = pure $ T. pack . take n . join $ repeat [' a' .. ' z' ]
@@ -460,12 +450,12 @@ genValueVariant (VBool b) = pure $ TBool b
460
450
461
451
generateCBORTerm :: RandomGen g => CTreeRoot' Identity MonoRef -> Name -> g -> Term
462
452
generateCBORTerm cddl n stdGen =
463
- let genEnv = GenEnv {cddl, fakeSeed = CapGenM }
453
+ let genEnv = GenEnv {cddl}
464
454
genState = GenState {randomSeed = stdGen, depth = 1 }
465
455
in evalGen (genForName n) genEnv genState
466
456
467
457
generateCBORTerm' :: RandomGen g => CTreeRoot' Identity MonoRef -> Name -> g -> (Term , g )
468
458
generateCBORTerm' cddl n stdGen =
469
- let genEnv = GenEnv {cddl, fakeSeed = CapGenM }
459
+ let genEnv = GenEnv {cddl}
470
460
genState = GenState {randomSeed = stdGen, depth = 1 }
471
461
in second randomSeed $ runGen (genForName n) genEnv genState
0 commit comments