1
1
{-# LANGUAGE DataKinds #-}
2
+ {-# LANGUAGE TypeFamilies #-}
2
3
3
4
module Codec.CBOR.Cuddle.CDDL.CTree where
4
5
@@ -10,7 +11,6 @@ import Codec.CBOR.Cuddle.CDDL (
10
11
)
11
12
import Codec.CBOR.Cuddle.CDDL.CtlOp
12
13
import Codec.CBOR.Cuddle.CDDL.Postlude (PTerm )
13
- import Data.Hashable (Hashable )
14
14
import Data.List.NonEmpty qualified as NE
15
15
import Data.Map.Strict qualified as Map
16
16
import Data.Word (Word64 )
@@ -26,66 +26,67 @@ import GHC.Generics (Generic)
26
26
-- to manipulate.
27
27
--------------------------------------------------------------------------------
28
28
29
+ type family CTreeExt i
30
+
31
+ data Parametrisation a = Parametrisation
32
+ { parameters :: [Name ]
33
+ , underlying :: a
34
+ }
35
+ deriving (Generic , Functor )
36
+
37
+ data Parametrised
38
+
39
+ type instance CTreeExt Parametrised = Parametrisation (CTree Parametrised )
40
+
29
41
-- | CDDL Tree, parametrised over a functor
30
42
--
31
43
-- We principally use this functor to represent references - thus, every 'f a'
32
44
-- may be either an a or a reference to another CTree.
33
- data CTree f
45
+ data CTree i
34
46
= Literal Value
35
47
| Postlude PTerm
36
- | Map [Node f ]
37
- | Array [Node f ]
38
- | Choice (NE. NonEmpty (Node f ))
39
- | Group [Node f ]
40
- | KV { key :: Node f , value :: Node f , cut :: Bool }
41
- | Occur { item :: Node f , occurs :: OccurrenceIndicator }
42
- | Range { from :: Node f , to :: Node f , inclusive :: RangeBound }
43
- | Control { op :: CtlOp , target :: Node f , controller :: Node f }
44
- | Enum (Node f )
45
- | Unwrap (Node f )
46
- | Tag Word64 (Node f )
48
+ | Map [CTree i ]
49
+ | Array [CTree i ]
50
+ | Choice (NE. NonEmpty (CTree i ))
51
+ | Group [CTree i ]
52
+ | KV { key :: CTree i , value :: CTree i , cut :: Bool }
53
+ | Occur { item :: CTree i , occurs :: OccurrenceIndicator }
54
+ | Range { from :: CTree i , to :: CTree i , inclusive :: RangeBound }
55
+ | Control { op :: CtlOp , target :: CTree i , controller :: CTree i }
56
+ | Enum (CTree i )
57
+ | Unwrap (CTree i )
58
+ | Tag Word64 (CTree i )
59
+ | CTreeE (CTreeExt i )
47
60
deriving (Generic )
48
61
49
62
-- | Traverse the CTree, carrying out the given operation at each node
50
- traverseCTree :: Monad m => (Node f -> m (Node g )) -> CTree f -> m (CTree g )
51
- traverseCTree _ (Literal a) = pure $ Literal a
52
- traverseCTree _ (Postlude a) = pure $ Postlude a
53
- traverseCTree atNode (Map xs) = Map <$> traverse atNode xs
54
- traverseCTree atNode (Array xs) = Array <$> traverse atNode xs
55
- traverseCTree atNode (Group xs) = Group <$> traverse atNode xs
56
- traverseCTree atNode (Choice xs) = Choice <$> traverse atNode xs
57
- traverseCTree atNode (KV k v c) = do
63
+ traverseCTree ::
64
+ Monad m => (CTreeExt i -> m (CTreeExt j )) -> (CTree i -> m (CTree j )) -> CTree i -> m (CTree j )
65
+ traverseCTree _ _ (Literal a) = pure $ Literal a
66
+ traverseCTree _ _ (Postlude a) = pure $ Postlude a
67
+ traverseCTree _ atNode (Map xs) = Map <$> traverse atNode xs
68
+ traverseCTree _ atNode (Array xs) = Array <$> traverse atNode xs
69
+ traverseCTree _ atNode (Group xs) = Group <$> traverse atNode xs
70
+ traverseCTree _ atNode (Choice xs) = Choice <$> traverse atNode xs
71
+ traverseCTree _ atNode (KV k v c) = do
58
72
k' <- atNode k
59
73
v' <- atNode v
60
74
pure $ KV k' v' c
61
- traverseCTree atNode (Occur i occ) = flip Occur occ <$> atNode i
62
- traverseCTree atNode (Range f t inc) = do
75
+ traverseCTree _ atNode (Occur i occ) = flip Occur occ <$> atNode i
76
+ traverseCTree _ atNode (Range f t inc) = do
63
77
f' <- atNode f
64
78
t' <- atNode t
65
79
pure $ Range f' t' inc
66
- traverseCTree atNode (Control o t c) = do
80
+ traverseCTree _ atNode (Control o t c) = do
67
81
t' <- atNode t
68
82
c' <- atNode c
69
83
pure $ Control o t' c'
70
- traverseCTree atNode (Enum ref) = Enum <$> atNode ref
71
- traverseCTree atNode (Unwrap ref) = Unwrap <$> atNode ref
72
- traverseCTree atNode (Tag i ref) = Tag i <$> atNode ref
84
+ traverseCTree _ atNode (Enum ref) = Enum <$> atNode ref
85
+ traverseCTree _ atNode (Unwrap ref) = Unwrap <$> atNode ref
86
+ traverseCTree _ atNode (Tag i ref) = Tag i <$> atNode ref
87
+ traverseCTree atExt _ (CTreeE x) = CTreeE <$> atExt x
73
88
74
- type Node f = f ( CTree f )
89
+ type Node i = CTreeExt i
75
90
76
- newtype CTreeRoot' poly f
77
- = CTreeRoot
78
- (Map. Map Name (poly (Node f )))
91
+ newtype CTreeRoot i = CTreeRoot (Map. Map Name (Parametrisation (Node i )))
79
92
deriving (Generic )
80
-
81
- type CTreeRoot f = CTreeRoot' (ParametrisedWith [Name ]) f
82
-
83
- data ParametrisedWith w a
84
- = Unparametrised { underlying :: a }
85
- | Parametrised
86
- { underlying :: a
87
- , params :: w
88
- }
89
- deriving (Eq , Functor , Generic , Foldable , Traversable , Show )
90
-
91
- instance (Hashable w , Hashable a ) => Hashable (ParametrisedWith w a )
0 commit comments