Hi guys,

I am trying to simplify some code.

A user provides a combination of boolean expressions and for each expression an async task is run until that expression becomes true. 
The boolean expressions have type (Event e => e -> Bool) eg (PC.availableFlag .&&. "asmith" .== PC.userId) 

Unfortunately the way I have coded this, the user needs to include the \r -> r ? for each expression,
with a unique number indicating the position in the sequence (so I can keep track of the asyncs when restarting after a failure).
The 'r' function just wraps the expression in a Concurrently constructor.

r :: (forall e.Event e => (e -> Bool) -> Concurrently e) -> Concurrently a

Here is a sample expression that someone might provide:

expr1 = runit (\r -> (,) <$> 
           r 1 (PC.availableFlag .&&. "asmith" .== PC.userId) 
       <*> 
           r 2 (22 .== SC.signalNumber)) 
           
So, is there a way to rewrite or simplify this to avoid having to pass the r + unique Int to each subexpression?
Or, is there a different format that I can write this in and then transform to the Concurrently applicative?

Here is the runit method:
runit expr = runConcurrently (expr (Concurrently  . queryToIOAction))

And some more sample queries:
expr1 = runit (\r -> r (PC.availableFlag .&&. "asmith" .== PC.userId))

expr2 = runit (\r -> (,) <$> 
           r 1 (PC.availableFlag .&&. "asmith" .== PC.userId) 
       <*> 
           r 2 (22 .== SC.signalNumber)) 

expr3 = runit (\r -> (\(a b -> 
       Left (a,b)) <$> 
            r 1 (PC.availableFlag .&&. "asmith" .== PC.userId) -- (Event e => e -> Bool)
        <*> r 2 (2 .== SC.signalNumber))
   <|> 
       Right <$> r 3 (1 .== SC.signalNumber))
        
Thanks for any help!
Grant