module Sound.OSC.Packet where
import Data.List
import Sound.OSC.Datum
import Sound.OSC.Time
type Address_Pattern = String
data Message = Message {Message -> Address_Pattern
messageAddress :: !Address_Pattern
,Message -> [Datum]
messageDatum :: ![Datum]}
deriving (Message -> Message -> Bool
(Message -> Message -> Bool)
-> (Message -> Message -> Bool) -> Eq Message
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Message -> Message -> Bool
$c/= :: Message -> Message -> Bool
== :: Message -> Message -> Bool
$c== :: Message -> Message -> Bool
Eq,ReadPrec [Message]
ReadPrec Message
Int -> ReadS Message
ReadS [Message]
(Int -> ReadS Message)
-> ReadS [Message]
-> ReadPrec Message
-> ReadPrec [Message]
-> Read Message
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Message]
$creadListPrec :: ReadPrec [Message]
readPrec :: ReadPrec Message
$creadPrec :: ReadPrec Message
readList :: ReadS [Message]
$creadList :: ReadS [Message]
readsPrec :: Int -> ReadS Message
$creadsPrec :: Int -> ReadS Message
Read,Int -> Message -> ShowS
[Message] -> ShowS
Message -> Address_Pattern
(Int -> Message -> ShowS)
-> (Message -> Address_Pattern)
-> ([Message] -> ShowS)
-> Show Message
forall a.
(Int -> a -> ShowS)
-> (a -> Address_Pattern) -> ([a] -> ShowS) -> Show a
showList :: [Message] -> ShowS
$cshowList :: [Message] -> ShowS
show :: Message -> Address_Pattern
$cshow :: Message -> Address_Pattern
showsPrec :: Int -> Message -> ShowS
$cshowsPrec :: Int -> Message -> ShowS
Show)
message :: Address_Pattern -> [Datum] -> Message
message :: Address_Pattern -> [Datum] -> Message
message Address_Pattern
a [Datum]
xs =
case Address_Pattern
a of
Char
'/':Address_Pattern
_ -> Address_Pattern -> [Datum] -> Message
Message Address_Pattern
a [Datum]
xs
Address_Pattern
_ -> Address_Pattern -> Message
forall a. HasCallStack => Address_Pattern -> a
error Address_Pattern
"message: ill-formed address pattern"
data Bundle = Bundle {Bundle -> Time
bundleTime :: !Time
,Bundle -> [Message]
bundleMessages :: ![Message]}
deriving (Bundle -> Bundle -> Bool
(Bundle -> Bundle -> Bool)
-> (Bundle -> Bundle -> Bool) -> Eq Bundle
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Bundle -> Bundle -> Bool
$c/= :: Bundle -> Bundle -> Bool
== :: Bundle -> Bundle -> Bool
$c== :: Bundle -> Bundle -> Bool
Eq,ReadPrec [Bundle]
ReadPrec Bundle
Int -> ReadS Bundle
ReadS [Bundle]
(Int -> ReadS Bundle)
-> ReadS [Bundle]
-> ReadPrec Bundle
-> ReadPrec [Bundle]
-> Read Bundle
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Bundle]
$creadListPrec :: ReadPrec [Bundle]
readPrec :: ReadPrec Bundle
$creadPrec :: ReadPrec Bundle
readList :: ReadS [Bundle]
$creadList :: ReadS [Bundle]
readsPrec :: Int -> ReadS Bundle
$creadsPrec :: Int -> ReadS Bundle
Read,Int -> Bundle -> ShowS
[Bundle] -> ShowS
Bundle -> Address_Pattern
(Int -> Bundle -> ShowS)
-> (Bundle -> Address_Pattern)
-> ([Bundle] -> ShowS)
-> Show Bundle
forall a.
(Int -> a -> ShowS)
-> (a -> Address_Pattern) -> ([a] -> ShowS) -> Show a
showList :: [Bundle] -> ShowS
$cshowList :: [Bundle] -> ShowS
show :: Bundle -> Address_Pattern
$cshow :: Bundle -> Address_Pattern
showsPrec :: Int -> Bundle -> ShowS
$cshowsPrec :: Int -> Bundle -> ShowS
Show)
instance Ord Bundle where
compare :: Bundle -> Bundle -> Ordering
compare (Bundle Time
a [Message]
_) (Bundle Time
b [Message]
_) = Time -> Time -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Time
a Time
b
bundle :: Time -> [Message] -> Bundle
bundle :: Time -> [Message] -> Bundle
bundle Time
t [Message]
xs =
case [Message]
xs of
[] -> Address_Pattern -> Bundle
forall a. HasCallStack => Address_Pattern -> a
error Address_Pattern
"bundle: empty?"
[Message]
_ -> Time -> [Message] -> Bundle
Bundle Time
t [Message]
xs
data Packet = Packet_Message {Packet -> Message
packetMessage :: !Message}
| Packet_Bundle {Packet -> Bundle
packetBundle :: !Bundle}
deriving (Packet -> Packet -> Bool
(Packet -> Packet -> Bool)
-> (Packet -> Packet -> Bool) -> Eq Packet
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Packet -> Packet -> Bool
$c/= :: Packet -> Packet -> Bool
== :: Packet -> Packet -> Bool
$c== :: Packet -> Packet -> Bool
Eq,ReadPrec [Packet]
ReadPrec Packet
Int -> ReadS Packet
ReadS [Packet]
(Int -> ReadS Packet)
-> ReadS [Packet]
-> ReadPrec Packet
-> ReadPrec [Packet]
-> Read Packet
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Packet]
$creadListPrec :: ReadPrec [Packet]
readPrec :: ReadPrec Packet
$creadPrec :: ReadPrec Packet
readList :: ReadS [Packet]
$creadList :: ReadS [Packet]
readsPrec :: Int -> ReadS Packet
$creadsPrec :: Int -> ReadS Packet
Read,Int -> Packet -> ShowS
[Packet] -> ShowS
Packet -> Address_Pattern
(Int -> Packet -> ShowS)
-> (Packet -> Address_Pattern)
-> ([Packet] -> ShowS)
-> Show Packet
forall a.
(Int -> a -> ShowS)
-> (a -> Address_Pattern) -> ([a] -> ShowS) -> Show a
showList :: [Packet] -> ShowS
$cshowList :: [Packet] -> ShowS
show :: Packet -> Address_Pattern
$cshow :: Packet -> Address_Pattern
showsPrec :: Int -> Packet -> ShowS
$cshowsPrec :: Int -> Packet -> ShowS
Show)
p_bundle :: Time -> [Message] -> Packet
p_bundle :: Time -> [Message] -> Packet
p_bundle Time
t = Bundle -> Packet
Packet_Bundle (Bundle -> Packet) -> ([Message] -> Bundle) -> [Message] -> Packet
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Time -> [Message] -> Bundle
bundle Time
t
p_message :: Address_Pattern -> [Datum] -> Packet
p_message :: Address_Pattern -> [Datum] -> Packet
p_message Address_Pattern
a = Message -> Packet
Packet_Message (Message -> Packet) -> ([Datum] -> Message) -> [Datum] -> Packet
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Address_Pattern -> [Datum] -> Message
message Address_Pattern
a
packetTime :: Packet -> Time
packetTime :: Packet -> Time
packetTime = (Message -> Time) -> (Bundle -> Time) -> Packet -> Time
forall a. (Message -> a) -> (Bundle -> a) -> Packet -> a
at_packet (Time -> Message -> Time
forall a b. a -> b -> a
const Time
immediately) Bundle -> Time
bundleTime
packetMessages :: Packet -> [Message]
packetMessages :: Packet -> [Message]
packetMessages = (Message -> [Message])
-> (Bundle -> [Message]) -> Packet -> [Message]
forall a. (Message -> a) -> (Bundle -> a) -> Packet -> a
at_packet Message -> [Message]
forall (m :: * -> *) a. Monad m => a -> m a
return Bundle -> [Message]
bundleMessages
packet_to_bundle :: Packet -> Bundle
packet_to_bundle :: Packet -> Bundle
packet_to_bundle = (Message -> Bundle) -> (Bundle -> Bundle) -> Packet -> Bundle
forall a. (Message -> a) -> (Bundle -> a) -> Packet -> a
at_packet (\Message
m -> Time -> [Message] -> Bundle
Bundle Time
immediately [Message
m]) Bundle -> Bundle
forall a. a -> a
id
packet_to_message :: Packet -> Maybe Message
packet_to_message :: Packet -> Maybe Message
packet_to_message Packet
p =
case Packet
p of
Packet_Bundle Bundle
b ->
case Bundle
b of
Bundle Time
t [Message
m] -> if Time
t Time -> Time -> Bool
forall a. Eq a => a -> a -> Bool
== Time
immediately then Message -> Maybe Message
forall a. a -> Maybe a
Just Message
m else Maybe Message
forall a. Maybe a
Nothing
Bundle
_ -> Maybe Message
forall a. Maybe a
Nothing
Packet_Message Message
m -> Message -> Maybe Message
forall a. a -> Maybe a
Just Message
m
packet_is_immediate :: Packet -> Bool
packet_is_immediate :: Packet -> Bool
packet_is_immediate = (Time -> Time -> Bool
forall a. Eq a => a -> a -> Bool
== Time
immediately) (Time -> Bool) -> (Packet -> Time) -> Packet -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Packet -> Time
packetTime
at_packet :: (Message -> a) -> (Bundle -> a) -> Packet -> a
at_packet :: (Message -> a) -> (Bundle -> a) -> Packet -> a
at_packet Message -> a
f Bundle -> a
g Packet
p =
case Packet
p of
Packet_Message Message
m -> Message -> a
f Message
m
Packet_Bundle Bundle
b -> Bundle -> a
g Bundle
b
message_has_address :: Address_Pattern -> Message -> Bool
message_has_address :: Address_Pattern -> Message -> Bool
message_has_address Address_Pattern
x = (Address_Pattern -> Address_Pattern -> Bool
forall a. Eq a => a -> a -> Bool
== Address_Pattern
x) (Address_Pattern -> Bool)
-> (Message -> Address_Pattern) -> Message -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Message -> Address_Pattern
messageAddress
bundle_has_address :: Address_Pattern -> Bundle -> Bool
bundle_has_address :: Address_Pattern -> Bundle -> Bool
bundle_has_address Address_Pattern
x = (Message -> Bool) -> [Message] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Address_Pattern -> Message -> Bool
message_has_address Address_Pattern
x) ([Message] -> Bool) -> (Bundle -> [Message]) -> Bundle -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Bundle -> [Message]
bundleMessages
packet_has_address :: Address_Pattern -> Packet -> Bool
packet_has_address :: Address_Pattern -> Packet -> Bool
packet_has_address Address_Pattern
x =
(Message -> Bool) -> (Bundle -> Bool) -> Packet -> Bool
forall a. (Message -> a) -> (Bundle -> a) -> Packet -> a
at_packet (Address_Pattern -> Message -> Bool
message_has_address Address_Pattern
x)
(Address_Pattern -> Bundle -> Bool
bundle_has_address Address_Pattern
x)
messagePP :: FP_Precision -> Message -> String
messagePP :: FP_Precision -> Message -> Address_Pattern
messagePP FP_Precision
p (Message Address_Pattern
a [Datum]
d) = let d' :: [Address_Pattern]
d' = (Datum -> Address_Pattern) -> [Datum] -> [Address_Pattern]
forall a b. (a -> b) -> [a] -> [b]
map (FP_Precision -> Datum -> Address_Pattern
datumPP FP_Precision
p) [Datum]
d in [Address_Pattern] -> Address_Pattern
unwords (Address_Pattern
a Address_Pattern -> [Address_Pattern] -> [Address_Pattern]
forall a. a -> [a] -> [a]
: [Address_Pattern]
d')
bundlePP :: FP_Precision -> Bundle -> String
bundlePP :: FP_Precision -> Bundle -> Address_Pattern
bundlePP FP_Precision
p (Bundle Time
t [Message]
m) = let m' :: [Address_Pattern]
m' = Address_Pattern -> [Address_Pattern] -> [Address_Pattern]
forall a. a -> [a] -> [a]
intersperse Address_Pattern
";" ((Message -> Address_Pattern) -> [Message] -> [Address_Pattern]
forall a b. (a -> b) -> [a] -> [b]
map (FP_Precision -> Message -> Address_Pattern
messagePP FP_Precision
p) [Message]
m) in [Address_Pattern] -> Address_Pattern
unwords (FP_Precision -> Time -> Address_Pattern
timePP FP_Precision
p Time
t Address_Pattern -> [Address_Pattern] -> [Address_Pattern]
forall a. a -> [a] -> [a]
: [Address_Pattern]
m')
packetPP :: FP_Precision -> Packet -> String
packetPP :: FP_Precision -> Packet -> Address_Pattern
packetPP FP_Precision
p Packet
pkt =
case Packet
pkt of
Packet_Message Message
m -> FP_Precision -> Message -> Address_Pattern
messagePP FP_Precision
p Message
m
Packet_Bundle Bundle
b -> FP_Precision -> Bundle -> Address_Pattern
bundlePP FP_Precision
p Bundle
b