{-# language DataKinds #-}
{-# language FlexibleInstances #-}
{-# language MultiParamTypeClasses #-}
{-# language StandaloneKindSignatures #-}
{-# language TypeFamilies #-}
{-# language UndecidableInstances #-}

module Rel8.Table.Cols
  ( Cols( Cols )
  , fromCols
  , toCols
  )
where

-- base
import Data.Kind ( Type )
import Prelude

-- rel8
import qualified Rel8.Schema.Kind as K
import Rel8.Schema.HTable ( HTable )
import Rel8.Schema.Result ( Result )
import Rel8.Table ( Table(..) )


type Cols :: K.Context -> K.HTable -> Type
newtype Cols context columns = Cols (columns context)


instance (HTable columns, context ~ context') =>
  Table context' (Cols context columns)
 where
  type Columns (Cols context columns) = columns
  type Context (Cols context columns) = context
  type FromExprs (Cols context columns) = Cols Result columns
  type Transpose to (Cols context columns) = Cols to columns

  toColumns :: Cols context columns -> Columns (Cols context columns) context'
toColumns (Cols columns context
a) = columns context
Columns (Cols context columns) context'
a
  fromColumns :: Columns (Cols context columns) context' -> Cols context columns
fromColumns = Columns (Cols context columns) context' -> Cols context columns
forall (context :: Context) (columns :: HTable).
columns context -> Cols context columns
Cols

  toResult :: FromExprs (Cols context columns)
-> Columns (Cols context columns) Result
toResult (Cols a) = columns Result
Columns (Cols context columns) Result
a
  fromResult :: Columns (Cols context columns) Result
-> FromExprs (Cols context columns)
fromResult = Columns (Cols context columns) Result
-> FromExprs (Cols context columns)
forall (context :: Context) (columns :: HTable).
columns context -> Cols context columns
Cols


fromCols :: Table context a => Cols context (Columns a) -> a
fromCols :: Cols context (Columns a) -> a
fromCols (Cols Columns a context
a) = Columns a context -> a
forall (context :: Context) a.
Table context a =>
Columns a context -> a
fromColumns Columns a context
a


toCols :: Table context a => a -> Cols context (Columns a)
toCols :: a -> Cols context (Columns a)
toCols = Columns a context -> Cols context (Columns a)
forall (context :: Context) (columns :: HTable).
columns context -> Cols context columns
Cols (Columns a context -> Cols context (Columns a))
-> (a -> Columns a context) -> a -> Cols context (Columns a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Columns a context
forall (context :: Context) a.
Table context a =>
a -> Columns a context
toColumns