2
2
{-# LANGUAGE DeriveAnyClass #-}
3
3
{-# LANGUAGE DerivingStrategies #-}
4
4
{-# LANGUAGE OverloadedLabels #-}
5
+ {-# LANGUAGE PatternSynonyms #-}
5
6
{-# LANGUAGE TypeFamilies #-}
6
7
{-# LANGUAGE UndecidableInstances #-}
7
8
@@ -37,10 +38,19 @@ module Codec.CBOR.Cuddle.CDDL (
37
38
GrpChoice (.. ),
38
39
unwrap ,
39
40
compareRuleName ,
41
+ flattenWrappedList ,
42
+ singleTermList ,
43
+ pairTermList ,
44
+ CBORGenerator (.. ),
45
+ WrappedTerm (.. ),
46
+ pattern G ,
47
+ pattern P ,
48
+ pattern S ,
40
49
) where
41
50
42
51
import Codec.CBOR.Cuddle.CDDL.CtlOp (CtlOp )
43
52
import Codec.CBOR.Cuddle.Comments (CollectComments (.. ), Comment , HasComment (.. ))
53
+ import Codec.CBOR.Term (Term )
44
54
import Data.ByteString qualified as B
45
55
import Data.Default.Class (Default (.. ))
46
56
import Data.Function (on , (&) )
@@ -55,6 +65,52 @@ import GHC.Generics (Generic)
55
65
import Optics.Core ((%) , (.~) )
56
66
import Optics.Getter (view )
57
67
import Optics.Lens (lens )
68
+ import System.Random.Stateful (StatefulGen )
69
+
70
+ --------------------------------------------------------------------------------
71
+ -- Kinds of terms
72
+ --------------------------------------------------------------------------------
73
+
74
+ data WrappedTerm
75
+ = SingleTerm Term
76
+ | PairTerm Term Term
77
+ | GroupTerm [WrappedTerm ]
78
+ deriving (Eq , Show )
79
+
80
+ -- | Recursively flatten wrapped list. That is, expand any groups out to their
81
+ -- individual entries.
82
+ flattenWrappedList :: [WrappedTerm ] -> [WrappedTerm ]
83
+ flattenWrappedList [] = []
84
+ flattenWrappedList (GroupTerm xxs : xs) =
85
+ flattenWrappedList xxs <> flattenWrappedList xs
86
+ flattenWrappedList (y : xs) = y : flattenWrappedList xs
87
+
88
+ pattern S :: Term -> WrappedTerm
89
+ pattern S t = SingleTerm t
90
+
91
+ -- | Convert a list of wrapped terms to a list of terms. If any 'PairTerm's are
92
+ -- present, we just take their "value" part.
93
+ singleTermList :: [WrappedTerm ] -> Maybe [Term ]
94
+ singleTermList [] = Just []
95
+ singleTermList (S x : xs) = (x : ) <$> singleTermList xs
96
+ singleTermList (P _ y : xs) = (y : ) <$> singleTermList xs
97
+ singleTermList _ = Nothing
98
+
99
+ pattern P :: Term -> Term -> WrappedTerm
100
+ pattern P t1 t2 = PairTerm t1 t2
101
+
102
+ -- | Convert a list of wrapped terms to a list of pairs of terms, or fail if any
103
+ -- 'SingleTerm's are present.
104
+ pairTermList :: [WrappedTerm ] -> Maybe [(Term , Term )]
105
+ pairTermList [] = Just []
106
+ pairTermList (P x y : xs) = ((x, y) : ) <$> pairTermList xs
107
+ pairTermList _ = Nothing
108
+
109
+ pattern G :: [WrappedTerm ] -> WrappedTerm
110
+ pattern G xs = GroupTerm xs
111
+
112
+ newtype CBORGenerator
113
+ = CBORGenerator (forall g m . StatefulGen g m => g -> m WrappedTerm )
58
114
59
115
-- | The CDDL constructor takes three arguments:
60
116
-- 1. Top level comments that precede the first definition
0 commit comments