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