module Sound.SC3.UGen.UGen.Lift where

import Sound.SC3.UGen.UGen
import Sound.SC3.UGen.UId

-- | Lift base UGen to monadic form.
liftU :: (UId m) =>
         (Int -> a -> UGen) ->
         (a -> m UGen)
liftU f a = do
  n <- generateUId
  return (f n a)

-- | Lift base UGen to monadic form.
liftU2 :: (UId m) =>
          (Int -> a -> b -> UGen) ->
          (a -> b -> m UGen)
liftU2 f a b = do
  n <- generateUId
  return (f n a b)

-- | Lift base UGen to monadic form.
liftU3 :: (UId m) =>
          (Int -> a -> b -> c -> UGen) ->
          (a -> b -> c -> m UGen)
liftU3 f a b c = do
  n <- generateUId
  return (f n a b c)

-- | Lift base UGen to monadic form.
liftU4 :: (UId m) =>
          (Int -> a -> b -> c -> d -> UGen) ->
          (a -> b -> c -> d -> m UGen)
liftU4 f a b c d = do
  n <- generateUId
  return (f n a b c d)