On Sat, Jul 9, 2011 at 3:58 AM, Henning Thielemann
<lemming@henning-thielemann.de> wrote:
My stream processors are not Arrows, because 'first' cannot be implemented. However, 'arr' and '.' can be implemented.
Currently I have build the two tasks into one stream processor. I would like to split these into two processors. This looks difficult to me, since the first stream processor (for management of pressed keys) must provide a state (the set of pressed keys) whenever the second stream processor (for clock generation) needs it.
For event-stream processing, ArrowChoice is closer to what you need, i.e. using a sum type instead of a product type. This isn't a new idea: Yampa is pretty much implemented that way. It seems your current 'streamed' package does not provide equivalent functions, so I'll just provide a list of useful operators:
type :+: = Either -- in the simple case
left :: T a a -> T (a :+: b) (a' :+: b)
right :: T b b' -> T (a :+: b) (a:+: b')
merge :: T (a :+: a) a
mirror :: T (a :+: b) (b :+: a)
assocl :: T (a :+: (b :+: c)) ((a :+: b) :+: c)
assocr :: T ((a :+: b) :+: c) (a :+: (b :+: c))
inl :: T a (a :+: b)
inr :: T b (a :+: b)
Control.Category (id, (.))
(|||) :: T a c -> T b c -> T (a :+: b) c
(|||) f g = (f +++ g) >>> merge
(+++) :: T a a' -> T b b' -> T (a :+: b) (a' :+: b')
(+++) f g = left f >>> right g
This will give you that extra dimension of composability you seem to be wishing for, allow you to split events across separate processors.
Regards,
David