{-# 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 :: Select a -> Query a
fromOpaleye = ([PrimExpr] -> Select (Any, a)) -> Query a
forall a. ([PrimExpr] -> Select (Any, a)) -> Query a
Query (([PrimExpr] -> Select (Any, a)) -> Query a)
-> (Select a -> [PrimExpr] -> Select (Any, a))
-> Select a
-> Query a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Select (Any, a) -> [PrimExpr] -> Select (Any, a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Select (Any, a) -> [PrimExpr] -> Select (Any, a))
-> (Select a -> Select (Any, a))
-> Select a
-> [PrimExpr]
-> Select (Any, a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> (Any, a)) -> Select a -> Select (Any, a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> (Any, a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure


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


mapOpaleye :: (Opaleye.Select a -> Opaleye.Select b) -> Query a -> Query b
mapOpaleye :: (Select a -> Select b) -> Query a -> Query b
mapOpaleye Select a -> Select b
f (Query [PrimExpr] -> Select (Any, a)
a) = ([PrimExpr] -> Select (Any, b)) -> Query b
forall a. ([PrimExpr] -> Select (Any, a)) -> Query a
Query ((Select (Any, a) -> Select (Any, b))
-> ([PrimExpr] -> Select (Any, a)) -> [PrimExpr] -> Select (Any, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Select a -> Select b) -> Select (Any, a) -> Select (Any, b)
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 :: (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) = ([PrimExpr] -> Select (Any, c)) -> Query c
forall a. ([PrimExpr] -> Select (Any, a)) -> Query a
Query (([PrimExpr] -> Select (Any, c)) -> Query c)
-> ([PrimExpr] -> Select (Any, c)) -> Query c
forall a b. (a -> b) -> a -> b
$ (Select (Any, a) -> Select (Any, b) -> Select (Any, c))
-> ([PrimExpr] -> Select (Any, a))
-> ([PrimExpr] -> Select (Any, b))
-> [PrimExpr]
-> Select (Any, c)
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 ((Select a -> Select b -> Select c)
-> Select (Any, a) -> Select (Any, b) -> Select (Any, c)
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 :: Query a -> a
unsafePeekQuery (Query [PrimExpr] -> Select (Any, a)
q) = case [PrimExpr] -> Select (Any, a)
q [PrimExpr]
forall a. Monoid a => a
mempty of
  Select (Any, a)
f -> case Select (Any, a) -> () -> Tag -> ((Any, a), PrimQueryArr, Tag)
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 :: (Select a -> Select b) -> Select (m, a) -> Select (m, b)
mapping Select a -> Select b
f Select (m, a)
q = (() -> Tag -> ((m, b), PrimQueryArr, Tag)) -> Select (m, b)
forall a b. (a -> Tag -> (b, PrimQueryArr, Tag)) -> QueryArr a b
Opaleye.stateQueryArr ((() -> Tag -> ((m, b), PrimQueryArr, Tag)) -> Select (m, b))
-> (() -> Tag -> ((m, b), PrimQueryArr, Tag)) -> Select (m, b)
forall a b. (a -> b) -> a -> b
$ \()
_ Tag
tag ->
  let
    ((m
m, a
_), PrimQueryArr
_, Tag
_) = Select (m, a) -> () -> Tag -> ((m, a), PrimQueryArr, Tag)
forall a b. QueryArr a b -> a -> Tag -> (b, PrimQueryArr, Tag)
Opaleye.runStateQueryArr Select (m, a)
q () Tag
tag
    q' :: Select (m, b)
q' = (m
m,) (b -> (m, b)) -> Select b -> Select (m, b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Select a -> Select b
f ((m, a) -> a
forall a b. (a, b) -> b
snd ((m, a) -> a) -> Select (m, a) -> Select a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Select (m, a)
q)
  in
    Select (m, b) -> () -> Tag -> ((m, b), PrimQueryArr, Tag)
forall a b. QueryArr a b -> a -> Tag -> (b, PrimQueryArr, Tag)
Opaleye.runStateQueryArr Select (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 :: (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' =
  (() -> Tag -> ((m, c), PrimQueryArr, Tag)) -> Select (m, c)
forall a b. (a -> Tag -> (b, PrimQueryArr, Tag)) -> QueryArr a b
Opaleye.stateQueryArr ((() -> Tag -> ((m, c), PrimQueryArr, Tag)) -> Select (m, c))
-> (() -> Tag -> ((m, c), PrimQueryArr, Tag)) -> Select (m, c)
forall a b. (a -> b) -> a -> b
$ \()
_ Tag
tag ->
    let
      ((m
m, a
_), PrimQueryArr
_, Tag
_) = Select (m, a) -> () -> Tag -> ((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
_) = Select (m, b) -> () -> Tag -> ((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 m -> m -> m
forall a. Semigroup a => a -> a -> a
<> m
m'
      q'' :: Select (m, c)
q'' = (m
m'',) (c -> (m, c)) -> Select c -> Select (m, c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Select a -> Select b -> Select c
f ((m, a) -> a
forall a b. (a, b) -> b
snd ((m, a) -> a) -> Select (m, a) -> Select a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Select (m, a)
q) ((m, b) -> b
forall a b. (a, b) -> b
snd ((m, b) -> b) -> Select (m, b) -> Select b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Select (m, b)
q')
    in
      Select (m, c) -> () -> Tag -> ((m, c), PrimQueryArr, Tag)
forall a b. QueryArr a b -> a -> Tag -> (b, PrimQueryArr, Tag)
Opaleye.runStateQueryArr Select (m, c)
q'' () Tag
tag