class PatternMatch::PatternSetDeconstructor

Public Class Methods

new(klass, *subpatterns) click to toggle source
Calls superclass method PatternMatch::Pattern::new
# File lib/pattern-match/experimental.rb, line 134
def initialize(klass, *subpatterns)
  super(*subpatterns)
  @klass = klass
end

Public Instance Methods

match(vals) click to toggle source
Calls superclass method PatternMatch::Pattern#match
# File lib/pattern-match/experimental.rb, line 139
def match(vals)
  super do |val|
    next false unless val.kind_of?(@klass)
    members = val.to_a
    next false unless subpatterns.length <= members.length
    members.permutation(subpatterns.length).find do |perm|
      cont = nil
      if callcc {|c| cont = c; perm.zip(subpatterns).all? {|i, pat| pat.match([i]) } }
        save_choice_point(cont)
        true
      else
        false
      end
    end
  end
end