Skip to content

Commit 359aac4

Browse files
committed
Switched Resolve to TTG
1 parent acf5913 commit 359aac4

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,4 +1,5 @@
11
{-# LANGUAGE DataKinds #-}
2+
{-# LANGUAGE TypeFamilies #-}
23

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

@@ -10,7 +11,6 @@ import Codec.CBOR.Cuddle.CDDL (
1011
)
1112
import Codec.CBOR.Cuddle.CDDL.CtlOp
1213
import Codec.CBOR.Cuddle.CDDL.Postlude (PTerm)
13-
import Data.Hashable (Hashable)
1414
import Data.List.NonEmpty qualified as NE
1515
import Data.Map.Strict qualified as Map
1616
import Data.Word (Word64)
@@ -26,66 +26,67 @@ import GHC.Generics (Generic)
2626
-- to manipulate.
2727
--------------------------------------------------------------------------------
2828

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

4962
-- | 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
5872
k' <- atNode k
5973
v' <- atNode v
6074
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
6377
f' <- atNode f
6478
t' <- atNode t
6579
pure $ Range f' t' inc
66-
traverseCTree atNode (Control o t c) = do
80+
traverseCTree _ atNode (Control o t c) = do
6781
t' <- atNode t
6882
c' <- atNode c
6983
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
7388

74-
type Node f = f (CTree f)
89+
type Node i = CTreeExt i
7590

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

Comments
 (0)