module LambdaDesigner.Lib
( topRunner
, run
, run2
) where
import LambdaDesigner.Op
import LambdaDesigner.OSC
import Control.Monad.Trans.State
import Data.IORef
import Data.List
import Data.Trie
import Sound.OSC.Transport.FD
import qualified Sound.OSC as OSC
run :: (Op a) => IORef Messages -> [Tree a] -> IO ()
run state tree = run2 state tree ([] :: [Tree TOP])
run2 :: (Op a, Op b) => IORef Messages -> [Tree a] -> [Tree b] -> IO ()
run2 state tas tbs = do
state' <- readIORef state
ms <- execStateT (mapM_ (\t -> do parseTree "" t) tas) mempty
ms' <- execStateT (mapM_ (\t -> do parseTree "" t) tbs) ms
let state'' = unionR state' ms'
msgs = makeMessages state'
msgs' = makeMessages ms'
isCommand (OSC.Message _ ((OSC.ASCII_String "command"):(OSC.ASCII_String "pulse"):(OSC.ASCII_String "loadonstartpulse"):_)) = True
isCommand _ = False
cmds = filter isCommand msgs'
writeIORef state state''
conn <- OSC.openUDP "127.0.0.1" 9002
sendMessages conn (sort $ msgs')
close conn
return ()
topRunner :: IO (Tree TOP -> IO ())
topRunner = do init <- newIORef mempty
return $ run init . (:[]) . outT