-- | Phantom types for use with Hydra DSLs

module Hydra.Phantoms where

import qualified Hydra.Core as Core
import Data.Int
import Data.List as L
import Data.Map as M
import Data.Set as S

-- | An association of a field name (as in a case statement) with a phantom type
newtype TCase a = 
  TCase {
    forall a. TCase a -> Name
unTCase :: Core.Name}
  deriving (TCase a -> TCase a -> Bool
(TCase a -> TCase a -> Bool)
-> (TCase a -> TCase a -> Bool) -> Eq (TCase a)
forall a. TCase a -> TCase a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. TCase a -> TCase a -> Bool
== :: TCase a -> TCase a -> Bool
$c/= :: forall a. TCase a -> TCase a -> Bool
/= :: TCase a -> TCase a -> Bool
Eq, Eq (TCase a)
Eq (TCase a) =>
(TCase a -> TCase a -> Ordering)
-> (TCase a -> TCase a -> Bool)
-> (TCase a -> TCase a -> Bool)
-> (TCase a -> TCase a -> Bool)
-> (TCase a -> TCase a -> Bool)
-> (TCase a -> TCase a -> TCase a)
-> (TCase a -> TCase a -> TCase a)
-> Ord (TCase a)
TCase a -> TCase a -> Bool
TCase a -> TCase a -> Ordering
TCase a -> TCase a -> TCase a
forall a. Eq (TCase a)
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
forall a. TCase a -> TCase a -> Bool
forall a. TCase a -> TCase a -> Ordering
forall a. TCase a -> TCase a -> TCase a
$ccompare :: forall a. TCase a -> TCase a -> Ordering
compare :: TCase a -> TCase a -> Ordering
$c< :: forall a. TCase a -> TCase a -> Bool
< :: TCase a -> TCase a -> Bool
$c<= :: forall a. TCase a -> TCase a -> Bool
<= :: TCase a -> TCase a -> Bool
$c> :: forall a. TCase a -> TCase a -> Bool
> :: TCase a -> TCase a -> Bool
$c>= :: forall a. TCase a -> TCase a -> Bool
>= :: TCase a -> TCase a -> Bool
$cmax :: forall a. TCase a -> TCase a -> TCase a
max :: TCase a -> TCase a -> TCase a
$cmin :: forall a. TCase a -> TCase a -> TCase a
min :: TCase a -> TCase a -> TCase a
Ord, ReadPrec [TCase a]
ReadPrec (TCase a)
Int -> ReadS (TCase a)
ReadS [TCase a]
(Int -> ReadS (TCase a))
-> ReadS [TCase a]
-> ReadPrec (TCase a)
-> ReadPrec [TCase a]
-> Read (TCase a)
forall a. ReadPrec [TCase a]
forall a. ReadPrec (TCase a)
forall a. Int -> ReadS (TCase a)
forall a. ReadS [TCase a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: forall a. Int -> ReadS (TCase a)
readsPrec :: Int -> ReadS (TCase a)
$creadList :: forall a. ReadS [TCase a]
readList :: ReadS [TCase a]
$creadPrec :: forall a. ReadPrec (TCase a)
readPrec :: ReadPrec (TCase a)
$creadListPrec :: forall a. ReadPrec [TCase a]
readListPrec :: ReadPrec [TCase a]
Read, Int -> TCase a -> ShowS
[TCase a] -> ShowS
TCase a -> String
(Int -> TCase a -> ShowS)
-> (TCase a -> String) -> ([TCase a] -> ShowS) -> Show (TCase a)
forall a. Int -> TCase a -> ShowS
forall a. [TCase a] -> ShowS
forall a. TCase a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Int -> TCase a -> ShowS
showsPrec :: Int -> TCase a -> ShowS
$cshow :: forall a. TCase a -> String
show :: TCase a -> String
$cshowList :: forall a. [TCase a] -> ShowS
showList :: [TCase a] -> ShowS
Show)

_TCase :: Name
_TCase = (String -> Name
Core.Name String
"hydra/phantoms.TCase")

-- | An association with a named term (element) with a phantom type
data TElement a = 
  TElement {
    forall a. TElement a -> Name
tElementName :: Core.Name,
    forall a. TElement a -> TTerm a
tElementTerm :: (TTerm a)}
  deriving (TElement a -> TElement a -> Bool
(TElement a -> TElement a -> Bool)
-> (TElement a -> TElement a -> Bool) -> Eq (TElement a)
forall a. TElement a -> TElement a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. TElement a -> TElement a -> Bool
== :: TElement a -> TElement a -> Bool
$c/= :: forall a. TElement a -> TElement a -> Bool
/= :: TElement a -> TElement a -> Bool
Eq, Eq (TElement a)
Eq (TElement a) =>
(TElement a -> TElement a -> Ordering)
-> (TElement a -> TElement a -> Bool)
-> (TElement a -> TElement a -> Bool)
-> (TElement a -> TElement a -> Bool)
-> (TElement a -> TElement a -> Bool)
-> (TElement a -> TElement a -> TElement a)
-> (TElement a -> TElement a -> TElement a)
-> Ord (TElement a)
TElement a -> TElement a -> Bool
TElement a -> TElement a -> Ordering
TElement a -> TElement a -> TElement a
forall a. Eq (TElement a)
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
forall a. TElement a -> TElement a -> Bool
forall a. TElement a -> TElement a -> Ordering
forall a. TElement a -> TElement a -> TElement a
$ccompare :: forall a. TElement a -> TElement a -> Ordering
compare :: TElement a -> TElement a -> Ordering
$c< :: forall a. TElement a -> TElement a -> Bool
< :: TElement a -> TElement a -> Bool
$c<= :: forall a. TElement a -> TElement a -> Bool
<= :: TElement a -> TElement a -> Bool
$c> :: forall a. TElement a -> TElement a -> Bool
> :: TElement a -> TElement a -> Bool
$c>= :: forall a. TElement a -> TElement a -> Bool
>= :: TElement a -> TElement a -> Bool
$cmax :: forall a. TElement a -> TElement a -> TElement a
max :: TElement a -> TElement a -> TElement a
$cmin :: forall a. TElement a -> TElement a -> TElement a
min :: TElement a -> TElement a -> TElement a
Ord, ReadPrec [TElement a]
ReadPrec (TElement a)
Int -> ReadS (TElement a)
ReadS [TElement a]
(Int -> ReadS (TElement a))
-> ReadS [TElement a]
-> ReadPrec (TElement a)
-> ReadPrec [TElement a]
-> Read (TElement a)
forall a. ReadPrec [TElement a]
forall a. ReadPrec (TElement a)
forall a. Int -> ReadS (TElement a)
forall a. ReadS [TElement a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: forall a. Int -> ReadS (TElement a)
readsPrec :: Int -> ReadS (TElement a)
$creadList :: forall a. ReadS [TElement a]
readList :: ReadS [TElement a]
$creadPrec :: forall a. ReadPrec (TElement a)
readPrec :: ReadPrec (TElement a)
$creadListPrec :: forall a. ReadPrec [TElement a]
readListPrec :: ReadPrec [TElement a]
Read, Int -> TElement a -> ShowS
[TElement a] -> ShowS
TElement a -> String
(Int -> TElement a -> ShowS)
-> (TElement a -> String)
-> ([TElement a] -> ShowS)
-> Show (TElement a)
forall a. Int -> TElement a -> ShowS
forall a. [TElement a] -> ShowS
forall a. TElement a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Int -> TElement a -> ShowS
showsPrec :: Int -> TElement a -> ShowS
$cshow :: forall a. TElement a -> String
show :: TElement a -> String
$cshowList :: forall a. [TElement a] -> ShowS
showList :: [TElement a] -> ShowS
Show)

_TElement :: Name
_TElement = (String -> Name
Core.Name String
"hydra/phantoms.TElement")

_TElement_name :: Name
_TElement_name = (String -> Name
Core.Name String
"name")

_TElement_term :: Name
_TElement_term = (String -> Name
Core.Name String
"term")

-- | An association with a term-level field with a phantom type
newtype TField a = 
  TField {
    forall a. TField a -> Field
unTField :: Core.Field}
  deriving (TField a -> TField a -> Bool
(TField a -> TField a -> Bool)
-> (TField a -> TField a -> Bool) -> Eq (TField a)
forall a. TField a -> TField a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. TField a -> TField a -> Bool
== :: TField a -> TField a -> Bool
$c/= :: forall a. TField a -> TField a -> Bool
/= :: TField a -> TField a -> Bool
Eq, Eq (TField a)
Eq (TField a) =>
(TField a -> TField a -> Ordering)
-> (TField a -> TField a -> Bool)
-> (TField a -> TField a -> Bool)
-> (TField a -> TField a -> Bool)
-> (TField a -> TField a -> Bool)
-> (TField a -> TField a -> TField a)
-> (TField a -> TField a -> TField a)
-> Ord (TField a)
TField a -> TField a -> Bool
TField a -> TField a -> Ordering
TField a -> TField a -> TField a
forall a. Eq (TField a)
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
forall a. TField a -> TField a -> Bool
forall a. TField a -> TField a -> Ordering
forall a. TField a -> TField a -> TField a
$ccompare :: forall a. TField a -> TField a -> Ordering
compare :: TField a -> TField a -> Ordering
$c< :: forall a. TField a -> TField a -> Bool
< :: TField a -> TField a -> Bool
$c<= :: forall a. TField a -> TField a -> Bool
<= :: TField a -> TField a -> Bool
$c> :: forall a. TField a -> TField a -> Bool
> :: TField a -> TField a -> Bool
$c>= :: forall a. TField a -> TField a -> Bool
>= :: TField a -> TField a -> Bool
$cmax :: forall a. TField a -> TField a -> TField a
max :: TField a -> TField a -> TField a
$cmin :: forall a. TField a -> TField a -> TField a
min :: TField a -> TField a -> TField a
Ord, ReadPrec [TField a]
ReadPrec (TField a)
Int -> ReadS (TField a)
ReadS [TField a]
(Int -> ReadS (TField a))
-> ReadS [TField a]
-> ReadPrec (TField a)
-> ReadPrec [TField a]
-> Read (TField a)
forall a. ReadPrec [TField a]
forall a. ReadPrec (TField a)
forall a. Int -> ReadS (TField a)
forall a. ReadS [TField a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: forall a. Int -> ReadS (TField a)
readsPrec :: Int -> ReadS (TField a)
$creadList :: forall a. ReadS [TField a]
readList :: ReadS [TField a]
$creadPrec :: forall a. ReadPrec (TField a)
readPrec :: ReadPrec (TField a)
$creadListPrec :: forall a. ReadPrec [TField a]
readListPrec :: ReadPrec [TField a]
Read, Int -> TField a -> ShowS
[TField a] -> ShowS
TField a -> String
(Int -> TField a -> ShowS)
-> (TField a -> String) -> ([TField a] -> ShowS) -> Show (TField a)
forall a. Int -> TField a -> ShowS
forall a. [TField a] -> ShowS
forall a. TField a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Int -> TField a -> ShowS
showsPrec :: Int -> TField a -> ShowS
$cshow :: forall a. TField a -> String
show :: TField a -> String
$cshowList :: forall a. [TField a] -> ShowS
showList :: [TField a] -> ShowS
Show)

_TField :: Name
_TField = (String -> Name
Core.Name String
"hydra/phantoms.TField")

-- | An association of a term with a phantom type
newtype TTerm a = 
  TTerm {
    forall a. TTerm a -> Term
unTTerm :: Core.Term}
  deriving (TTerm a -> TTerm a -> Bool
(TTerm a -> TTerm a -> Bool)
-> (TTerm a -> TTerm a -> Bool) -> Eq (TTerm a)
forall a. TTerm a -> TTerm a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. TTerm a -> TTerm a -> Bool
== :: TTerm a -> TTerm a -> Bool
$c/= :: forall a. TTerm a -> TTerm a -> Bool
/= :: TTerm a -> TTerm a -> Bool
Eq, Eq (TTerm a)
Eq (TTerm a) =>
(TTerm a -> TTerm a -> Ordering)
-> (TTerm a -> TTerm a -> Bool)
-> (TTerm a -> TTerm a -> Bool)
-> (TTerm a -> TTerm a -> Bool)
-> (TTerm a -> TTerm a -> Bool)
-> (TTerm a -> TTerm a -> TTerm a)
-> (TTerm a -> TTerm a -> TTerm a)
-> Ord (TTerm a)
TTerm a -> TTerm a -> Bool
TTerm a -> TTerm a -> Ordering
TTerm a -> TTerm a -> TTerm a
forall a. Eq (TTerm a)
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
forall a. TTerm a -> TTerm a -> Bool
forall a. TTerm a -> TTerm a -> Ordering
forall a. TTerm a -> TTerm a -> TTerm a
$ccompare :: forall a. TTerm a -> TTerm a -> Ordering
compare :: TTerm a -> TTerm a -> Ordering
$c< :: forall a. TTerm a -> TTerm a -> Bool
< :: TTerm a -> TTerm a -> Bool
$c<= :: forall a. TTerm a -> TTerm a -> Bool
<= :: TTerm a -> TTerm a -> Bool
$c> :: forall a. TTerm a -> TTerm a -> Bool
> :: TTerm a -> TTerm a -> Bool
$c>= :: forall a. TTerm a -> TTerm a -> Bool
>= :: TTerm a -> TTerm a -> Bool
$cmax :: forall a. TTerm a -> TTerm a -> TTerm a
max :: TTerm a -> TTerm a -> TTerm a
$cmin :: forall a. TTerm a -> TTerm a -> TTerm a
min :: TTerm a -> TTerm a -> TTerm a
Ord, ReadPrec [TTerm a]
ReadPrec (TTerm a)
Int -> ReadS (TTerm a)
ReadS [TTerm a]
(Int -> ReadS (TTerm a))
-> ReadS [TTerm a]
-> ReadPrec (TTerm a)
-> ReadPrec [TTerm a]
-> Read (TTerm a)
forall a. ReadPrec [TTerm a]
forall a. ReadPrec (TTerm a)
forall a. Int -> ReadS (TTerm a)
forall a. ReadS [TTerm a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: forall a. Int -> ReadS (TTerm a)
readsPrec :: Int -> ReadS (TTerm a)
$creadList :: forall a. ReadS [TTerm a]
readList :: ReadS [TTerm a]
$creadPrec :: forall a. ReadPrec (TTerm a)
readPrec :: ReadPrec (TTerm a)
$creadListPrec :: forall a. ReadPrec [TTerm a]
readListPrec :: ReadPrec [TTerm a]
Read, Int -> TTerm a -> ShowS
[TTerm a] -> ShowS
TTerm a -> String
(Int -> TTerm a -> ShowS)
-> (TTerm a -> String) -> ([TTerm a] -> ShowS) -> Show (TTerm a)
forall a. Int -> TTerm a -> ShowS
forall a. [TTerm a] -> ShowS
forall a. TTerm a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Int -> TTerm a -> ShowS
showsPrec :: Int -> TTerm a -> ShowS
$cshow :: forall a. TTerm a -> String
show :: TTerm a -> String
$cshowList :: forall a. [TTerm a] -> ShowS
showList :: [TTerm a] -> ShowS
Show)

_TTerm :: Name
_TTerm = (String -> Name
Core.Name String
"hydra/phantoms.TTerm")