The pruning combinator is used to block a computation waiting for a result from another computation, and/or to terminate a computation. 

!!Syntax: 

{{{E <P< E}}}

!Associativity: Left

The pruning combinator is left associative: F <x< G <y< H is equivalent to (F <x< G) <y< H. 

!Precedence: [parallel | Parallel] > pruning > otherwise

The pruning combinator has lower precedence than the parallel combinator: F <x< G | H is equivalent to F <x< (G | H).


!!Semantics
The execution of F <x< G starts by executing F and G in parallel. Whenever F publishes a value, that value is published by the entire execution. When G publishes its first value, that value is bound to x in F, and then the execution of G is immediately [terminated | ExampleTerminatedReferencePage]. 

During the execution of F, any part of the execution that depends on x will be [suspended | ExampleSuspensionReferencePage] until x is bound (to the first value published by G). 


The pruning combinator may include a full pattern P instead of just a variable name. Any value published by G is matched against the pattern P. If this match is successful, then G terminates and all of the bindings of the pattern P are made in F. Otherwise, the published value is simply ignored and G continues to execute.



Examples

[{orc runnable='false'

-- Publish either 5 or 6, but not both
x+2 <x< (3 | 4)

}]

[{orc runnable='false'

-- Query Google and Yahoo for a search result
-- Print out the result that arrives first; ignore the other result
println(result) <result< ( Google("cupcake") | Yahoo("cupcake") )

}]