module Sound.SC3.Server.NRT.Edit where
import Data.List
import qualified Data.List.Ordered as L
import Sound.OSC
import Sound.SC3.Server.Command
import Sound.SC3.Server.NRT
insertBy_post :: (a -> a -> Ordering) -> a -> [a] -> [a]
insertBy_post cmp e l =
case l of
[] -> [e]
h:l' -> case cmp e h of
LT -> e : l
_ -> h : insertBy_post cmp e l'
insert_post :: Bundle -> [Bundle] -> [Bundle]
insert_post = insertBy_post compare
at_last :: (a -> b) -> (a -> b) -> [a] -> [b]
at_last f g x =
case x of
[] -> []
[i] -> [g i]
i:x' -> f i : at_last f g x'
nrt_merge :: NRT -> NRT -> NRT
nrt_merge (NRT p) (NRT q) = NRT (L.merge p q)
nrt_merge_set :: [NRT] -> NRT
nrt_merge_set = foldr nrt_merge nrt_empty
nrt_empty :: NRT
nrt_empty = NRT []
nrt_insert_pre :: Bundle -> NRT -> NRT
nrt_insert_pre p (NRT q) = NRT (insert p q)
nrt_insert_post :: Bundle -> NRT -> NRT
nrt_insert_post p (NRT q) = NRT (insert_post p q)
nrt_end_time :: NRT -> Time
nrt_end_time = bundleTime . last . nrt_bundles
bundle_map :: (Time -> Time) -> ([Message] -> [Message]) -> Bundle -> Bundle
bundle_map t_f m_f (Bundle t m) = Bundle (t_f t) (m_f m)
nrt_close :: NRT -> NRT
nrt_close (NRT l) =
let is_nrt_end_msg = (== "/nrt_end") . messageAddress
rem_end_msg = bundle_map id (filter (not . is_nrt_end_msg))
req_end_msg = let f m = if any is_nrt_end_msg m
then m
else m ++ [nrt_end]
in bundle_map id f
in NRT (at_last rem_end_msg req_end_msg l)