module Codec.CBOR.Cuddle.CDDL.CBORGenerator (
  CBORGenerator (..),
  HasGenerator (..),
  WrappedTerm (..),
) where

import Codec.CBOR.Term (Term)
import Optics.Core (Lens')
import System.Random.Stateful (StatefulGen)

data WrappedTerm
  = -- | Single term
    S Term
  | -- | Pair term
    P Term Term
  | -- | Group term
    G [WrappedTerm]
  deriving (WrappedTerm -> WrappedTerm -> Bool
(WrappedTerm -> WrappedTerm -> Bool)
-> (WrappedTerm -> WrappedTerm -> Bool) -> Eq WrappedTerm
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: WrappedTerm -> WrappedTerm -> Bool
== :: WrappedTerm -> WrappedTerm -> Bool
$c/= :: WrappedTerm -> WrappedTerm -> Bool
/= :: WrappedTerm -> WrappedTerm -> Bool
Eq, Int -> WrappedTerm -> ShowS
[WrappedTerm] -> ShowS
WrappedTerm -> String
(Int -> WrappedTerm -> ShowS)
-> (WrappedTerm -> String)
-> ([WrappedTerm] -> ShowS)
-> Show WrappedTerm
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> WrappedTerm -> ShowS
showsPrec :: Int -> WrappedTerm -> ShowS
$cshow :: WrappedTerm -> String
show :: WrappedTerm -> String
$cshowList :: [WrappedTerm] -> ShowS
showList :: [WrappedTerm] -> ShowS
Show)

newtype CBORGenerator = CBORGenerator (forall g m. StatefulGen g m => g -> m WrappedTerm)

class HasGenerator a where
  generatorL :: Lens' a (Maybe CBORGenerator)