Skip to content

Commit 7029821

Browse files
committed
Switched Resolve to TTG
1 parent dbb074d commit 7029821

File tree

2 files changed

+169
-164
lines changed

2 files changed

+169
-164
lines changed

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

Lines changed: 44 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{-# LANGUAGE DataKinds #-}
22
{-# LANGUAGE UndecidableInstances #-}
3+
{-# LANGUAGE TypeFamilies #-}
34

45
module Codec.CBOR.Cuddle.CDDL.CTree where
56

@@ -11,7 +12,6 @@ import Codec.CBOR.Cuddle.CDDL (
1112
)
1213
import Codec.CBOR.Cuddle.CDDL.CtlOp
1314
import Codec.CBOR.Cuddle.CDDL.Postlude (PTerm)
14-
import Data.Hashable (Hashable)
1515
import Data.List.NonEmpty qualified as NE
1616
import Data.Map.Strict qualified as Map
1717
import Data.Word (Word64)
@@ -27,68 +27,69 @@ import GHC.Generics (Generic)
2727
-- to manipulate.
2828
--------------------------------------------------------------------------------
2929

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+
3042
-- | CDDL Tree, parametrised over a functor
3143
--
3244
-- We principally use this functor to represent references - thus, every 'f a'
3345
-- may be either an a or a reference to another CTree.
34-
data CTree f
46+
data CTree i
3547
= Literal Value
3648
| 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)
4861
deriving (Generic)
4962

5063
deriving instance Eq (Node f) => Eq (CTree f)
5164

5265
-- | 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
6175
k' <- atNode k
6276
v' <- atNode v
6377
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
6680
f' <- atNode f
6781
t' <- atNode t
6882
pure $ Range f' t' inc
69-
traverseCTree atNode (Control o t c) = do
83+
traverseCTree _ atNode (Control o t c) = do
7084
t' <- atNode t
7185
c' <- atNode c
7286
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
7691

77-
type Node f = f (CTree f)
92+
type Node i = CTreeExt i
7893

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)))
8295
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

Comments
 (0)