case 0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +42 -0
- data/lib/case.rb +75 -0
- data/test/test_all.rb +0 -0
- metadata +47 -0
data/Rakefile
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
require 'rake/gempackagetask'
|
5
|
+
require 'rake/clean'
|
6
|
+
|
7
|
+
GEM_VERSION = "0.1"
|
8
|
+
|
9
|
+
Rake::RDocTask.new do |task|
|
10
|
+
task.rdoc_files.add [ 'lib/**/*.rb' ]
|
11
|
+
end
|
12
|
+
|
13
|
+
task :clobber => [ :clean ]
|
14
|
+
|
15
|
+
Rake::TestTask.new do |task|
|
16
|
+
task.ruby_opts << '-rrubygems'
|
17
|
+
task.libs << 'lib'
|
18
|
+
task.libs << 'test'
|
19
|
+
task.test_files = [ "test/test_all.rb" ]
|
20
|
+
task.verbose = true
|
21
|
+
end
|
22
|
+
|
23
|
+
gemspec = Gem::Specification.new do |gemspec|
|
24
|
+
gemspec.name = "case"
|
25
|
+
gemspec.version = GEM_VERSION
|
26
|
+
gemspec.author = "MenTaLguY <mental@rydia.net>"
|
27
|
+
gemspec.summary = "Pattern matching for Ruby"
|
28
|
+
gemspec.test_file = 'test/test_all.rb'
|
29
|
+
gemspec.files = FileList[ 'Rakefile', 'test/*.rb', 'lib/**/*.rb' ]
|
30
|
+
gemspec.require_paths = [ 'lib' ]
|
31
|
+
gemspec.has_rdoc = true
|
32
|
+
gemspec.platform = Gem::Platform::RUBY
|
33
|
+
end
|
34
|
+
|
35
|
+
task :package => [ :clean, :test ]
|
36
|
+
Rake::GemPackageTask.new( gemspec ) do |task|
|
37
|
+
task.gem_spec = gemspec
|
38
|
+
task.need_tar = true
|
39
|
+
end
|
40
|
+
|
41
|
+
task :default => [ :clean, :test ]
|
42
|
+
|
data/lib/case.rb
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
# case.rb - pattern matching for Ruby
|
2
|
+
#
|
3
|
+
# Copyright 2008 MenTaLguY <mental@rydia.net>
|
4
|
+
#
|
5
|
+
# This library is made available under the same terms as Ruby.
|
6
|
+
#
|
7
|
+
|
8
|
+
module Case
|
9
|
+
|
10
|
+
# Like regular Struct, except that Struct#=== performs a structural match
|
11
|
+
class Struct < ::Struct
|
12
|
+
def ===(other)
|
13
|
+
return false unless self.class == other.class
|
14
|
+
zip(other) { |a, b| return false unless a === b }
|
15
|
+
true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Pattern-matching disjunction
|
20
|
+
class Any
|
21
|
+
class << self
|
22
|
+
alias_method :[], :new
|
23
|
+
end
|
24
|
+
|
25
|
+
def initialize(*options)
|
26
|
+
@options = options
|
27
|
+
end
|
28
|
+
|
29
|
+
def options
|
30
|
+
@options.dup
|
31
|
+
end
|
32
|
+
|
33
|
+
def ===(obj)
|
34
|
+
@options.any? { |e| e === obj }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Pattern-matches with an Array or Tuple
|
39
|
+
class Sequence
|
40
|
+
class << self
|
41
|
+
alias_method :[], :new
|
42
|
+
end
|
43
|
+
|
44
|
+
def initialize(*elements)
|
45
|
+
@elements = elements
|
46
|
+
end
|
47
|
+
|
48
|
+
def elements
|
49
|
+
@elements.dup
|
50
|
+
end
|
51
|
+
|
52
|
+
def ===(other)
|
53
|
+
return false unless Tuple === other or Array === other
|
54
|
+
return false unless @elements.size == other.size
|
55
|
+
@elements.zip(other) { |a, b| return false unless a === b }
|
56
|
+
true
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
class Predicate
|
61
|
+
def initialize(&predicate)
|
62
|
+
@predicate = predicate
|
63
|
+
end
|
64
|
+
|
65
|
+
def ===(other)
|
66
|
+
@predicate.call other
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Shorthand for Case::Sequence.[]
|
71
|
+
def self.[](*args)
|
72
|
+
Sequence[*args]
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
data/test/test_all.rb
ADDED
File without changes
|
metadata
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
rubygems_version: 0.8.11
|
3
|
+
specification_version: 1
|
4
|
+
name: case
|
5
|
+
version: !ruby/object:Gem::Version
|
6
|
+
version: "0.1"
|
7
|
+
date: 2008-01-15 00:00:00 -05:00
|
8
|
+
summary: Pattern matching for Ruby
|
9
|
+
require_paths:
|
10
|
+
- lib
|
11
|
+
email:
|
12
|
+
homepage:
|
13
|
+
rubyforge_project:
|
14
|
+
description:
|
15
|
+
autorequire:
|
16
|
+
default_executable:
|
17
|
+
bindir: bin
|
18
|
+
has_rdoc: true
|
19
|
+
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">"
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.0.0
|
24
|
+
version:
|
25
|
+
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
authors:
|
29
|
+
- MenTaLguY <mental@rydia.net>
|
30
|
+
files:
|
31
|
+
- Rakefile
|
32
|
+
- test/test_all.rb
|
33
|
+
- lib/case.rb
|
34
|
+
test_files:
|
35
|
+
- test/test_all.rb
|
36
|
+
rdoc_options: []
|
37
|
+
|
38
|
+
extra_rdoc_files: []
|
39
|
+
|
40
|
+
executables: []
|
41
|
+
|
42
|
+
extensions: []
|
43
|
+
|
44
|
+
requirements: []
|
45
|
+
|
46
|
+
dependencies: []
|
47
|
+
|