opaleye-0.9.1.0: src/Opaleye/Internal/Rebind.hs
{-# LANGUAGE FlexibleContexts #-}
module Opaleye.Internal.Rebind where
import Data.Profunctor.Product.Default (Default, def)
import Opaleye.Internal.Unpackspec (Unpackspec, runUnpackspec)
import Opaleye.Internal.QueryArr (SelectArr(QueryArr))
import qualified Opaleye.Internal.PackMap as PM
import qualified Opaleye.Internal.PrimQuery as PQ
import qualified Opaleye.Internal.Tag as Tag
rebind :: Default Unpackspec a a => SelectArr a a
rebind = rebindExplicit def
rebindExplicit :: Unpackspec a b -> SelectArr a b
rebindExplicit = rebindExplicitPrefix "rebind"
rebindExplicitPrefix :: String -> Unpackspec a b -> SelectArr a b
rebindExplicitPrefix prefix u = QueryArr $ \a -> do
tag <- Tag.fresh
let (b, bindings) = PM.run (runUnpackspec u (PM.extractAttr prefix tag) a)
pure (b, PQ.aRebind bindings)