{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE TypeData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}

module Codec.CBOR.Cuddle.CDDL.CTree where

import Codec.CBOR.Cuddle.CDDL (
  Name,
  OccurrenceIndicator,
  RangeBound,
  Value,
  XCddl,
  XRule,
  XTerm,
  XXTopLevel,
  XXType2,
 )
import Codec.CBOR.Cuddle.CDDL.CBORGenerator (CBORGenerator)
import Codec.CBOR.Cuddle.CDDL.CtlOp
import Control.Monad.Identity (Identity (..))
import Data.Default.Class (Default)
import Data.Hashable (Hashable)
import Data.List.NonEmpty qualified as NE
import Data.Map.Strict qualified as Map
import Data.Void (Void)
import Data.Word (Word64)
import GHC.Generics (Generic)

--------------------------------------------------------------------------------

-- * Resolved CDDL Tree

--
-- This is a simplified representation of CDDL. It is technically more general -
-- that is, the structure can represent invalid CDDL - but is in that way easier
-- to manipulate.
--------------------------------------------------------------------------------

data family XXCTree i

type data CTreePhase

data instance XTerm CTreePhase = CTreeXTerm
  deriving ((forall x. XTerm CTreePhase -> Rep (XTerm CTreePhase) x)
-> (forall x. Rep (XTerm CTreePhase) x -> XTerm CTreePhase)
-> Generic (XTerm CTreePhase)
forall x. Rep (XTerm CTreePhase) x -> XTerm CTreePhase
forall x. XTerm CTreePhase -> Rep (XTerm CTreePhase) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. XTerm CTreePhase -> Rep (XTerm CTreePhase) x
from :: forall x. XTerm CTreePhase -> Rep (XTerm CTreePhase) x
$cto :: forall x. Rep (XTerm CTreePhase) x -> XTerm CTreePhase
to :: forall x. Rep (XTerm CTreePhase) x -> XTerm CTreePhase
Generic, Int -> XTerm CTreePhase -> ShowS
[XTerm CTreePhase] -> ShowS
XTerm CTreePhase -> String
(Int -> XTerm CTreePhase -> ShowS)
-> (XTerm CTreePhase -> String)
-> ([XTerm CTreePhase] -> ShowS)
-> Show (XTerm CTreePhase)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> XTerm CTreePhase -> ShowS
showsPrec :: Int -> XTerm CTreePhase -> ShowS
$cshow :: XTerm CTreePhase -> String
show :: XTerm CTreePhase -> String
$cshowList :: [XTerm CTreePhase] -> ShowS
showList :: [XTerm CTreePhase] -> ShowS
Show, XTerm CTreePhase -> XTerm CTreePhase -> Bool
(XTerm CTreePhase -> XTerm CTreePhase -> Bool)
-> (XTerm CTreePhase -> XTerm CTreePhase -> Bool)
-> Eq (XTerm CTreePhase)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: XTerm CTreePhase -> XTerm CTreePhase -> Bool
== :: XTerm CTreePhase -> XTerm CTreePhase -> Bool
$c/= :: XTerm CTreePhase -> XTerm CTreePhase -> Bool
/= :: XTerm CTreePhase -> XTerm CTreePhase -> Bool
Eq, Eq (XTerm CTreePhase)
Eq (XTerm CTreePhase) =>
(XTerm CTreePhase -> XTerm CTreePhase -> Ordering)
-> (XTerm CTreePhase -> XTerm CTreePhase -> Bool)
-> (XTerm CTreePhase -> XTerm CTreePhase -> Bool)
-> (XTerm CTreePhase -> XTerm CTreePhase -> Bool)
-> (XTerm CTreePhase -> XTerm CTreePhase -> Bool)
-> (XTerm CTreePhase -> XTerm CTreePhase -> XTerm CTreePhase)
-> (XTerm CTreePhase -> XTerm CTreePhase -> XTerm CTreePhase)
-> Ord (XTerm CTreePhase)
XTerm CTreePhase -> XTerm CTreePhase -> Bool
XTerm CTreePhase -> XTerm CTreePhase -> Ordering
XTerm CTreePhase -> XTerm CTreePhase -> XTerm CTreePhase
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: XTerm CTreePhase -> XTerm CTreePhase -> Ordering
compare :: XTerm CTreePhase -> XTerm CTreePhase -> Ordering
$c< :: XTerm CTreePhase -> XTerm CTreePhase -> Bool
< :: XTerm CTreePhase -> XTerm CTreePhase -> Bool
$c<= :: XTerm CTreePhase -> XTerm CTreePhase -> Bool
<= :: XTerm CTreePhase -> XTerm CTreePhase -> Bool
$c> :: XTerm CTreePhase -> XTerm CTreePhase -> Bool
> :: XTerm CTreePhase -> XTerm CTreePhase -> Bool
$c>= :: XTerm CTreePhase -> XTerm CTreePhase -> Bool
>= :: XTerm CTreePhase -> XTerm CTreePhase -> Bool
$cmax :: XTerm CTreePhase -> XTerm CTreePhase -> XTerm CTreePhase
max :: XTerm CTreePhase -> XTerm CTreePhase -> XTerm CTreePhase
$cmin :: XTerm CTreePhase -> XTerm CTreePhase -> XTerm CTreePhase
min :: XTerm CTreePhase -> XTerm CTreePhase -> XTerm CTreePhase
Ord)
  deriving anyclass (Eq (XTerm CTreePhase)
Eq (XTerm CTreePhase) =>
(Int -> XTerm CTreePhase -> Int)
-> (XTerm CTreePhase -> Int) -> Hashable (XTerm CTreePhase)
Int -> XTerm CTreePhase -> Int
XTerm CTreePhase -> Int
forall a. Eq a => (Int -> a -> Int) -> (a -> Int) -> Hashable a
$chashWithSalt :: Int -> XTerm CTreePhase -> Int
hashWithSalt :: Int -> XTerm CTreePhase -> Int
$chash :: XTerm CTreePhase -> Int
hash :: XTerm CTreePhase -> Int
Hashable, XTerm CTreePhase
XTerm CTreePhase -> Default (XTerm CTreePhase)
forall a. a -> Default a
$cdef :: XTerm CTreePhase
def :: XTerm CTreePhase
Default)

newtype instance XXTopLevel CTreePhase = CTreeXXTopLevel Void
  deriving ((forall x. XXTopLevel CTreePhase -> Rep (XXTopLevel CTreePhase) x)
-> (forall x.
    Rep (XXTopLevel CTreePhase) x -> XXTopLevel CTreePhase)
-> Generic (XXTopLevel CTreePhase)
forall x. Rep (XXTopLevel CTreePhase) x -> XXTopLevel CTreePhase
forall x. XXTopLevel CTreePhase -> Rep (XXTopLevel CTreePhase) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. XXTopLevel CTreePhase -> Rep (XXTopLevel CTreePhase) x
from :: forall x. XXTopLevel CTreePhase -> Rep (XXTopLevel CTreePhase) x
$cto :: forall x. Rep (XXTopLevel CTreePhase) x -> XXTopLevel CTreePhase
to :: forall x. Rep (XXTopLevel CTreePhase) x -> XXTopLevel CTreePhase
Generic, Int -> XXTopLevel CTreePhase -> ShowS
[XXTopLevel CTreePhase] -> ShowS
XXTopLevel CTreePhase -> String
(Int -> XXTopLevel CTreePhase -> ShowS)
-> (XXTopLevel CTreePhase -> String)
-> ([XXTopLevel CTreePhase] -> ShowS)
-> Show (XXTopLevel CTreePhase)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> XXTopLevel CTreePhase -> ShowS
showsPrec :: Int -> XXTopLevel CTreePhase -> ShowS
$cshow :: XXTopLevel CTreePhase -> String
show :: XXTopLevel CTreePhase -> String
$cshowList :: [XXTopLevel CTreePhase] -> ShowS
showList :: [XXTopLevel CTreePhase] -> ShowS
Show, XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool
(XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool)
-> (XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool)
-> Eq (XXTopLevel CTreePhase)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool
== :: XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool
$c/= :: XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool
/= :: XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool
Eq, Eq (XXTopLevel CTreePhase)
Eq (XXTopLevel CTreePhase) =>
(XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Ordering)
-> (XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool)
-> (XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool)
-> (XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool)
-> (XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool)
-> (XXTopLevel CTreePhase
    -> XXTopLevel CTreePhase -> XXTopLevel CTreePhase)
-> (XXTopLevel CTreePhase
    -> XXTopLevel CTreePhase -> XXTopLevel CTreePhase)
-> Ord (XXTopLevel CTreePhase)
XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool
XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Ordering
XXTopLevel CTreePhase
-> XXTopLevel CTreePhase -> XXTopLevel CTreePhase
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Ordering
compare :: XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Ordering
$c< :: XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool
< :: XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool
$c<= :: XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool
<= :: XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool
$c> :: XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool
> :: XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool
$c>= :: XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool
>= :: XXTopLevel CTreePhase -> XXTopLevel CTreePhase -> Bool
$cmax :: XXTopLevel CTreePhase
-> XXTopLevel CTreePhase -> XXTopLevel CTreePhase
max :: XXTopLevel CTreePhase
-> XXTopLevel CTreePhase -> XXTopLevel CTreePhase
$cmin :: XXTopLevel CTreePhase
-> XXTopLevel CTreePhase -> XXTopLevel CTreePhase
min :: XXTopLevel CTreePhase
-> XXTopLevel CTreePhase -> XXTopLevel CTreePhase
Ord)

data instance XCddl CTreePhase = CTreeXCddl
  deriving ((forall x. XCddl CTreePhase -> Rep (XCddl CTreePhase) x)
-> (forall x. Rep (XCddl CTreePhase) x -> XCddl CTreePhase)
-> Generic (XCddl CTreePhase)
forall x. Rep (XCddl CTreePhase) x -> XCddl CTreePhase
forall x. XCddl CTreePhase -> Rep (XCddl CTreePhase) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. XCddl CTreePhase -> Rep (XCddl CTreePhase) x
from :: forall x. XCddl CTreePhase -> Rep (XCddl CTreePhase) x
$cto :: forall x. Rep (XCddl CTreePhase) x -> XCddl CTreePhase
to :: forall x. Rep (XCddl CTreePhase) x -> XCddl CTreePhase
Generic, Int -> XCddl CTreePhase -> ShowS
[XCddl CTreePhase] -> ShowS
XCddl CTreePhase -> String
(Int -> XCddl CTreePhase -> ShowS)
-> (XCddl CTreePhase -> String)
-> ([XCddl CTreePhase] -> ShowS)
-> Show (XCddl CTreePhase)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> XCddl CTreePhase -> ShowS
showsPrec :: Int -> XCddl CTreePhase -> ShowS
$cshow :: XCddl CTreePhase -> String
show :: XCddl CTreePhase -> String
$cshowList :: [XCddl CTreePhase] -> ShowS
showList :: [XCddl CTreePhase] -> ShowS
Show, XCddl CTreePhase -> XCddl CTreePhase -> Bool
(XCddl CTreePhase -> XCddl CTreePhase -> Bool)
-> (XCddl CTreePhase -> XCddl CTreePhase -> Bool)
-> Eq (XCddl CTreePhase)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: XCddl CTreePhase -> XCddl CTreePhase -> Bool
== :: XCddl CTreePhase -> XCddl CTreePhase -> Bool
$c/= :: XCddl CTreePhase -> XCddl CTreePhase -> Bool
/= :: XCddl CTreePhase -> XCddl CTreePhase -> Bool
Eq, Eq (XCddl CTreePhase)
Eq (XCddl CTreePhase) =>
(XCddl CTreePhase -> XCddl CTreePhase -> Ordering)
-> (XCddl CTreePhase -> XCddl CTreePhase -> Bool)
-> (XCddl CTreePhase -> XCddl CTreePhase -> Bool)
-> (XCddl CTreePhase -> XCddl CTreePhase -> Bool)
-> (XCddl CTreePhase -> XCddl CTreePhase -> Bool)
-> (XCddl CTreePhase -> XCddl CTreePhase -> XCddl CTreePhase)
-> (XCddl CTreePhase -> XCddl CTreePhase -> XCddl CTreePhase)
-> Ord (XCddl CTreePhase)
XCddl CTreePhase -> XCddl CTreePhase -> Bool
XCddl CTreePhase -> XCddl CTreePhase -> Ordering
XCddl CTreePhase -> XCddl CTreePhase -> XCddl CTreePhase
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: XCddl CTreePhase -> XCddl CTreePhase -> Ordering
compare :: XCddl CTreePhase -> XCddl CTreePhase -> Ordering
$c< :: XCddl CTreePhase -> XCddl CTreePhase -> Bool
< :: XCddl CTreePhase -> XCddl CTreePhase -> Bool
$c<= :: XCddl CTreePhase -> XCddl CTreePhase -> Bool
<= :: XCddl CTreePhase -> XCddl CTreePhase -> Bool
$c> :: XCddl CTreePhase -> XCddl CTreePhase -> Bool
> :: XCddl CTreePhase -> XCddl CTreePhase -> Bool
$c>= :: XCddl CTreePhase -> XCddl CTreePhase -> Bool
>= :: XCddl CTreePhase -> XCddl CTreePhase -> Bool
$cmax :: XCddl CTreePhase -> XCddl CTreePhase -> XCddl CTreePhase
max :: XCddl CTreePhase -> XCddl CTreePhase -> XCddl CTreePhase
$cmin :: XCddl CTreePhase -> XCddl CTreePhase -> XCddl CTreePhase
min :: XCddl CTreePhase -> XCddl CTreePhase -> XCddl CTreePhase
Ord)

newtype instance XRule CTreePhase = CTreeXRule (Maybe CBORGenerator)
  deriving ((forall x. XRule CTreePhase -> Rep (XRule CTreePhase) x)
-> (forall x. Rep (XRule CTreePhase) x -> XRule CTreePhase)
-> Generic (XRule CTreePhase)
forall x. Rep (XRule CTreePhase) x -> XRule CTreePhase
forall x. XRule CTreePhase -> Rep (XRule CTreePhase) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. XRule CTreePhase -> Rep (XRule CTreePhase) x
from :: forall x. XRule CTreePhase -> Rep (XRule CTreePhase) x
$cto :: forall x. Rep (XRule CTreePhase) x -> XRule CTreePhase
to :: forall x. Rep (XRule CTreePhase) x -> XRule CTreePhase
Generic)

newtype instance XXType2 CTreePhase = CTreeXXType2 Void
  deriving ((forall x. XXType2 CTreePhase -> Rep (XXType2 CTreePhase) x)
-> (forall x. Rep (XXType2 CTreePhase) x -> XXType2 CTreePhase)
-> Generic (XXType2 CTreePhase)
forall x. Rep (XXType2 CTreePhase) x -> XXType2 CTreePhase
forall x. XXType2 CTreePhase -> Rep (XXType2 CTreePhase) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. XXType2 CTreePhase -> Rep (XXType2 CTreePhase) x
from :: forall x. XXType2 CTreePhase -> Rep (XXType2 CTreePhase) x
$cto :: forall x. Rep (XXType2 CTreePhase) x -> XXType2 CTreePhase
to :: forall x. Rep (XXType2 CTreePhase) x -> XXType2 CTreePhase
Generic, Int -> XXType2 CTreePhase -> ShowS
[XXType2 CTreePhase] -> ShowS
XXType2 CTreePhase -> String
(Int -> XXType2 CTreePhase -> ShowS)
-> (XXType2 CTreePhase -> String)
-> ([XXType2 CTreePhase] -> ShowS)
-> Show (XXType2 CTreePhase)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> XXType2 CTreePhase -> ShowS
showsPrec :: Int -> XXType2 CTreePhase -> ShowS
$cshow :: XXType2 CTreePhase -> String
show :: XXType2 CTreePhase -> String
$cshowList :: [XXType2 CTreePhase] -> ShowS
showList :: [XXType2 CTreePhase] -> ShowS
Show, XXType2 CTreePhase -> XXType2 CTreePhase -> Bool
(XXType2 CTreePhase -> XXType2 CTreePhase -> Bool)
-> (XXType2 CTreePhase -> XXType2 CTreePhase -> Bool)
-> Eq (XXType2 CTreePhase)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: XXType2 CTreePhase -> XXType2 CTreePhase -> Bool
== :: XXType2 CTreePhase -> XXType2 CTreePhase -> Bool
$c/= :: XXType2 CTreePhase -> XXType2 CTreePhase -> Bool
/= :: XXType2 CTreePhase -> XXType2 CTreePhase -> Bool
Eq, Eq (XXType2 CTreePhase)
Eq (XXType2 CTreePhase) =>
(XXType2 CTreePhase -> XXType2 CTreePhase -> Ordering)
-> (XXType2 CTreePhase -> XXType2 CTreePhase -> Bool)
-> (XXType2 CTreePhase -> XXType2 CTreePhase -> Bool)
-> (XXType2 CTreePhase -> XXType2 CTreePhase -> Bool)
-> (XXType2 CTreePhase -> XXType2 CTreePhase -> Bool)
-> (XXType2 CTreePhase -> XXType2 CTreePhase -> XXType2 CTreePhase)
-> (XXType2 CTreePhase -> XXType2 CTreePhase -> XXType2 CTreePhase)
-> Ord (XXType2 CTreePhase)
XXType2 CTreePhase -> XXType2 CTreePhase -> Bool
XXType2 CTreePhase -> XXType2 CTreePhase -> Ordering
XXType2 CTreePhase -> XXType2 CTreePhase -> XXType2 CTreePhase
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: XXType2 CTreePhase -> XXType2 CTreePhase -> Ordering
compare :: XXType2 CTreePhase -> XXType2 CTreePhase -> Ordering
$c< :: XXType2 CTreePhase -> XXType2 CTreePhase -> Bool
< :: XXType2 CTreePhase -> XXType2 CTreePhase -> Bool
$c<= :: XXType2 CTreePhase -> XXType2 CTreePhase -> Bool
<= :: XXType2 CTreePhase -> XXType2 CTreePhase -> Bool
$c> :: XXType2 CTreePhase -> XXType2 CTreePhase -> Bool
> :: XXType2 CTreePhase -> XXType2 CTreePhase -> Bool
$c>= :: XXType2 CTreePhase -> XXType2 CTreePhase -> Bool
>= :: XXType2 CTreePhase -> XXType2 CTreePhase -> Bool
$cmax :: XXType2 CTreePhase -> XXType2 CTreePhase -> XXType2 CTreePhase
max :: XXType2 CTreePhase -> XXType2 CTreePhase -> XXType2 CTreePhase
$cmin :: XXType2 CTreePhase -> XXType2 CTreePhase -> XXType2 CTreePhase
min :: XXType2 CTreePhase -> XXType2 CTreePhase -> XXType2 CTreePhase
Ord)
  deriving anyclass (Eq (XXType2 CTreePhase)
Eq (XXType2 CTreePhase) =>
(Int -> XXType2 CTreePhase -> Int)
-> (XXType2 CTreePhase -> Int) -> Hashable (XXType2 CTreePhase)
Int -> XXType2 CTreePhase -> Int
XXType2 CTreePhase -> Int
forall a. Eq a => (Int -> a -> Int) -> (a -> Int) -> Hashable a
$chashWithSalt :: Int -> XXType2 CTreePhase -> Int
hashWithSalt :: Int -> XXType2 CTreePhase -> Int
$chash :: XXType2 CTreePhase -> Int
hash :: XXType2 CTreePhase -> Int
Hashable)

data CTree i
  = Literal Value
  | Postlude PTerm
  | Map [CTree i]
  | Array [CTree i]
  | Choice (NE.NonEmpty (CTree i))
  | Group [CTree i]
  | KV {forall i. CTree i -> CTree i
key :: CTree i, forall i. CTree i -> CTree i
value :: CTree i, forall i. CTree i -> Bool
cut :: Bool}
  | Occur {forall i. CTree i -> CTree i
item :: CTree i, forall i. CTree i -> OccurrenceIndicator
occurs :: OccurrenceIndicator}
  | Range {forall i. CTree i -> CTree i
from :: CTree i, forall i. CTree i -> CTree i
to :: CTree i, forall i. CTree i -> RangeBound
inclusive :: RangeBound}
  | Control {forall i. CTree i -> CtlOp
op :: CtlOp, forall i. CTree i -> CTree i
target :: CTree i, forall i. CTree i -> CTree i
controller :: CTree i}
  | Enum (CTree i)
  | Unwrap (CTree i)
  | Tag Word64 (CTree i)
  | CTreeE (XXCTree i)
  deriving ((forall x. CTree i -> Rep (CTree i) x)
-> (forall x. Rep (CTree i) x -> CTree i) -> Generic (CTree i)
forall x. Rep (CTree i) x -> CTree i
forall x. CTree i -> Rep (CTree i) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall i x. Rep (CTree i) x -> CTree i
forall i x. CTree i -> Rep (CTree i) x
$cfrom :: forall i x. CTree i -> Rep (CTree i) x
from :: forall x. CTree i -> Rep (CTree i) x
$cto :: forall i x. Rep (CTree i) x -> CTree i
to :: forall x. Rep (CTree i) x -> CTree i
Generic)

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

deriving instance Show (Node f) => Show (CTree f)

instance Hashable (Node f) => Hashable (CTree f)

-- | Traverse the CTree, carrying out the given operation at each node
traverseCTree ::
  Monad m => (XXCTree i -> m (CTree j)) -> (CTree i -> m (CTree j)) -> CTree i -> m (CTree j)
traverseCTree :: forall (m :: * -> *) i j.
Monad m =>
(XXCTree i -> m (CTree j))
-> (CTree i -> m (CTree j)) -> CTree i -> m (CTree j)
traverseCTree XXCTree i -> m (CTree j)
_ CTree i -> m (CTree j)
_ (Literal Value
a) = CTree j -> m (CTree j)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (CTree j -> m (CTree j)) -> CTree j -> m (CTree j)
forall a b. (a -> b) -> a -> b
$ Value -> CTree j
forall i. Value -> CTree i
Literal Value
a
traverseCTree XXCTree i -> m (CTree j)
_ CTree i -> m (CTree j)
_ (Postlude PTerm
a) = CTree j -> m (CTree j)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (CTree j -> m (CTree j)) -> CTree j -> m (CTree j)
forall a b. (a -> b) -> a -> b
$ PTerm -> CTree j
forall i. PTerm -> CTree i
Postlude PTerm
a
traverseCTree XXCTree i -> m (CTree j)
_ CTree i -> m (CTree j)
atNode (Map [CTree i]
xs) = [CTree j] -> CTree j
forall i. [CTree i] -> CTree i
Map ([CTree j] -> CTree j) -> m [CTree j] -> m (CTree j)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (CTree i -> m (CTree j)) -> [CTree i] -> m [CTree j]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse CTree i -> m (CTree j)
atNode [CTree i]
xs
traverseCTree XXCTree i -> m (CTree j)
_ CTree i -> m (CTree j)
atNode (Array [CTree i]
xs) = [CTree j] -> CTree j
forall i. [CTree i] -> CTree i
Array ([CTree j] -> CTree j) -> m [CTree j] -> m (CTree j)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (CTree i -> m (CTree j)) -> [CTree i] -> m [CTree j]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse CTree i -> m (CTree j)
atNode [CTree i]
xs
traverseCTree XXCTree i -> m (CTree j)
_ CTree i -> m (CTree j)
atNode (Group [CTree i]
xs) = [CTree j] -> CTree j
forall i. [CTree i] -> CTree i
Group ([CTree j] -> CTree j) -> m [CTree j] -> m (CTree j)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (CTree i -> m (CTree j)) -> [CTree i] -> m [CTree j]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> [a] -> f [b]
traverse CTree i -> m (CTree j)
atNode [CTree i]
xs
traverseCTree XXCTree i -> m (CTree j)
_ CTree i -> m (CTree j)
atNode (Choice NonEmpty (CTree i)
xs) = NonEmpty (CTree j) -> CTree j
forall i. NonEmpty (CTree i) -> CTree i
Choice (NonEmpty (CTree j) -> CTree j)
-> m (NonEmpty (CTree j)) -> m (CTree j)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (CTree i -> m (CTree j))
-> NonEmpty (CTree i) -> m (NonEmpty (CTree j))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> NonEmpty a -> f (NonEmpty b)
traverse CTree i -> m (CTree j)
atNode NonEmpty (CTree i)
xs
traverseCTree XXCTree i -> m (CTree j)
_ CTree i -> m (CTree j)
atNode (KV CTree i
k CTree i
v Bool
c) = do
  CTree j
k' <- CTree i -> m (CTree j)
atNode CTree i
k
  CTree j
v' <- CTree i -> m (CTree j)
atNode CTree i
v
  CTree j -> m (CTree j)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (CTree j -> m (CTree j)) -> CTree j -> m (CTree j)
forall a b. (a -> b) -> a -> b
$ CTree j -> CTree j -> Bool -> CTree j
forall i. CTree i -> CTree i -> Bool -> CTree i
KV CTree j
k' CTree j
v' Bool
c
traverseCTree XXCTree i -> m (CTree j)
_ CTree i -> m (CTree j)
atNode (Occur CTree i
i OccurrenceIndicator
occ) = (CTree j -> OccurrenceIndicator -> CTree j)
-> OccurrenceIndicator -> CTree j -> CTree j
forall a b c. (a -> b -> c) -> b -> a -> c
flip CTree j -> OccurrenceIndicator -> CTree j
forall i. CTree i -> OccurrenceIndicator -> CTree i
Occur OccurrenceIndicator
occ (CTree j -> CTree j) -> m (CTree j) -> m (CTree j)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CTree i -> m (CTree j)
atNode CTree i
i
traverseCTree XXCTree i -> m (CTree j)
_ CTree i -> m (CTree j)
atNode (Range CTree i
f CTree i
t RangeBound
inc) = do
  CTree j
f' <- CTree i -> m (CTree j)
atNode CTree i
f
  CTree j
t' <- CTree i -> m (CTree j)
atNode CTree i
t
  CTree j -> m (CTree j)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (CTree j -> m (CTree j)) -> CTree j -> m (CTree j)
forall a b. (a -> b) -> a -> b
$ CTree j -> CTree j -> RangeBound -> CTree j
forall i. CTree i -> CTree i -> RangeBound -> CTree i
Range CTree j
f' CTree j
t' RangeBound
inc
traverseCTree XXCTree i -> m (CTree j)
_ CTree i -> m (CTree j)
atNode (Control CtlOp
o CTree i
t CTree i
c) = do
  CTree j
t' <- CTree i -> m (CTree j)
atNode CTree i
t
  CTree j
c' <- CTree i -> m (CTree j)
atNode CTree i
c
  CTree j -> m (CTree j)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (CTree j -> m (CTree j)) -> CTree j -> m (CTree j)
forall a b. (a -> b) -> a -> b
$ CtlOp -> CTree j -> CTree j -> CTree j
forall i. CtlOp -> CTree i -> CTree i -> CTree i
Control CtlOp
o CTree j
t' CTree j
c'
traverseCTree XXCTree i -> m (CTree j)
_ CTree i -> m (CTree j)
atNode (Enum CTree i
ref) = CTree j -> CTree j
forall i. CTree i -> CTree i
Enum (CTree j -> CTree j) -> m (CTree j) -> m (CTree j)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CTree i -> m (CTree j)
atNode CTree i
ref
traverseCTree XXCTree i -> m (CTree j)
_ CTree i -> m (CTree j)
atNode (Unwrap CTree i
ref) = CTree j -> CTree j
forall i. CTree i -> CTree i
Unwrap (CTree j -> CTree j) -> m (CTree j) -> m (CTree j)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CTree i -> m (CTree j)
atNode CTree i
ref
traverseCTree XXCTree i -> m (CTree j)
_ CTree i -> m (CTree j)
atNode (Tag Word64
i CTree i
ref) = Word64 -> CTree j -> CTree j
forall i. Word64 -> CTree i -> CTree i
Tag Word64
i (CTree j -> CTree j) -> m (CTree j) -> m (CTree j)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> CTree i -> m (CTree j)
atNode CTree i
ref
traverseCTree XXCTree i -> m (CTree j)
atExt CTree i -> m (CTree j)
_ (CTreeE XXCTree i
x) = XXCTree i -> m (CTree j)
atExt XXCTree i
x

foldCTree ::
  (XXCTree i -> CTree j) ->
  (CTree i -> CTree j) ->
  CTree i ->
  CTree j
foldCTree :: forall i j.
(XXCTree i -> CTree j)
-> (CTree i -> CTree j) -> CTree i -> CTree j
foldCTree XXCTree i -> CTree j
atExt CTree i -> CTree j
atNode CTree i
x = Identity (CTree j) -> CTree j
forall a. Identity a -> a
runIdentity (Identity (CTree j) -> CTree j) -> Identity (CTree j) -> CTree j
forall a b. (a -> b) -> a -> b
$ (XXCTree i -> Identity (CTree j))
-> (CTree i -> Identity (CTree j)) -> CTree i -> Identity (CTree j)
forall (m :: * -> *) i j.
Monad m =>
(XXCTree i -> m (CTree j))
-> (CTree i -> m (CTree j)) -> CTree i -> m (CTree j)
traverseCTree (CTree j -> Identity (CTree j)
forall a. a -> Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (CTree j -> Identity (CTree j))
-> (XXCTree i -> CTree j) -> XXCTree i -> Identity (CTree j)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. XXCTree i -> CTree j
atExt) (CTree j -> Identity (CTree j)
forall a. a -> Identity a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (CTree j -> Identity (CTree j))
-> (CTree i -> CTree j) -> CTree i -> Identity (CTree j)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CTree i -> CTree j
atNode) CTree i
x

type Node i = XXCTree i

newtype CTreeRoot i = CTreeRoot (Map.Map Name (CTree i))
  deriving ((forall x. CTreeRoot i -> Rep (CTreeRoot i) x)
-> (forall x. Rep (CTreeRoot i) x -> CTreeRoot i)
-> Generic (CTreeRoot i)
forall x. Rep (CTreeRoot i) x -> CTreeRoot i
forall x. CTreeRoot i -> Rep (CTreeRoot i) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall i x. Rep (CTreeRoot i) x -> CTreeRoot i
forall i x. CTreeRoot i -> Rep (CTreeRoot i) x
$cfrom :: forall i x. CTreeRoot i -> Rep (CTreeRoot i) x
from :: forall x. CTreeRoot i -> Rep (CTreeRoot i) x
$cto :: forall i x. Rep (CTreeRoot i) x -> CTreeRoot i
to :: forall x. Rep (CTreeRoot i) x -> CTreeRoot i
Generic)

deriving instance Show (CTree i) => Show (CTreeRoot i)

-- |
--
--  CDDL predefines a number of names.  This subsection summarizes these
--  names, but please see Appendix D for the exact definitions.
--
--  The following keywords for primitive datatypes are defined:
--
--  "bool"  Boolean value (major type 7, additional information 20
--    or 21).
--
--  "uint"  An unsigned integer (major type 0).
--
--  "nint"  A negative integer (major type 1).
--
--  "int"  An unsigned integer or a negative integer.
--
--  "float16"  A number representable as a half-precision float [IEEE754]
--    (major type 7, additional information 25).
--
--  "float32"  A number representable as a single-precision float
--    [IEEE754] (major type 7, additional information 26).
--
--
--  "float64"  A number representable as a double-precision float
--    [IEEE754] (major type 7, additional information 27).
--
--  "float"  One of float16, float32, or float64.
--
--  "bstr" or "bytes"  A byte string (major type 2).
--
--  "tstr" or "text"  Text string (major type 3).
--
--  (Note that there are no predefined names for arrays or maps; these
--  are defined with the syntax given below.)
data PTerm
  = PTBool
  | PTUInt
  | PTNInt
  | PTInt
  | PTHalf
  | PTFloat
  | PTDouble
  | PTBytes
  | PTText
  | PTAny
  | PTNil
  | PTUndefined
  deriving (PTerm -> PTerm -> Bool
(PTerm -> PTerm -> Bool) -> (PTerm -> PTerm -> Bool) -> Eq PTerm
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PTerm -> PTerm -> Bool
== :: PTerm -> PTerm -> Bool
$c/= :: PTerm -> PTerm -> Bool
/= :: PTerm -> PTerm -> Bool
Eq, (forall x. PTerm -> Rep PTerm x)
-> (forall x. Rep PTerm x -> PTerm) -> Generic PTerm
forall x. Rep PTerm x -> PTerm
forall x. PTerm -> Rep PTerm x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. PTerm -> Rep PTerm x
from :: forall x. PTerm -> Rep PTerm x
$cto :: forall x. Rep PTerm x -> PTerm
to :: forall x. Rep PTerm x -> PTerm
Generic, Eq PTerm
Eq PTerm =>
(PTerm -> PTerm -> Ordering)
-> (PTerm -> PTerm -> Bool)
-> (PTerm -> PTerm -> Bool)
-> (PTerm -> PTerm -> Bool)
-> (PTerm -> PTerm -> Bool)
-> (PTerm -> PTerm -> PTerm)
-> (PTerm -> PTerm -> PTerm)
-> Ord PTerm
PTerm -> PTerm -> Bool
PTerm -> PTerm -> Ordering
PTerm -> PTerm -> PTerm
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: PTerm -> PTerm -> Ordering
compare :: PTerm -> PTerm -> Ordering
$c< :: PTerm -> PTerm -> Bool
< :: PTerm -> PTerm -> Bool
$c<= :: PTerm -> PTerm -> Bool
<= :: PTerm -> PTerm -> Bool
$c> :: PTerm -> PTerm -> Bool
> :: PTerm -> PTerm -> Bool
$c>= :: PTerm -> PTerm -> Bool
>= :: PTerm -> PTerm -> Bool
$cmax :: PTerm -> PTerm -> PTerm
max :: PTerm -> PTerm -> PTerm
$cmin :: PTerm -> PTerm -> PTerm
min :: PTerm -> PTerm -> PTerm
Ord, Int -> PTerm -> ShowS
[PTerm] -> ShowS
PTerm -> String
(Int -> PTerm -> ShowS)
-> (PTerm -> String) -> ([PTerm] -> ShowS) -> Show PTerm
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> PTerm -> ShowS
showsPrec :: Int -> PTerm -> ShowS
$cshow :: PTerm -> String
show :: PTerm -> String
$cshowList :: [PTerm] -> ShowS
showList :: [PTerm] -> ShowS
Show)

instance Hashable PTerm