Packages

t

scala.tools.nsc.transform.patmat.Interface

MatchMonadInterface

trait MatchMonadInterface extends AnyRef

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))
}
Source
PatternMatching.scala
Linear Supertypes
AnyRef, Any
Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. MatchMonadInterface
  2. AnyRef
  3. Any
Implicitly
  1. by any2stringadd
  2. by StringFormat
  3. by Ensuring
  4. by ArrowAssoc
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. All

Abstract Value Members

  1. abstract val typer: (analyzer)#Typer

Concrete Value Members

  1. val matchOwner: Global.Symbol
  2. def pureType(tp: Global.Type): Global.Type
  3. def reportMissingCases(pos: Global.Position, counterExamples: List[String]): Unit
  4. def reportUnreachable(pos: Global.Position): Unit