module Csound.Typed.Control.SERef where
import Control.Monad
import Control.Monad.Trans.Class
import Csound.Dynamic hiding (newLocalVars)
import Csound.Typed.Types.Tuple
import Csound.Typed.GlobalState
-- | It describes a reference to mutable values.
data SERef a = SERef
{ writeSERef :: a -> SE ()
, readSERef :: SE a }
-- | Allocates a new mutable value and initializes it with value.
-- A reference can contain a tuple of variables.
newSERef :: Tuple a => a -> SE (SERef a)
newSERef t = do
vars <- newLocalVars (tupleRates t) (fromTuple t)
let wr a = fromDep_ $ (zipWithM_ writeVar vars) =<< lift (fromTuple a)
re = fmap toTuple $ fromDep $ mapM readVar vars
return (SERef wr re)
-- | An alias for the function @newSERef@. It returns not the reference
-- to mutable value but a pair of reader and writer functions.
sensorsSE :: Tuple a => a -> SE (SE a, a -> SE ())
sensorsSE a = do
ref <- newSERef a
return $ (readSERef ref, writeSERef ref)