{-# LANGUAGE FlexibleContexts #-}

module Opaleye.SQLite.Table (module Opaleye.SQLite.Table,
                      View,
                      Writer,
                      Table(Table),
                      TableProperties) where

import           Opaleye.SQLite.Internal.Column (Column(Column))
import qualified Opaleye.SQLite.Internal.QueryArr as Q
import qualified Opaleye.SQLite.Internal.Table as T
import           Opaleye.SQLite.Internal.Table (View(View), Table, Writer,
                                         TableProperties)
import qualified Opaleye.SQLite.Internal.TableMaker as TM
import qualified Opaleye.SQLite.Internal.Tag as Tag

import qualified Data.Profunctor.Product.Default as D

import qualified Opaleye.SQLite.Internal.HaskellDB.PrimQuery as HPQ

-- | Example type specialization:
--
-- @
-- queryTable :: Table w (Column a, Column b) -> Query (Column a, Column b)
-- @
--
-- Assuming the @makeAdaptorAndInstance@ splice has been run for the
-- product type @Foo@:
--
-- @
-- queryTable :: Table w (Foo (Column a) (Column b) (Column c)) -> Query (Foo (Column a) (Column b) (Column c))
-- @
queryTable :: D.Default TM.ColumnMaker columns columns =>
              Table a columns -> Q.Query columns
queryTable :: Table a columns -> Query columns
queryTable = ColumnMaker columns columns -> Table a columns -> Query columns
forall tablecolumns columns a.
ColumnMaker tablecolumns columns
-> Table a tablecolumns -> Query columns
queryTableExplicit ColumnMaker columns columns
forall (p :: * -> * -> *) a b. Default p a b => p a b
D.def

queryTableExplicit :: TM.ColumnMaker tablecolumns columns ->
                     Table a tablecolumns -> Q.Query columns
queryTableExplicit :: ColumnMaker tablecolumns columns
-> Table a tablecolumns -> Query columns
queryTableExplicit ColumnMaker tablecolumns columns
cm Table a tablecolumns
table = (((), Tag) -> (columns, PrimQuery, Tag)) -> Query columns
forall a b. ((a, Tag) -> (b, PrimQuery, Tag)) -> QueryArr a b
Q.simpleQueryArr ((), Tag) -> (columns, PrimQuery, Tag)
f where
  f :: ((), Tag) -> (columns, PrimQuery, Tag)
f ((), Tag
t0) = (columns
retwires, PrimQuery
primQ, Tag -> Tag
Tag.next Tag
t0) where
    (columns
retwires, PrimQuery
primQ) = ColumnMaker tablecolumns columns
-> Table a tablecolumns -> Tag -> (columns, PrimQuery)
forall viewColumns columns writerColumns.
ColumnMaker viewColumns columns
-> Table writerColumns viewColumns -> Tag -> (columns, PrimQuery)
T.queryTable ColumnMaker tablecolumns columns
cm Table a tablecolumns
table Tag
t0

required :: String -> TableProperties (Column a) (Column a)
required :: String -> TableProperties (Column a) (Column a)
required String
columnName = Writer (Column a) (Column a)
-> View (Column a) -> TableProperties (Column a) (Column a)
forall writerColumns viewColumns.
Writer writerColumns viewColumns
-> View viewColumns -> TableProperties writerColumns viewColumns
T.TableProperties
  (String -> Writer (Column a) (Column a)
forall a. String -> Writer (Column a) (Column a)
T.required String
columnName)
  (Column a -> View (Column a)
forall columns. columns -> View columns
View (PrimExpr -> Column a
forall a. PrimExpr -> Column a
Column (String -> PrimExpr
HPQ.BaseTableAttrExpr String
columnName)))

optional :: String -> TableProperties (Maybe (Column a)) (Column a)
optional :: String -> TableProperties (Maybe (Column a)) (Column a)
optional String
columnName = Writer (Maybe (Column a)) (Column a)
-> View (Column a) -> TableProperties (Maybe (Column a)) (Column a)
forall writerColumns viewColumns.
Writer writerColumns viewColumns
-> View viewColumns -> TableProperties writerColumns viewColumns
T.TableProperties
  (String -> Writer (Maybe (Column a)) (Column a)
forall a. String -> Writer (Maybe (Column a)) (Column a)
T.optional String
columnName)
  (Column a -> View (Column a)
forall columns. columns -> View columns
View (PrimExpr -> Column a
forall a. PrimExpr -> Column a
Column (String -> PrimExpr
HPQ.BaseTableAttrExpr String
columnName)))