{- | An instance of 'Haskore.Interface.SuperCollider.Channel.T' using environment variables. Since we need writing of variables, we need "System.Posix.Env" module rather than the generic "System.Environment". -} module Haskore.Interface.SuperCollider.Channel.Env where import qualified Haskore.Interface.SuperCollider.Channel as ChannelMng import Haskore.Interface.SuperCollider.Channel (Channel, NumberChannels) import System.Posix.Env (setEnv, getEnv) import Data.Char (isDigit) manager :: ChannelMng.T IO manager = ChannelMng.Cons next reset next :: NumberChannels -> IO Channel next inc = do maybeNumStr <- getEnv envName let num = maybe ChannelMng.least (\numStr -> if all isDigit numStr then read numStr else ChannelMng.least) maybeNumStr setEnv envName (show (inc+num)) True return num reset :: IO () reset = setEnv envName (show ChannelMng.least) True envName :: String envName = "HaskoreSC3Channel"