module Sound.SC3.UGen.UGen.Lift where

import Sound.SC3.UGen.UGen
import Sound.SC3.UGen.UId
import System.IO.Unsafe

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

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

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

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

-- | Lift monadic UGen to unsafe form.
liftP :: (a -> IO UGen) -> (a -> UGen)
liftP f a = unsafePerformIO (f a)

-- | Lift monadic UGen to unsafe form.
liftP2 :: (a -> b -> IO UGen) -> (a -> b -> UGen)
liftP2 f a b = unsafePerformIO (f a b)

-- | Lift monadic UGen to unsafe form.
liftP3 :: (a -> b -> c -> IO UGen) -> (a -> b -> c -> UGen)
liftP3 f a b c = unsafePerformIO (f a b c)

-- | Lift monadic UGen to unsafe form.
liftP4 :: (a -> b -> c -> d -> IO UGen) -> (a -> b -> c -> d -> UGen)
liftP4 f a b c d = unsafePerformIO (f a b c d)