hosc-0.2: Sound/OpenSoundControl/Transport.hs
module Sound.OpenSoundControl.Transport ( Transport(..)
, withTransport
, wait ) where
import Sound.OpenSoundControl.OSC
import Control.Exception
-- | Abstract over the underlying transport protocol.
class Transport t where
-- | Encode and send an OSC packet.
send :: t -> OSC -> IO ()
-- | Receive and decode an OSC packet.
recv :: t -> IO OSC
-- | Close an existing connection.
close :: t -> IO ()
-- | Does the OSC message have the specified address.
hasAddress :: String -> OSC -> Bool
hasAddress addr o = maybe False (== addr) (address o)
-- | Repeat action until predicate holds on result.
untilM :: Monad m => (a -> Bool) -> m a -> m a
untilM p act = recurse
where recurse = act >>= (\r -> if p r then return r else recurse)
-- | Wait for an OSC message with the specified address,
-- discarding intervening messages.
wait :: Transport t => t -> String -> IO OSC
wait t s = untilM (hasAddress s) (recv t)
-- | Bracket OSC communication.
withTransport :: Transport t => IO t -> (t -> IO a) -> IO a
withTransport u = bracket u close