Skip to content

Commit 7987a01

Browse files
committed
WIP
1 parent bd62c1f commit 7987a01

File tree

3 files changed

+108
-76
lines changed

3 files changed

+108
-76
lines changed

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

Lines changed: 7 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ import Codec.CBOR.Cuddle.CDDL (
2424
OccurrenceIndicator (..),
2525
Value (..),
2626
ValueVariant (..),
27+
WrappedTerm,
28+
flattenWrappedList,
29+
pairTermList,
30+
singleTermList,
31+
pattern G,
32+
pattern P,
33+
pattern S,
2734
)
2835
import Codec.CBOR.Cuddle.CDDL.CTree (CTree, CTreeRoot' (..))
2936
import Codec.CBOR.Cuddle.CDDL.CTree qualified as CTree
@@ -207,48 +214,6 @@ genPostlude pt = case pt of
207214
PTNil -> pure TNull
208215
PTUndefined -> pure $ TSimple 23
209216

210-
--------------------------------------------------------------------------------
211-
-- Kinds of terms
212-
--------------------------------------------------------------------------------
213-
214-
data WrappedTerm
215-
= SingleTerm Term
216-
| PairTerm Term Term
217-
| GroupTerm [WrappedTerm]
218-
deriving (Eq, Show)
219-
220-
-- | Recursively flatten wrapped list. That is, expand any groups out to their
221-
-- individual entries.
222-
flattenWrappedList :: [WrappedTerm] -> [WrappedTerm]
223-
flattenWrappedList [] = []
224-
flattenWrappedList (GroupTerm xxs : xs) =
225-
flattenWrappedList xxs <> flattenWrappedList xs
226-
flattenWrappedList (y : xs) = y : flattenWrappedList xs
227-
228-
pattern S :: Term -> WrappedTerm
229-
pattern S t = SingleTerm t
230-
231-
-- | Convert a list of wrapped terms to a list of terms. If any 'PairTerm's are
232-
-- present, we just take their "value" part.
233-
singleTermList :: [WrappedTerm] -> Maybe [Term]
234-
singleTermList [] = Just []
235-
singleTermList (S x : xs) = (x :) <$> singleTermList xs
236-
singleTermList (P _ y : xs) = (y :) <$> singleTermList xs
237-
singleTermList _ = Nothing
238-
239-
pattern P :: Term -> Term -> WrappedTerm
240-
pattern P t1 t2 = PairTerm t1 t2
241-
242-
-- | Convert a list of wrapped terms to a list of pairs of terms, or fail if any
243-
-- 'SingleTerm's are present.
244-
pairTermList :: [WrappedTerm] -> Maybe [(Term, Term)]
245-
pairTermList [] = Just []
246-
pairTermList (P x y : xs) = ((x, y) :) <$> pairTermList xs
247-
pairTermList _ = Nothing
248-
249-
pattern G :: [WrappedTerm] -> WrappedTerm
250-
pattern G xs = GroupTerm xs
251-
252217
--------------------------------------------------------------------------------
253218
-- Generator functions
254219
--------------------------------------------------------------------------------

src/Codec/CBOR/Cuddle/CDDL.hs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
{-# LANGUAGE DeriveAnyClass #-}
33
{-# LANGUAGE DerivingStrategies #-}
44
{-# LANGUAGE OverloadedLabels #-}
5+
{-# LANGUAGE PatternSynonyms #-}
56
{-# LANGUAGE TypeFamilies #-}
67
{-# LANGUAGE UndecidableInstances #-}
78

@@ -37,10 +38,19 @@ module Codec.CBOR.Cuddle.CDDL (
3738
GrpChoice (..),
3839
unwrap,
3940
compareRuleName,
41+
flattenWrappedList,
42+
singleTermList,
43+
pairTermList,
44+
CBORGenerator (..),
45+
WrappedTerm (..),
46+
pattern G,
47+
pattern P,
48+
pattern S,
4049
) where
4150

4251
import Codec.CBOR.Cuddle.CDDL.CtlOp (CtlOp)
4352
import Codec.CBOR.Cuddle.Comments (CollectComments (..), Comment, HasComment (..))
53+
import Codec.CBOR.Term (Term)
4454
import Data.ByteString qualified as B
4555
import Data.Default.Class (Default (..))
4656
import Data.Function (on, (&))
@@ -55,6 +65,52 @@ import GHC.Generics (Generic)
5565
import Optics.Core ((%), (.~))
5666
import Optics.Getter (view)
5767
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)
58114

59115
-- | The CDDL constructor takes three arguments:
60116
-- 1. Top level comments that precede the first definition

0 commit comments

Comments
 (0)