+encode :: MTaskMessage -> String
+encode (MTSds i v) = "s" +++ to16bit i +++ v
+encode (MTTask to data) = "t" +++ to16bit to +++ toString (size data) +++ data
+encode (MTPub i v) = "u" +++ to16bit i +++ v
+encode (MTUpd i v) = "u" +++ to16bit i +++ v
+
+decode :: String -> MTaskMessage
+decode x = case x.[0] of
+ 'u' = MTUpd (toInt x.[1]) (x % (2,4))
+ _ = abort ("Didn't understand message: " +++ x)
+
+safePrint :: String -> String
+safePrint s = join " " [saf c\\c<-:s]
+ where
+ saf c = "\x" +++ toString (toInt c)
+
+derive gPrint MTaskMessage
+instance toString MTaskMessage where
+ toString (MTSds i v) = "Sds id: " +++ toString i
+ +++ " value " +++ safePrint v
+ toString (MTTask to data) = "Task timeout: " +++ toString to
+ +++ " data " +++ safePrint data
+ toString (MTPub i v) = "Publish id: " +++ toString i
+ +++ " value " +++ safePrint v
+ toString (MTUpd i v) = "Update id: " +++ toString i
+ +++ " value " +++ safePrint v
+