{-# 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 :: SelectArr a a rebind = ((a, Tag) -> (a, Lateral -> PrimQuery -> PrimQuery, Tag)) -> SelectArr a a forall a b. ((a, Tag) -> (b, Lateral -> PrimQuery -> PrimQuery, Tag)) -> SelectArr a b QueryArr (\(a a, Tag tag) -> let (a b, [(Symbol, PrimExpr)] bindings) = PM [(Symbol, PrimExpr)] a -> (a, [(Symbol, PrimExpr)]) forall a r. PM [a] r -> (r, [a]) PM.run (Unpackspec a a -> (PrimExpr -> StateT ([(Symbol, PrimExpr)], Int) Identity PrimExpr) -> a -> PM [(Symbol, PrimExpr)] a forall (f :: * -> *) columns b. Applicative f => Unpackspec columns b -> (PrimExpr -> f PrimExpr) -> columns -> f b runUnpackspec Unpackspec a a forall (p :: * -> * -> *) a b. Default p a b => p a b def (String -> Tag -> PrimExpr -> StateT ([(Symbol, PrimExpr)], Int) Identity PrimExpr forall primExpr. String -> Tag -> primExpr -> PM [(Symbol, primExpr)] PrimExpr PM.extractAttr String "rebind" Tag tag) a a) in (a b, \Lateral _ -> Bool -> [(Symbol, PrimExpr)] -> PrimQuery -> PrimQuery forall a. Bool -> [(Symbol, PrimExpr)] -> PrimQuery' a -> PrimQuery' a PQ.Rebind Bool True [(Symbol, PrimExpr)] bindings, Tag -> Tag Tag.next Tag tag))