{-# LANGUAGE FlexibleContexts #-}
module Control.Eff.MySQL.Helper
  ( askLift0
  , askLift
  , askLift2
  , askLift3
  ) where

import Control.Eff (Eff, Member, SetMember)
import Control.Eff.Lift (Lift, lift)
import Control.Eff.Reader.Strict (Reader, ask)
import Data.Typeable (Typeable, Typeable1)

askLift0
  :: (Typeable a, Typeable1 m, SetMember Lift (Lift m) r, Member (Reader a) r)
  => (a -> m b) -> Eff r b
askLift0 f = ask >>= lift . f

askLift
  :: (Typeable a, Typeable1 m, SetMember Lift (Lift m) r, Member (Reader a) r)
  => (a -> t -> m b) -> t -> Eff r b
askLift f a = ask >>= \x -> lift (f x a)

askLift2
  :: (Typeable a, Typeable1 m, SetMember Lift (Lift m) r, Member (Reader a) r)
  => (a -> t -> t1 -> m b) -> t -> t1 -> Eff r b
askLift2 f a b = ask >>= \x -> lift (f x a b)

askLift3
  :: (Typeable a, Typeable1 m, SetMember Lift (Lift m) r, Member (Reader a) r)
  => (a -> t -> t1 -> t2 -> m b) -> t -> t1 -> t2 -> Eff r b
askLift3 f a b c = ask >>= \x -> lift (f x a b c)