Skip to content

Commit 386bd52

Browse files
committed
[ label ] Simplify labels management + add a simple printer of labels
1 parent 8565949 commit 386bd52

File tree

11 files changed

+201
-10
lines changed

11 files changed

+201
-10
lines changed

src/Test/DepTyCheck/Gen.idr

+5-5
Original file line numberDiff line numberDiff line change
@@ -308,14 +308,14 @@ mkOneOf {em=MaybeEmpty} xs =
308308
--- Non-empty generators ---
309309

310310
export
311-
unGen1 : MonadRandom m => CanManageLabels m => Gen1 a -> m a
311+
unGen1 : MonadRandom m => (labels : CanManageLabels m) => Gen1 a -> m a
312312
unGen1 $ Pure x = pure x
313313
unGen1 $ Raw sf = sf.unRawGen
314314
unGen1 $ OneOf @{_} @{nw} oo with 0 (nonEmptyIsMaximal nw)
315315
_ | Refl = assert_total unGen1 . force . pickWeighted oo.unGenAlts . finToNat =<< randomFin oo.totalWeight
316316
unGen1 $ Bind @{nw} x f with 0 (nonEmptyIsMaximal nw)
317317
_ | Refl = x.unRawGen >>= unGen1 . f
318-
unGen1 $ Labelled l x = manageLabel l $ unGen1 x
318+
unGen1 $ Labelled l x = manageLabel l >> unGen1 x
319319

320320
export
321321
unGenAll' : RandomGen g => (seed : g) -> Gen1 a -> Stream (g, a)
@@ -335,16 +335,16 @@ pick1 gen = initSeed <&> \s => evalRandom s $ unGen1 gen
335335
--- Possibly empty generators ---
336336

337337
export
338-
unGen : MonadRandom m => MonadError () m => CanManageLabels m => Gen em a -> m a
338+
unGen : MonadRandom m => MonadError () m => (labels : CanManageLabels m) => Gen em a -> m a
339339
unGen $ Empty = throwError ()
340340
unGen $ Pure x = pure x
341341
unGen $ Raw sf = sf.unRawGen
342342
unGen $ OneOf oo = assert_total unGen . force . pickWeighted oo.unGenAlts . finToNat =<< randomFin oo.totalWeight
343343
unGen $ Bind x f = x.unRawGen >>= unGen . f
344-
unGen $ Labelled l x = manageLabel l $ unGen x
344+
unGen $ Labelled l x = manageLabel l >> unGen x
345345

346346
export %inline
347-
unGen' : MonadRandom m => CanManageLabels m => Gen em a -> m $ Maybe a
347+
unGen' : MonadRandom m => (labels : CanManageLabels m) => Gen em a -> m $ Maybe a
348348
unGen' = runMaybeT . unGen {m=MaybeT m}
349349

350350
export

src/Test/DepTyCheck/Gen/Coverage.idr

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ Monoid ModelCoverage where
3838
neutral = MkModelCoverage empty
3939

4040
MonadWriter ModelCoverage m => CanManageLabels m where
41-
manageLabel l x = tell (MkModelCoverage $ singleton l 1) >> x
41+
manageLabel l = tell $ MkModelCoverage $ singleton l 1
4242

4343
export
4444
unGenD : MonadRandom m => MonadError () m => Gen em a -> m (ModelCoverage, a)

src/Test/DepTyCheck/Gen/Labels.idr

+19-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
module Test.DepTyCheck.Gen.Labels
22

3+
import Control.Monad.State.Interface
4+
import public Control.Monad.Trans
5+
6+
import Data.String
7+
38
%default total
49

510
-----------------
@@ -26,12 +31,22 @@ export
2631
Ord Label where
2732
compare = comparing $ \(StringLabel x) => x
2833

34+
--- Labels management interface ---
35+
2936
public export
30-
interface CanManageLabels (0 m : Type -> Type) where
31-
manageLabel : Label -> m a -> m a
37+
interface Monad m => CanManageLabels (0 m : Type -> Type) where
38+
manageLabel : Label -> m ()
39+
40+
public export
41+
CanManageLabels m => MonadTrans t => Monad (t m) => CanManageLabels (t m) where
42+
manageLabel = lift . manageLabel
3243

3344
export %defaulthint
34-
IgnoreLabels : CanManageLabels m
45+
IgnoreLabels : Monad m => CanManageLabels m
3546
IgnoreLabels = I where
3647
[I] CanManageLabels m where
37-
manageLabel _ = id
48+
manageLabel _ = pure ()
49+
50+
export
51+
[PrintAllLabels] HasIO io => CanManageLabels io where
52+
manageLabel = putStrLn . show
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
module PrintCoverage
2+
3+
import Test.DepTyCheck.Gen
4+
import Test.DepTyCheck.Gen.Coverage
5+
6+
import Deriving.DepTyCheck.Gen
7+
import Deriving.Show
8+
9+
import Control.Monad.Maybe
10+
import Control.Monad.Random
11+
import System.Random.Pure.StdGen
12+
13+
%default total
14+
15+
%language ElabReflection
16+
17+
data X = X2 Nat | X3 String
18+
19+
genX : Fuel -> Gen MaybeEmpty X
20+
genX fl = withCoverage $ oneOf
21+
[ [| X2 $ elements [0 .. 9] |]
22+
, [| X3 $ elements ["", "a", "bc"] |]
23+
]
24+
25+
data Y : Nat -> Type where
26+
Y1 : Y 0
27+
Y2 : X -> Y 1
28+
Y3 : X -> X -> Y n
29+
30+
genY : Fuel -> (n : _) -> Gen MaybeEmpty $ Y n
31+
genY fl n = withCoverage $ oneOf [ [| Y3 (genX fl) (genX fl) |], add n ] where
32+
add : (n : _) -> Gen MaybeEmpty $ Y n
33+
add 0 = [| Y1 |]
34+
add 1 = [| Y2 $ genX fl |]
35+
add _ = empty
36+
37+
%hint ShowX : Show X; ShowX = %runElab derive
38+
%hint ShowY : Show (Y n); ShowY = %runElab derive
39+
40+
try : (n : Nat) -> IO ()
41+
try n = do
42+
v : Maybe (Y n) <- runMaybeT {m=IO} $ evalRandomT someStdGen $ evalStateT Z $ unGen {labels = PrintAllLabels} $ genY (limit 5) n
43+
let Just v = v
44+
| Nothing => putStrLn "couldn't produce a value"
45+
putStrLn "value: \{show v}"
46+
47+
main : IO ()
48+
main = do
49+
Lazy.for_ [Z, 1, 3] $ \n => do
50+
putStrLn "--------\n"
51+
try n
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
1/1: Building PrintCoverage (PrintCoverage.idr)
2+
3+
--------
4+
5+
PrintCoverage.Y[?]
6+
PrintCoverage.Y1 (user-defined)
7+
value: Y1
8+
--------
9+
10+
PrintCoverage.Y[?]
11+
PrintCoverage.X[?]
12+
PrintCoverage.X2 (user-defined)
13+
PrintCoverage.Y2 (user-defined)
14+
value: Y2 (X2 4)
15+
--------
16+
17+
PrintCoverage.Y[?]
18+
PrintCoverage.X[?]
19+
PrintCoverage.X[?]
20+
PrintCoverage.X2 (user-defined)
21+
PrintCoverage.X2 (user-defined)
22+
PrintCoverage.Y3 (user-defined)
23+
value: Y3 (X2 4) (X2 8)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
rm -rf build
2+
3+
flock "$1" pack -q install-deps test.ipkg && \
4+
idris2 --no-color --console-width 0 --no-banner --find-ipkg --check PrintCoverage.idr && \
5+
echo && \
6+
pack exec PrintCoverage.idr
7+
8+
rm -rf build
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package a-test
2+
executable = a-test
3+
4+
depends = deptycheck
5+
6+
main = PrintCoverage
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
module PrintCoverage
2+
3+
import Test.DepTyCheck.Gen
4+
import Test.DepTyCheck.Gen.Coverage
5+
6+
import Deriving.DepTyCheck.Gen
7+
import Deriving.Show
8+
9+
import Control.Monad.Maybe
10+
import Control.Monad.Random
11+
import System.Random.Pure.StdGen
12+
13+
%default total
14+
15+
%language ElabReflection
16+
17+
data X = X2 Nat | X3 String
18+
19+
genX : Fuel -> Gen MaybeEmpty X
20+
genX fl = withCoverage $ oneOf
21+
[ [| X2 $ elements [0 .. 9] |]
22+
, [| X3 $ elements ["", "a", "bc"] |]
23+
]
24+
25+
data Y : Nat -> Type where
26+
Y1 : Y 0
27+
Y2 : X -> Y 1
28+
Y3 : X -> X -> Y n
29+
30+
genY : Fuel -> (n : _) -> Gen MaybeEmpty $ Y n
31+
genY fl n = withCoverage $ oneOf [ [| Y3 (genX fl) (genX fl) |], add n ] where
32+
add : (n : _) -> Gen MaybeEmpty $ Y n
33+
add 0 = [| Y1 |]
34+
add 1 = [| Y2 $ genX fl |]
35+
add _ = empty
36+
37+
%hint ShowX : Show X; ShowX = %runElab derive
38+
%hint ShowY : Show (Y n); ShowY = %runElab derive
39+
40+
try : (n : Nat) -> IO ()
41+
try n = do
42+
v : Maybe (Y n) <- evalRandomT someStdGen $ evalStateT Z $ unGen' {labels = PrintAllLabels} $ genY (limit 5) n
43+
let Just v = v
44+
| Nothing => putStrLn "couldn't produce a value"
45+
putStrLn "value: \{show v}"
46+
47+
main : IO ()
48+
main = do
49+
Lazy.for_ [Z, 1, 3] $ \n => do
50+
putStrLn "--------\n"
51+
try n
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
1/1: Building PrintCoverage (PrintCoverage.idr)
2+
3+
--------
4+
5+
PrintCoverage.Y[?]
6+
PrintCoverage.Y1 (user-defined)
7+
value: Y1
8+
--------
9+
10+
PrintCoverage.Y[?]
11+
PrintCoverage.X[?]
12+
PrintCoverage.X2 (user-defined)
13+
PrintCoverage.Y2 (user-defined)
14+
value: Y2 (X2 4)
15+
--------
16+
17+
PrintCoverage.Y[?]
18+
PrintCoverage.X[?]
19+
PrintCoverage.X[?]
20+
PrintCoverage.X2 (user-defined)
21+
PrintCoverage.X2 (user-defined)
22+
PrintCoverage.Y3 (user-defined)
23+
value: Y3 (X2 4) (X2 8)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
rm -rf build
2+
3+
flock "$1" pack -q install-deps test.ipkg && \
4+
idris2 --no-color --console-width 0 --no-banner --find-ipkg --check PrintCoverage.idr && \
5+
echo && \
6+
pack exec PrintCoverage.idr
7+
8+
rm -rf build
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package a-test
2+
executable = a-test
3+
4+
depends = deptycheck
5+
6+
main = PrintCoverage

0 commit comments

Comments
 (0)