{-# LANGUAGE Arrows #-}

module Opaleye.Label (
  label',
  -- * Deprecated
  label
  ) where

import qualified Opaleye.Internal.PrimQuery as PQ
import qualified Opaleye.Internal.QueryArr as Q
import qualified Opaleye.Select            as S

import           Control.Arrow (returnA)

-- | Add a commented label to the generated SQL.
label' :: String -> S.Select ()
label' :: String -> Select ()
label' String
l = (() -> State Tag ((), PrimQueryArr)) -> Select ()
forall a b. (a -> State Tag (b, PrimQueryArr)) -> SelectArr a b
Q.QueryArr () -> State Tag ((), PrimQueryArr)
forall (f :: * -> *). Applicative f => () -> f ((), PrimQueryArr)
f where
  f :: () -> f ((), PrimQueryArr)
f () = ((), PrimQueryArr) -> f ((), PrimQueryArr)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((), String -> PrimQueryArr
PQ.aLabel String
l)

-- | Will be deprecated in version 0.10.  Use 'label\'' instead.
label :: String -> S.SelectArr a b -> S.SelectArr a b
label :: String -> SelectArr a b -> SelectArr a b
label String
l SelectArr a b
s = proc a
a -> do
  b
b <- SelectArr a b
s -< a
a
  String -> Select ()
label' String
l -< ()
  SelectArr b b
forall (a :: * -> * -> *) b. Arrow a => a b b
returnA -< b
b