packages feed

rel8-1.7.0.0: src/Rel8/Table/Cols.hs

{-# language DataKinds #-}
{-# language FlexibleInstances #-}
{-# language MultiParamTypeClasses #-}
{-# language StandaloneKindSignatures #-}
{-# language TypeFamilies #-}
{-# language TypeOperators #-}
{-# 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 a) = a
  fromColumns = Cols

  toResult (Cols a) = a
  fromResult = Cols


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


toCols :: Table context a => a -> Cols context (Columns a)
toCols = Cols . toColumns