{-# language FlexibleContexts #-}
{-# language MonoLocalBinds #-}

module Rel8.Query.Each
  ( each
  )
where

-- base
import Prelude

-- opaleye
import qualified Opaleye.Table as Opaleye

-- rel8
import Rel8.Query ( Query )
import Rel8.Query.Opaleye ( fromOpaleye )
import Rel8.Schema.Name ( Selects )
import Rel8.Schema.Table ( TableSchema )
import Rel8.Table.Cols ( fromCols, toCols )
import Rel8.Table.Opaleye ( table, unpackspec )


-- | Select each row from a table definition. This is equivalent to @FROM
-- table@.
each :: Selects names exprs => TableSchema names -> Query exprs
each :: forall names exprs.
Selects names exprs =>
TableSchema names -> Query exprs
each =
  forall (f :: Context) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (context :: Context) a.
Table context a =>
Cols context (Columns a) -> a
fromCols forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  forall a. Select a -> Query a
fromOpaleye forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  forall tablefields fields a.
Unpackspec tablefields fields
-> Table a tablefields -> Select fields
Opaleye.selectTableExplicit forall a. Table Expr a => Unpackspec a a
unpackspec forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  forall names exprs.
Selects names exprs =>
TableSchema names -> Table exprs exprs
table forall b c a. (b -> c) -> (a -> b) -> a -> c
.
  forall (f :: Context) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (context :: Context) a.
Table context a =>
a -> Cols context (Columns a)
toCols