{-# language DataKinds #-}
{-# language StandaloneKindSignatures #-}
{-# language PolyKinds #-}
{-# language TypeFamilies #-}
module Rel8.Schema.Structure
( Structure
, Shape( Column, Either, List, Maybe, NonEmpty, These )
, Shape1
, Shape2
, IsStructure
)
where
import Data.Kind ( Type )
import Prelude
import qualified Rel8.Schema.Kind as K
import Rel8.Schema.Spec ( Spec )
type Structure :: K.Context
data Structure a
type Shape :: Type
data Shape
= Column Spec
| Either Type Type
| List Type
| Maybe Type
| NonEmpty Type
| These Type Type
type Shape1 :: (a -> Shape) -> a -> Type
data Shape1 shape a
type Shape2 :: (a -> b -> Shape) -> a -> b -> Type
data Shape2 shape a b
type IsStructure :: Type -> Bool
type family IsStructure a where
IsStructure (Shape1 _ _) = 'True
IsStructure (Shape2 _ _ _) = 'True
IsStructure (_, _) = 'True
IsStructure (_, _, _) = 'True
IsStructure (_, _, _, _) = 'True
IsStructure (_, _, _, _, _) = 'True
IsStructure _ = 'False