module Sound.SC3.UGen.Protect where
import Sound.SC3.UGen.Identifier
import Sound.SC3.UGen.Type
import Sound.SC3.UGen.UGen
ugenIds :: UGen -> [UGenId]
ugenIds =
let f u = case u of
Primitive_U p -> [ugenId p]
_ -> []
in ugenFoldr ((++) . f) []
atUGenId :: (Int -> Int) -> UGenId -> UGenId
atUGenId f z =
case z of
NoId -> NoId
UId i -> UId (f i)
uprotect :: ID a => a -> UGen -> UGen
uprotect e =
let e' = idHash e
f u = case u of
Primitive_U p -> Primitive_U (p {ugenId = atUGenId (+ e') (ugenId p)})
_ -> u
in ugenTraverse f
uprotect' :: ID a => a -> [UGen] -> [UGen]
uprotect' e =
let n = map (+ idHash e) [1..]
in zipWith uprotect n
uclone' :: ID a => a -> Int -> UGen -> [UGen]
uclone' e n = uprotect' e . replicate n
uclone :: ID a => a -> Int -> UGen -> UGen
uclone e n = mce . uclone' e n
ucompose :: ID a => a -> [UGen -> UGen] -> UGen -> UGen
ucompose e xs =
let go [] u = u
go ((f,k):f') u = go f' (uprotect k (f u))
in go (zip xs [idHash e ..])
useq :: ID a => a -> Int -> (UGen -> UGen) -> UGen -> UGen
useq e n f = ucompose e (replicate n f)