{-# LANGUAGE FlexibleContexts #-}

module Opaleye.SQLite.Values where

import qualified Opaleye.SQLite.Internal.QueryArr as Q
import           Opaleye.SQLite.QueryArr (Query)
import           Opaleye.SQLite.Internal.Values as V
import qualified Opaleye.SQLite.Internal.Unpackspec as U

import           Data.Profunctor.Product.Default (Default, def)

-- | Example type specialization:
--
-- @
-- values :: [(Column a, Column b)] -> Query (Column a, Column b)
-- @
--
-- Assuming the @makeAdaptorAndInstance@ splice has been run for the
-- product type @Foo@:
--
-- @
-- queryTable :: [Foo (Column a) (Column b) (Column c)] -> Query (Foo (Column a) (Column b) (Column c))
-- @
values :: (Default V.Valuesspec columns columns,
           Default U.Unpackspec columns columns) =>
          [columns] -> Q.Query columns
values :: [columns] -> Query columns
values = Unpackspec columns columns
-> Valuesspec columns columns -> [columns] -> Query columns
forall columns columns'.
Unpackspec columns columns'
-> Valuesspec columns columns' -> [columns] -> Query columns'
valuesExplicit Unpackspec columns columns
forall (p :: * -> * -> *) a b. Default p a b => p a b
def Valuesspec columns columns
forall (p :: * -> * -> *) a b. Default p a b => p a b
def

valuesExplicit :: U.Unpackspec columns columns'
               -> V.Valuesspec columns columns'
               -> [columns] -> Query columns'
valuesExplicit :: Unpackspec columns columns'
-> Valuesspec columns columns' -> [columns] -> Query columns'
valuesExplicit Unpackspec columns columns'
unpack Valuesspec columns columns'
valuesspec [columns]
columns =
  (((), Tag) -> (columns', PrimQuery, Tag)) -> Query columns'
forall a b. ((a, Tag) -> (b, PrimQuery, Tag)) -> QueryArr a b
Q.simpleQueryArr (Unpackspec columns columns'
-> Valuesspec columns columns'
-> [columns]
-> ((), Tag)
-> (columns', PrimQuery, Tag)
forall columns columns'.
Unpackspec columns columns'
-> Valuesspec columns columns'
-> [columns]
-> ((), Tag)
-> (columns', PrimQuery, Tag)
V.valuesU Unpackspec columns columns'
unpack Valuesspec columns columns'
valuesspec [columns]
columns)