call-me 0.0.1.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/call-me/pattern-matching.rb +51 -4
  2. metadata +7 -7
@@ -8,19 +8,66 @@
8
8
  # 0. You just DO WHAT THE FUCK YOU WANT TO.
9
9
  #++
10
10
 
11
+ require 'refining'
12
+
11
13
  class Module
12
14
  private
13
15
 
16
+ def __pattern_match (name)
17
+ pattern_matched = (__pattern_matched__[name] ||= {})
18
+ pattern_matched[@__to_pattern_match__ || :default] = instance_method(name)
19
+
20
+ remove_instance_variable :@__to_pattern_match__ if @__to_pattern_match__
21
+
22
+ define_method name do |*args, &block|
23
+ pattern_matched.each {|signature, body|
24
+ return body.bind(self).call(*args, &block) if (if signature.is_a?(Proc)
25
+ if !body.parameters.empty? && signature.parameters.empty?
26
+ names = body.parameters.map { |p| p[1] }
27
+ arguments = args.dup
28
+
29
+ if names.last.nil?
30
+ names[-1] = :rest
31
+ arguments[names.length - 1] = arguments.pop(names.length)
32
+ end
33
+
34
+ Struct.new(*names).new(*arguments).instance_exec &signature
35
+ else
36
+ instance_exec *args, &signature
37
+ end
38
+ else
39
+ signature == args
40
+ end)
41
+ }
42
+
43
+ return pattern_matched[:default].bind(self).call(*args, &block) if pattern_matched[:default]
44
+
45
+ raise ArgumentError, "non-exhaustive patterns"
46
+ end
47
+ end
48
+
49
+ def __pattern_matched__
50
+ @__pattern_matched__ ||= {}
51
+ end
52
+
53
+ def is_pattern_matched? (name)
54
+ __pattern_matched__.has_key?(name)
55
+ end
56
+
57
+ def def_pattern (*sign)
58
+ @__to_pattern_match__ = sign.first.is_a?(Proc) ? sign.first : sign
59
+ end
60
+
14
61
  public
15
62
 
16
63
  def define_pattern_matched (name, default = nil, matchers)
17
64
  define_method name do |*args|
18
65
  matchers.each {|signature, body|
19
- if signature.is_a?(Proc)
20
- return instance_exec *args, &body if signature.call(*args)
66
+ return instance_exec *args, &body if (if signature.is_a?(Proc)
67
+ signature.call(*args)
21
68
  else
22
- return instance_exec *args, &body if (signature.is_a?(Array) ? signature : [signature]) == args
23
- end
69
+ (signature.is_a?(Array) ? signature : [signature]) == args
70
+ end)
24
71
  }
25
72
 
26
73
  return instance_exec *args, &default if default
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: call-me
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2011-12-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: refining
16
- requirement: &15926480 !ruby/object:Gem::Requirement
16
+ requirement: &19370140 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *15926480
24
+ version_requirements: *19370140
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rake
27
- requirement: &15925580 !ruby/object:Gem::Requirement
27
+ requirement: &19383280 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *15925580
35
+ version_requirements: *19383280
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &15924740 !ruby/object:Gem::Requirement
38
+ requirement: &19382020 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *15924740
46
+ version_requirements: *19382020
47
47
  description:
48
48
  email: meh@paranoici.org
49
49
  executables: []