{-# language TupleSections #-}

module Rel8.Query.Opaleye
  ( fromOpaleye
  , toOpaleye
  , mapOpaleye
  , zipOpaleyeWith
  , unsafePeekQuery
  )
where

-- base
import Control.Applicative ( liftA2 )
import Prelude

-- opaleye
import qualified Opaleye.Internal.QueryArr as Opaleye
import qualified Opaleye.Internal.Tag as Opaleye

-- rel8
import {-# SOURCE #-} Rel8.Query ( Query( Query ) )


fromOpaleye :: Opaleye.Select a -> Query a
fromOpaleye :: forall a. Select a -> Query a
fromOpaleye = forall a. ([PrimExpr] -> Select (Any, a)) -> Query a
Query forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (f :: * -> *) a. Applicative f => a -> f a
pure


toOpaleye :: Query a -> Opaleye.Select a
toOpaleye :: forall a. Query a -> Select a
toOpaleye (Query [PrimExpr] -> Select (Any, a)
a) = forall a b. (a, b) -> b
snd forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [PrimExpr] -> Select (Any, a)
a forall a. Monoid a => a
mempty


mapOpaleye :: (Opaleye.Select a -> Opaleye.Select b) -> Query a -> Query b
mapOpaleye :: forall a b. (Select a -> Select b) -> Query a -> Query b
mapOpaleye Select a -> Select b
f (Query [PrimExpr] -> Select (Any, a)
a) = forall a. ([PrimExpr] -> Select (Any, a)) -> Query a
Query (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b m.
(Select a -> Select b) -> Select (m, a) -> Select (m, b)
mapping Select a -> Select b
f) [PrimExpr] -> Select (Any, a)
a)


zipOpaleyeWith :: ()
  => (Opaleye.Select a -> Opaleye.Select b -> Opaleye.Select c)
  -> Query a -> Query b -> Query c
zipOpaleyeWith :: forall a b c.
(Select a -> Select b -> Select c) -> Query a -> Query b -> Query c
zipOpaleyeWith Select a -> Select b -> Select c
f (Query [PrimExpr] -> Select (Any, a)
a) (Query [PrimExpr] -> Select (Any, b)
b) = forall a. ([PrimExpr] -> Select (Any, a)) -> Query a
Query forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (forall m a b c.
Semigroup m =>
(Select a -> Select b -> Select c)
-> Select (m, a) -> Select (m, b) -> Select (m, c)
zipping Select a -> Select b -> Select c
f) [PrimExpr] -> Select (Any, a)
a [PrimExpr] -> Select (Any, b)
b


unsafePeekQuery :: Query a -> a
unsafePeekQuery :: forall a. Query a -> a
unsafePeekQuery (Query [PrimExpr] -> Select (Any, a)
q) = case [PrimExpr] -> Select (Any, a)
q forall a. Monoid a => a
mempty of
  Select (Any, a)
f -> case forall a b. QueryArr a b -> a -> Tag -> (b, PrimQueryArr, Tag)
Opaleye.runStateQueryArr Select (Any, a)
f () Tag
Opaleye.start of
    ((Any
_, a
a), PrimQueryArr
_, Tag
_) -> a
a


mapping :: ()
  => (Opaleye.Select a -> Opaleye.Select b)
  -> Opaleye.Select (m, a) -> Opaleye.Select (m, b)
mapping :: forall a b m.
(Select a -> Select b) -> Select (m, a) -> Select (m, b)
mapping Select a -> Select b
f Select (m, a)
q = forall a b. (a -> Tag -> (b, PrimQueryArr, Tag)) -> QueryArr a b
Opaleye.stateQueryArr forall a b. (a -> b) -> a -> b
$ \()
_ Tag
tag ->
  let
    ((m
m, a
_), PrimQueryArr
_, Tag
_) = forall a b. QueryArr a b -> a -> Tag -> (b, PrimQueryArr, Tag)
Opaleye.runStateQueryArr Select (m, a)
q () Tag
tag
    q' :: QueryArr () (m, b)
q' = (m
m,) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Select a -> Select b
f (forall a b. (a, b) -> b
snd forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Select (m, a)
q)
  in
    forall a b. QueryArr a b -> a -> Tag -> (b, PrimQueryArr, Tag)
Opaleye.runStateQueryArr QueryArr () (m, b)
q' () Tag
tag


zipping :: Semigroup m
  => (Opaleye.Select a -> Opaleye.Select b -> Opaleye.Select c)
  -> Opaleye.Select (m, a) -> Opaleye.Select (m, b) -> Opaleye.Select (m, c)
zipping :: forall m a b c.
Semigroup m =>
(Select a -> Select b -> Select c)
-> Select (m, a) -> Select (m, b) -> Select (m, c)
zipping Select a -> Select b -> Select c
f Select (m, a)
q Select (m, b)
q' =
  forall a b. (a -> Tag -> (b, PrimQueryArr, Tag)) -> QueryArr a b
Opaleye.stateQueryArr forall a b. (a -> b) -> a -> b
$ \()
_ Tag
tag ->
    let
      ((m
m, a
_), PrimQueryArr
_, Tag
_) = forall a b. QueryArr a b -> a -> Tag -> (b, PrimQueryArr, Tag)
Opaleye.runStateQueryArr Select (m, a)
q () Tag
tag
      ((m
m', b
_), PrimQueryArr
_, Tag
_) = forall a b. QueryArr a b -> a -> Tag -> (b, PrimQueryArr, Tag)
Opaleye.runStateQueryArr Select (m, b)
q' () Tag
tag
      m'' :: m
m'' = m
m forall a. Semigroup a => a -> a -> a
<> m
m'
      q'' :: QueryArr () (m, c)
q'' = (m
m'',) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Select a -> Select b -> Select c
f (forall a b. (a, b) -> b
snd forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Select (m, a)
q) (forall a b. (a, b) -> b
snd forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Select (m, b)
q')
    in
      forall a b. QueryArr a b -> a -> Tag -> (b, PrimQueryArr, Tag)
Opaleye.runStateQueryArr QueryArr () (m, c)
q'' () Tag
tag