hsc3-0.15: Sound/SC3/UGen/UId.hs
-- | Unique identifier class for use by non-deterministic (noise) and
-- non-sharable (demand) unit generators.
module Sound.SC3.UGen.UId where
import Control.Applicative {- base -}
import Control.Monad {- base -}
import Control.Monad.IO.Class as M {- transformers -}
import Control.Monad.Trans.Reader {- transformers -}
import Data.Unique {- base -}
import Sound.OSC.Transport.FD as T {- hosc -}
import Sound.SC3.UGen.Type
-- | A class indicating a monad that will generate a sequence of
-- unique integer identifiers.
class (Functor m,Applicative m,M.MonadIO m) => UId m where
generateUId :: m Int
generateUId = fmap hashUnique (M.liftIO newUnique)
instance UId IO where
generateUId = liftM hashUnique newUnique
instance (T.Transport t,Functor io,Applicative io,MonadIO io) =>
UId (ReaderT t io) where
generateUId = ReaderT (M.liftIO . const generateUId)
-- * Lift
-- | Unary function.
type Fn1 a b = a -> b
-- | Binary function.
type Fn2 a b c = a -> b -> c
-- | Ternary function.
type Fn3 a b c d = a -> b -> c -> d
-- | Quaternary function.
type Fn4 a b c d e = a -> b -> c -> d -> e
-- | Unary UId lift.
liftUId :: UId m => (Int -> Fn1 a b) -> Fn1 a (m b)
liftUId f a = do
n <- generateUId
return (f n a)
-- | Binary UId lift.
liftUId2 :: UId m => (Int -> Fn2 a b c) -> Fn2 a b (m c)
liftUId2 f a b = do
n <- generateUId
return (f n a b)
-- | Ternary UId lift.
liftUId3 :: UId m => (Int -> Fn3 a b c d) -> Fn3 a b c (m d)
liftUId3 f a b c = do
n <- generateUId
return (f n a b c)
-- | Quaternary UId lift.
liftUId4 :: UId m => (Int -> Fn4 a b c d e) -> Fn4 a b c d (m e)
liftUId4 f a b c d = do
n <- generateUId
return (f n a b c d)
-- * Clone
-- | Clone a unit generator (mce . replicateM).
clone :: (UId m) => Int -> m UGen -> m UGen
clone n = liftM mce . replicateM n