# MatchApproximation

#### trait MatchApproximation extends TreeAndTypeAnalysis with ScalaLogic with MatchTreeMaking

Source
MatchAnalysis.scala
Linear Supertypes
Known Subclasses
Ordering
1. Alphabetic
2. By inheritance
Inherited
1. MatchApproximation
2. MatchTreeMaking
3. MatchCodeGen
4. ScalaLogic
5. Logic
6. Interface
7. TreeDSL
8. TreeAndTypeAnalysis
9. Debugging
10. AnyRef
11. Any
Implicitly
2. by StringFormat
3. by Ensuring
4. by ArrowAssoc
1. Hide All
2. Show all
Visibility
1. Public
2. All

### Type Members

1. #### trait CheckableTreeAndTypeAnalysis extends AnyRef

Definition Classes
TreeAndTypeAnalysis
2. #### trait CodegenCore extends MatchMonadInterface

Definition Classes
MatchCodeGen
3. #### trait MatchApproximator extends TreeMakers with TreesAndTypesDomain

Represent a match as a formula in propositional logic that encodes whether the match matches (abstractly: we only consider types)

4. #### 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:

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))
}```
Definition Classes
Interface
5. #### trait OptimizedCodegen extends CodegenCore with TypedSubstitution with MatchMonadInterface

Definition Classes
MatchCodeGen
6. #### trait PropositionalLogic extends AnyRef

Definition Classes
Logic
7. #### trait PureCodegen extends CodegenCore with PureMatchMonadInterface

Definition Classes
MatchCodeGen

Definition Classes
MatchCodeGen
9. #### final case class Suppression(exhaustive: Boolean, unreachable: Boolean) extends Product with Serializable

Definition Classes
MatchTreeMaking
10. #### trait TreeMakers extends TypedSubstitution with CodegenCore

Definition Classes
MatchTreeMaking
11. #### trait TreesAndTypesDomain extends PropositionalLogic with CheckableTreeAndTypeAnalysis

Definition Classes
ScalaLogic
12. #### trait TypedSubstitution extends MatchMonadInterface

Definition Classes
Interface

### Abstract Value Members

1. #### abstract val global: Global

Definition Classes
TreeDSL

### 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
This member is added by an implicit conversion from MatchApproximation to any2stringadd[MatchApproximation] performed by method any2stringadd in scala.Predef.
Definition Classes
4. #### def ->[B](y: B): (MatchApproximation, B)

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

Definition Classes
AnyRef → Any
6. #### object CODE

Definition Classes
TreeDSL
7. #### object Suppression extends Serializable

Definition Classes
MatchTreeMaking
8. #### def alignAcrossRows(xss: List[List[AnyRef]], sep: String, lineSep: String = "\n"): String

Definition Classes
Logic
9. #### final def asInstanceOf[T0]: T0

Definition Classes
Any
10. #### def binderTypeImpliedByPattern(pat: Global.Tree, pt: Global.Type, binder: Global.Symbol): Global.Type

Compute the type T implied for a value `v` matched by a pattern `pat` (with expected type `pt`).

Compute the type T implied for a value `v` matched by a pattern `pat` (with expected type `pt`).

Usually, this is the pattern's type because pattern matching implies instance-of checks.

However, Stable Identifier and Literal patterns are matched using `==`, which does not imply a type for the binder that binds the matched value.

See SI-1503, SI-5024: don't cast binders to types we're not sure they have

TODO: update spec as follows (deviation between `**`):

A pattern binder x@p consists of a pattern variable x and a pattern p. The type of the variable x is the static type T **IMPLIED BY** the pattern p. This pattern matches any value v matched by the pattern p **Deleted: , provided the run-time type of v is also an instance of T, ** and it binds the variable name to that value.

Addition: A pattern `p` _implies_ a type `T` if the pattern matches only values of the type `T`.

Definition Classes
TreeAndTypeAnalysis
11. #### def clone(): AnyRef

Attributes
protected[java.lang]
Definition Classes
AnyRef
Annotations
@throws( ... )
12. #### final def dealiasWiden(tp: Global.Type): Global.Type

Attributes
protected
Definition Classes
Interface
13. #### object debug

Definition Classes
Debugging
14. #### def ensuring(cond: (MatchApproximation) ⇒ Boolean, msg: ⇒ Any): MatchApproximation

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

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

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

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

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

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

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

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

Definition Classes
AnyRef → Any
23. #### final def hasStableSymbol(p: Global.Tree): Boolean

Attributes
protected
Definition Classes
Interface
24. #### def hashCode(): Int

Definition Classes
AnyRef → Any
25. #### def instanceOfTpImplies(tp: Global.Type, tpImplied: Global.Type): Boolean

Definition Classes
TreeAndTypeAnalysis
26. #### final def isInstanceOf[T0]: Boolean

Definition Classes
Any
27. #### final def mkFALSE: Global.Literal

Attributes
protected
Definition Classes
Interface
28. #### final def mkTRUE: Global.Literal

Attributes
protected
Definition Classes
Interface
29. #### final def ne(arg0: AnyRef): Boolean

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

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

Definition Classes
AnyRef
32. #### def sameValue(a: Global.Tree, b: Global.Tree): Boolean

Definition Classes
TreeAndTypeAnalysis
33. #### final def synchronized[T0](arg0: ⇒ T0): T0

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

Definition Classes
AnyRef → Any
35. #### object vpmName

Definition Classes
Interface
36. #### final def wait(): Unit

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

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

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

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