Interface with user-defined match monad? if there's a `__match` in scope, we use this as the match strategy, assuming it conforms to MatchStrategy as defined below:

```type Matcher[P[_], M[+_], A] = {
def flatMap[B](f: P[A] => M[B]): M[B]
def orElse[B >: A](alternative: => M[B]): M[B]
}

abstract class MatchStrategy[P[_], M[+_]] {
// runs the matcher on the given input
def runOrElse[T, U](in: P[T])(matcher: P[T] => M[U]): P[U]

def zero: M[Nothing]
def one[T](x: P[T]): M[T]
def guard[T](cond: P[Boolean], then: => P[T]): M[T]
}```

P and M are derived from one's signature (`def one[T](x: P[T]): M[T]`)

if no `__match` is found, we assume the following implementation (and generate optimized code accordingly)

```object __match extends MatchStrategy[({type Id[x] = x})#Id, Option] {
def zero = None
def one[T](x: T) = Some(x)
// NOTE: guard's return type must be of the shape M[T], where M is the monad in which the pattern match should be interpreted
def guard[T](cond: Boolean, then: => T): Option[T] = if(cond) Some(then) else None
def runOrElse[T, U](x: T)(f: T => Option[U]): U = f(x) getOrElse (throw new MatchError(x))
}```
Linear Supertypes
AnyRef, Any
Ordering
1. Alphabetic
2. By inheritance
Inherited
2. AnyRef
3. Any
Implicitly
2. by StringFormat
3. by Ensuring
4. by ArrowAssoc
1. Hide All
2. Show all
Visibility
1. Public
2. All

Attributes
protected

### Concrete Value Members

1. #### final def !=(arg0: AnyRef): Boolean

Definition Classes
AnyRef
2. #### final def !=(arg0: Any): Boolean

Definition Classes
Any
3. #### final def ##(): Int

Definition Classes
AnyRef → Any
4. #### def +(other: String): String

Implicit information
Definition Classes
5. #### def ->[B](y: B): (MatchMonadInterface, B)

Implicit information
This member is added by an implicit conversion from MatchMonadInterface to ArrowAssoc[MatchMonadInterface] performed by method ArrowAssoc in scala.Predef.
Definition Classes
ArrowAssoc
Annotations
@inline()
6. #### final def ==(arg0: AnyRef): Boolean

Definition Classes
AnyRef
7. #### final def ==(arg0: Any): Boolean

Definition Classes
Any
8. #### final def asInstanceOf[T0]: T0

Definition Classes
Any
9. #### def clone(): AnyRef

Attributes
protected[java.lang]
Definition Classes
AnyRef
Annotations
@throws( ... )

Implicit information
This member is added by an implicit conversion from MatchMonadInterface to Ensuring[MatchMonadInterface] performed by method Ensuring in scala.Predef.
Definition Classes
Ensuring

Implicit information
This member is added by an implicit conversion from MatchMonadInterface to Ensuring[MatchMonadInterface] performed by method Ensuring in scala.Predef.
Definition Classes
Ensuring
12. #### def ensuring(cond: Boolean, msg: ⇒ Any): MatchMonadInterface

Implicit information
This member is added by an implicit conversion from MatchMonadInterface to Ensuring[MatchMonadInterface] performed by method Ensuring in scala.Predef.
Definition Classes
Ensuring
13. #### def ensuring(cond: Boolean): MatchMonadInterface

Implicit information
This member is added by an implicit conversion from MatchMonadInterface to Ensuring[MatchMonadInterface] performed by method Ensuring in scala.Predef.
Definition Classes
Ensuring
14. #### final def eq(arg0: AnyRef): Boolean

Definition Classes
AnyRef
15. #### def equals(arg0: Any): Boolean

Definition Classes
AnyRef → Any
16. #### def finalize(): Unit

Attributes
protected[java.lang]
Definition Classes
AnyRef
Annotations
@throws( classOf[java.lang.Throwable] )
17. #### def formatted(fmtstr: String): String

Implicit information
This member is added by an implicit conversion from MatchMonadInterface to StringFormat[MatchMonadInterface] performed by method StringFormat in scala.Predef.
Definition Classes
StringFormat
Annotations
@inline()
18. #### final def getClass(): Class[_]

Definition Classes
AnyRef → Any
19. #### def hashCode(): Int

Definition Classes
AnyRef → Any
20. #### final def isInstanceOf[T0]: Boolean

Definition Classes
Any

23. #### final def ne(arg0: AnyRef): Boolean

Definition Classes
AnyRef
24. #### final def notify(): Unit

Definition Classes
AnyRef
25. #### final def notifyAll(): Unit

Definition Classes
AnyRef

28. #### final def synchronized[T0](arg0: ⇒ T0): T0

Definition Classes
AnyRef
29. #### def toString(): String

Definition Classes
AnyRef → Any
30. #### final def wait(): Unit

Definition Classes
AnyRef
Annotations
@throws( ... )
31. #### final def wait(arg0: Long, arg1: Int): Unit

Definition Classes
AnyRef
Annotations
@throws( ... )
32. #### final def wait(arg0: Long): Unit

Definition Classes
AnyRef
Annotations
@throws( ... )
33. #### def →[B](y: B): (MatchMonadInterface, B)

Implicit information
This member is added by an implicit conversion from MatchMonadInterface to ArrowAssoc[MatchMonadInterface] performed by method ArrowAssoc in scala.Predef.
Definition Classes
ArrowAssoc