'Scala pipe patternmatching as a variable

Often it is required to execute the same code for multiple values. With match this can be done using | (pipe) operator:

val state = "stopped"
val value = 0
(state, value) match {
    case ("running" | "pending", 0)   => println("running with no value")
    case ("stopped" | "cancelled", 0) => println("not running; no value")
    case ("running" | "pending", _)   => println("running with a value")
    case ("stopped" | "cancelled", _) => println("not running with a value")
    case _                            => println("unknown state")
}

Is there a method to write the pipes as a variable, eg:

val runningStates    = "running" | "pending"
val nonRunningStates = "stopped" | "cancelled"

So I can use these in the above pattern matching:

(state, value) match {
    case (runningStates, 0)    => println("running with no value")
    case (nonRunningStates, 0) => println("not running; no value")
    case (runningStates, _)    => println("running with a value")
    case (nonRunningStates, _) => println("not running with a value")
    case _                     => println("unknown state")
}


Solution 1:[1]

The answer to your actual question is no, you can not write a pipe as a variable.

The Scala language reference in the Pattern Alternatives section (8.1.12) says:

A pattern alternative p1 | ... | pn consists of a number of alternative patterns pi. All alternative patterns are type checked with the expected type of the pattern. They may not bind variables other than wildcards. The alternative pattern matches a value v if at least one its alternatives matches v.

so the pipe | is not implemented in the library but it is interpreted by the Scala compiler and it is context sensitive to pattern matching.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 thepaoloboi