Module: Fusion::AST::Pattern

Defined in:
lib/fusion/ast.rb,
lib/fusion/ast.rb

Constant Summary collapse

PLit =

literal pattern

TypedData.define(value: Atom)
PErr =

! or !pat ; inner=PWild matches any error

TypedData.define(inner: Pattern)
PBind =

binds

TypedData.define(name: Identifier)
PWild =

_

TypedData.define(dummy: NilClass)
PArr =

[PatternItem|PatternRest], at most one rest

TypedData.define(items: ->(v) {                                                   # [PatternItem|PatternRest], at most one rest
  v.is_a?(Array) &&
    v.all? { |e| PatternItem === e || PatternRest === e } &&
    v.count { |e| PatternRest === e } <= 1
})
PObj =

[PatternPair|PatternRest], one rest, distinct keys

TypedData.define(pairs: ->(v) {                                                   # [PatternPair|PatternRest], one rest, distinct keys
  v.is_a?(Array) &&
    v.all? { |m| PatternPair === m || PatternRest === m } &&
    v.count { |m| PatternRest === m } <= 1 &&
    v.filter_map { |m| m.key if PatternPair === m }.then { |keys| keys.uniq.size == keys.size }
})
PGuard =

inner ? predicate

TypedData.define(inner: Pattern, pred_expr: Expression)