As I’ve found myself repeatedly writing a bit of code that looked vaguely like this:
get :: SomeArrow String (Maybe Thing) foo :: [Thing] -> FooThing . . . getAToZ :: SomeArrow () (Maybe FooThing) getAToZ = proc () -> do m_a <- get -< "a" m_b <- get -< "b" . . . m_z <- get -< "z" returnA -< do a <- m_a b <- m_b . . . z <- m_z return $ foo [a,b . . . z]
It seemed that there would have to be a way to automate this. So I wrote this MaybeArrow (careful, I’m still using 6.8.2 so it’s the old arrows with ‘pure’.). I know that there is already an ErrorArrow. But ErrorArrow as far as I can see requires ArrowChoice, and I’m not doing that. In the MaybeArrow, if an earlier computation throws a Nothing, then later computations are still allowed to perform side effects, although their outputs are snuffed, which is the behavior I want.
I would appreciate any constructive feedback.
If you’re wondering the use case has to do with waiting on several separate pieces of information to arrive from a server and combining them into one output message.