module Csound.Typed.GlobalState.Cache(
Cache(..), HashKey,
CacheMidi, MidiKey(..), Channel, MidiType(..),
saveMidiKey, getMidiKey,
CacheMidiProc,
saveMidiProcKey, getMidiProcKey,
CacheMix, MixKey(..),
saveMixKey, getMixKey,
CacheMixProc,
saveMixProcKey, getMixProcKey,
CacheEvt, EvtKey(..),
saveEvtKey, getEvtKey,
CacheEvtProc,
saveEvtProcKey, getEvtProcKey
) where
import qualified Data.Map as M
import Data.Default
import Csound.Dynamic
data Cache m = Cache
{ cacheMidi :: CacheMidi
, cacheMidiProc :: CacheMidiProc m
, cacheMix :: CacheMix
, cacheMixProc :: CacheMixProc m
, cacheEvt :: CacheEvt
, cacheEvtProc :: CacheEvtProc m }
instance Default (Cache m) where
def = Cache def def def def def def
type HashKey = Int
type GetKey m a b = a -> Cache m -> Maybe b
type SaveKey m a b = a -> b -> Cache m -> Cache m
getKeyMap :: (Ord key) => (Cache m -> M.Map key val) -> GetKey m key val
getKeyMap f key x = M.lookup key $ f x
saveKeyMap :: (Ord key) => (Cache m -> M.Map key val) -> (M.Map key val -> Cache m -> Cache m) -> SaveKey m key val
saveKeyMap getter setter key val cache = setter (M.insert key val $ getter cache) cache
type Channel = Int
data MidiType = Massign | Pgmassign (Maybe Int)
deriving (Eq, Ord)
data MidiKey = MidiKey MidiType Channel HashKey
deriving (Eq, Ord)
type CacheMidi = M.Map MidiKey [E]
getMidiKey :: GetKey m MidiKey [E]
getMidiKey = getKeyMap cacheMidi
saveMidiKey :: SaveKey m MidiKey [E]
saveMidiKey = saveKeyMap cacheMidi (\a x -> x { cacheMidi = a })
type CacheMidiProc m = M.Map MidiKey (DepT m ())
getMidiProcKey :: GetKey m MidiKey (DepT m ())
getMidiProcKey = getKeyMap cacheMidiProc
saveMidiProcKey :: SaveKey m MidiKey (DepT m ())
saveMidiProcKey = saveKeyMap cacheMidiProc (\a x -> x { cacheMidiProc = a })
newtype MixKey = MixKey HashKey
deriving (Eq, Ord)
type MixVal = InstrId
type CacheMix = M.Map MixKey MixVal
getMixKey :: GetKey m MixKey MixVal
getMixKey = getKeyMap cacheMix
saveMixKey :: SaveKey m MixKey MixVal
saveMixKey = saveKeyMap cacheMix (\a x -> x { cacheMix = a })
type CacheMixProc m = M.Map MixKey (DepT m ())
getMixProcKey :: GetKey m MixKey (DepT m ())
getMixProcKey = getKeyMap cacheMixProc
saveMixProcKey :: SaveKey m MixKey (DepT m ())
saveMixProcKey = saveKeyMap cacheMixProc (\a x -> x { cacheMixProc = a })
data EvtKey = EvtKey HashKey HashKey
deriving (Eq, Ord)
type EvtVal = InstrId
type CacheEvt = M.Map EvtKey EvtVal
getEvtKey :: GetKey m EvtKey EvtVal
getEvtKey = getKeyMap cacheEvt
saveEvtKey :: SaveKey m EvtKey EvtVal
saveEvtKey = saveKeyMap cacheEvt (\a x -> x { cacheEvt = a })
type CacheEvtProc m = M.Map EvtKey (DepT m ())
getEvtProcKey :: GetKey m EvtKey (DepT m ())
getEvtProcKey = getKeyMap cacheEvtProc
saveEvtProcKey :: SaveKey m EvtKey (DepT m ())
saveEvtProcKey = saveKeyMap cacheEvtProc (\a x -> x { cacheEvtProc = a })