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.
Files changed (4) hide show
  1. data/Rakefile +42 -0
  2. data/lib/case.rb +75 -0
  3. data/test/test_all.rb +0 -0
  4. metadata +47 -0
@@ -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
+
@@ -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
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
+