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

### Concrete Value Members

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

Definition Classes
AnyRef → Any
2. #### final def ##(): Int

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

Implicit information
Definition Classes
4. #### 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()
5. #### final def ==(arg0: Any): Boolean

Definition Classes
AnyRef → Any
6. #### final def asInstanceOf[T0]: T0

Definition Classes
Any
7. #### 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
10. #### 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
11. #### 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
12. #### final def eq(arg0: AnyRef): Boolean

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

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

Attributes
protected[java.lang]
Definition Classes
AnyRef
Annotations
@throws( classOf[java.lang.Throwable] )
15. #### 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()
16. #### final def getClass(): Class[_]

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

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

Definition Classes
Any

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

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

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

Definition Classes
AnyRef

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

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

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

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

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

Definition Classes
AnyRef
Annotations
@throws( ... )
31. #### 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