Skip to content

Commit a0b2f87

Browse files
committed
Added withGenerator
1 parent 503019d commit a0b2f87

File tree

7 files changed

+102
-78
lines changed

7 files changed

+102
-78
lines changed

src/Codec/CBOR/Cuddle/CBOR/Gen.hs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,11 @@ import Capability.Sink (HasSink)
2020
import Capability.Source (HasSource, MonadState (..))
2121
import Capability.State (HasState, get, modify)
2222
import Codec.CBOR.Cuddle.CDDL (
23+
CBORGenerator (..),
2324
Name (..),
2425
OccurrenceIndicator (..),
2526
Value (..),
2627
ValueVariant (..),
27-
)
28-
import Codec.CBOR.Cuddle.CDDL.CTree (
29-
CTree,
30-
CTreeRoot' (..),
3128
WrappedTerm,
3229
flattenWrappedList,
3330
pairTermList,
@@ -36,6 +33,10 @@ import Codec.CBOR.Cuddle.CDDL.CTree (
3633
pattern P,
3734
pattern S,
3835
)
36+
import Codec.CBOR.Cuddle.CDDL.CTree (
37+
CTree,
38+
CTreeRoot' (..),
39+
)
3940
import Codec.CBOR.Cuddle.CDDL.CTree qualified as CTree
4041
import Codec.CBOR.Cuddle.CDDL.CtlOp qualified as CtlOp
4142
import Codec.CBOR.Cuddle.CDDL.Postlude (PTerm (..))
@@ -331,7 +332,7 @@ genForCTree (CTree.Tag tag node) = do
331332
case enc of
332333
S x -> pure $ S $ TTagged tag x
333334
_ -> error "Tag controller does not correspond to a single term"
334-
genForCTree (CTree.WithGen gen _) = gen StateGenM
335+
genForCTree (CTree.WithGen (CBORGenerator gen) _) = gen StateGenM
335336

336337
genForNode :: RandomGen g => CTree.Node MonoRef -> M g WrappedTerm
337338
genForNode = genForCTree <=< resolveIfRef

src/Codec/CBOR/Cuddle/CDDL.hs

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
{-# LANGUAGE DeriveAnyClass #-}
22
{-# LANGUAGE DerivingStrategies #-}
3+
{-# LANGUAGE PatternSynonyms #-}
34

45
-- | This module defined the data structure of CDDL as specified in
56
-- https://datatracker.ietf.org/doc/rfc8610/
67
module Codec.CBOR.Cuddle.CDDL (
78
CDDL (..),
9+
CBORGenerator (..),
810
sortCDDL,
911
cddlTopLevel,
1012
cddlRules,
@@ -33,10 +35,18 @@ module Codec.CBOR.Cuddle.CDDL (
3335
GrpChoice (..),
3436
unwrap,
3537
compareRuleName,
38+
WrappedTerm (..),
39+
flattenWrappedList,
40+
singleTermList,
41+
pairTermList,
42+
pattern S,
43+
pattern G,
44+
pattern P,
3645
) where
3746

3847
import Codec.CBOR.Cuddle.CDDL.CtlOp (CtlOp)
3948
import Codec.CBOR.Cuddle.Comments (CollectComments (..), Comment, HasComment (..))
49+
import Codec.CBOR.Term (Term)
4050
import Data.ByteString qualified as B
4151
import Data.Default.Class (Default (..))
4252
import Data.Function (on, (&))
@@ -51,14 +61,60 @@ import GHC.Generics (Generic)
5161
import Optics.Core ((%), (.~))
5262
import Optics.Getter (view)
5363
import Optics.Lens (lens)
64+
import System.Random.Stateful (StatefulGen)
65+
66+
--------------------------------------------------------------------------------
67+
-- Kinds of terms
68+
--------------------------------------------------------------------------------
69+
70+
data WrappedTerm
71+
= SingleTerm Term
72+
| PairTerm Term Term
73+
| GroupTerm [WrappedTerm]
74+
deriving (Eq, Show, Generic)
75+
76+
-- | Recursively flatten wrapped list. That is, expand any groups out to their
77+
-- individual entries.
78+
flattenWrappedList :: [WrappedTerm] -> [WrappedTerm]
79+
flattenWrappedList [] = []
80+
flattenWrappedList (GroupTerm xxs : xs) =
81+
flattenWrappedList xxs <> flattenWrappedList xs
82+
flattenWrappedList (y : xs) = y : flattenWrappedList xs
83+
84+
pattern S :: Term -> WrappedTerm
85+
pattern S t = SingleTerm t
86+
87+
-- | Convert a list of wrapped terms to a list of terms. If any 'PairTerm's are
88+
-- present, we just take their "value" part.
89+
singleTermList :: [WrappedTerm] -> Maybe [Term]
90+
singleTermList [] = Just []
91+
singleTermList (S x : xs) = (x :) <$> singleTermList xs
92+
singleTermList (P _ y : xs) = (y :) <$> singleTermList xs
93+
singleTermList _ = Nothing
94+
95+
pattern P :: Term -> Term -> WrappedTerm
96+
pattern P t1 t2 = PairTerm t1 t2
97+
98+
-- | Convert a list of wrapped terms to a list of pairs of terms, or fail if any
99+
-- 'SingleTerm's are present.
100+
pairTermList :: [WrappedTerm] -> Maybe [(Term, Term)]
101+
pairTermList [] = Just []
102+
pairTermList (P x y : xs) = ((x, y) :) <$> pairTermList xs
103+
pairTermList _ = Nothing
104+
105+
pattern G :: [WrappedTerm] -> WrappedTerm
106+
pattern G xs = GroupTerm xs
107+
108+
newtype CBORGenerator
109+
= CBORGenerator (forall g m. StatefulGen g m => g -> m WrappedTerm)
54110

55111
-- | The CDDL constructor takes three arguments:
56112
-- 1. Top level comments that precede the first definition
57113
-- 2. The root definition
58114
-- 3. All the other top level comments and definitions
59115
-- This ensures that `CDDL` is correct by construction.
60116
data CDDL = CDDL [Comment] Rule [TopLevel]
61-
deriving (Eq, Generic, Show, ToExpr)
117+
deriving (Generic)
62118

63119
-- | Sort the CDDL Rules on the basis of their names
64120
-- Top level comments will be removed!
@@ -92,7 +148,7 @@ instance Semigroup CDDL where
92148
data TopLevel
93149
= TopLevelRule Rule
94150
| TopLevelComment Comment
95-
deriving (Eq, Generic, Show, ToExpr)
151+
deriving (Generic)
96152

97153
-- |
98154
-- A name can consist of any of the characters from the set {"A" to
@@ -209,9 +265,9 @@ data Rule = Rule
209265
, ruleAssign :: Assign
210266
, ruleTerm :: TypeOrGroup
211267
, ruleComment :: Comment
268+
, ruleGenerator :: Maybe CBORGenerator
212269
}
213-
deriving (Eq, Generic, Show)
214-
deriving anyclass (ToExpr)
270+
deriving (Generic)
215271

216272
instance HasComment Rule where
217273
commentL = lens ruleComment (\x y -> x {ruleComment = y})

src/Codec/CBOR/Cuddle/CDDL/CTree.hs

Lines changed: 2 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,65 +1,21 @@
11
{-# LANGUAGE DataKinds #-}
2-
{-# LANGUAGE PatternSynonyms #-}
32

43
module Codec.CBOR.Cuddle.CDDL.CTree where
54

65
import Codec.CBOR.Cuddle.CDDL (
6+
CBORGenerator,
77
Name,
88
OccurrenceIndicator,
99
RangeBound,
1010
Value,
1111
)
1212
import Codec.CBOR.Cuddle.CDDL.CtlOp
1313
import Codec.CBOR.Cuddle.CDDL.Postlude (PTerm)
14-
import Codec.CBOR.Term (Term)
1514
import Data.Hashable (Hashable)
1615
import Data.List.NonEmpty qualified as NE
1716
import Data.Map.Strict qualified as Map
1817
import Data.Word (Word64)
1918
import GHC.Generics (Generic)
20-
import System.Random.Stateful (StatefulGen)
21-
22-
--------------------------------------------------------------------------------
23-
-- Kinds of terms
24-
--------------------------------------------------------------------------------
25-
26-
data WrappedTerm
27-
= SingleTerm Term
28-
| PairTerm Term Term
29-
| GroupTerm [WrappedTerm]
30-
deriving (Eq, Show, Generic)
31-
32-
-- | Recursively flatten wrapped list. That is, expand any groups out to their
33-
-- individual entries.
34-
flattenWrappedList :: [WrappedTerm] -> [WrappedTerm]
35-
flattenWrappedList [] = []
36-
flattenWrappedList (GroupTerm xxs : xs) =
37-
flattenWrappedList xxs <> flattenWrappedList xs
38-
flattenWrappedList (y : xs) = y : flattenWrappedList xs
39-
40-
pattern S :: Term -> WrappedTerm
41-
pattern S t = SingleTerm t
42-
43-
-- | Convert a list of wrapped terms to a list of terms. If any 'PairTerm's are
44-
-- present, we just take their "value" part.
45-
singleTermList :: [WrappedTerm] -> Maybe [Term]
46-
singleTermList [] = Just []
47-
singleTermList (S x : xs) = (x :) <$> singleTermList xs
48-
singleTermList (P _ y : xs) = (y :) <$> singleTermList xs
49-
singleTermList _ = Nothing
50-
51-
pattern P :: Term -> Term -> WrappedTerm
52-
pattern P t1 t2 = PairTerm t1 t2
53-
54-
-- | Convert a list of wrapped terms to a list of pairs of terms, or fail if any
55-
-- 'SingleTerm's are present.
56-
pairTermList :: [WrappedTerm] -> Maybe [(Term, Term)]
57-
pairTermList [] = Just []
58-
pairTermList (P x y : xs) = ((x, y) :) <$> pairTermList xs
59-
pairTermList _ = Nothing
60-
61-
pattern G :: [WrappedTerm] -> WrappedTerm
62-
pattern G xs = GroupTerm xs
6319

6420
--------------------------------------------------------------------------------
6521

@@ -89,7 +45,7 @@ data CTree f
8945
| Enum (Node f)
9046
| Unwrap (Node f)
9147
| Tag Word64 (Node f)
92-
| WithGen (forall g m. StatefulGen g m => g -> m WrappedTerm) (Node f)
48+
| WithGen CBORGenerator (Node f)
9349

9450
-- | Traverse the CTree, carrying out the given operation at each node
9551
traverseCTree :: Monad m => (Node f -> m (Node g)) -> CTree f -> m (CTree g)

src/Codec/CBOR/Cuddle/CDDL/Resolve.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ asMap cddl = foldl' go Map.empty rules
9191
go x (TopLevelRule r) = assignOrExtend x r
9292

9393
assignOrExtend :: CDDLMap -> Rule -> CDDLMap
94-
assignOrExtend m (Rule n gps assign tog _) = case assign of
94+
assignOrExtend m (Rule n gps assign tog _ _) = case assign of
9595
-- Equals assignment
9696
AssignEq -> Map.insert n (toParametrised tog gps) m
9797
AssignExt -> Map.alter (extend tog gps) n m

0 commit comments

Comments
 (0)