anything 0.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 (5) hide show
  1. data/README.md +74 -0
  2. data/Rakefile +44 -0
  3. data/lib/anything.rb +9 -0
  4. data/test/test_anything.rb +39 -0
  5. metadata +58 -0
@@ -0,0 +1,74 @@
1
+ Anything
2
+ ========
3
+
4
+ Anything is a simple Ruby object with two significant facets to its behaviour:
5
+
6
+ 1. `Anything === a` is true for all values of `a`.
7
+ 2. `Anything == a` is also true for all values of `a`.
8
+
9
+ It therefore follows that:
10
+
11
+ case a
12
+ when Anything
13
+ :always
14
+ else
15
+ :never
16
+ end
17
+
18
+ will always evaluate to `:always`, and that:
19
+
20
+ case [a, b]
21
+ when ["X", Anything]
22
+ :x
23
+ when [Anything, "Y"]
24
+ :y
25
+ else
26
+ :z
27
+ end
28
+
29
+ is equivalent to:
30
+
31
+ if a == "X"
32
+ :x
33
+ elsif b == "Y"
34
+ :y
35
+ else
36
+ :z
37
+ end
38
+
39
+ These properties let us take nested code like:
40
+
41
+ case platform
42
+ when "linux"
43
+ case architecture
44
+ when /i\d86/
45
+ "linux_x86"
46
+ when "x86_64"
47
+ "linux_amd64"
48
+ else
49
+ raise "unsupported architecture"
50
+ end
51
+ when "darwin"
52
+ "mac"
53
+ else
54
+ raise "unsupported platform"
55
+ end
56
+
57
+ and rewrite it using a pattern-matching idiom:
58
+
59
+ require "anything"
60
+
61
+ case [platform, architecture]
62
+ when ["linux", /i\d86/]
63
+ "linux_32_bit"
64
+ when ["linux", "x86_64"]
65
+ "linux_64_bit"
66
+ when ["linux", Anything]
67
+ raise "unsupported architecture"
68
+ when ["darwin", Anything]
69
+ "mac"
70
+ else
71
+ raise "unsupported platform"
72
+ end
73
+
74
+ Whether it's actually useful or not is left to you to decide.
@@ -0,0 +1,44 @@
1
+ require "rubygems"
2
+ require "rake/gempackagetask"
3
+ require "rake/testtask"
4
+
5
+ task :default => [:test]
6
+
7
+ Rake::TestTask.new("test") do |t|
8
+ t.libs << "test"
9
+ t.pattern = "test/**/test_*.rb"
10
+ t.verbose = true
11
+ end
12
+
13
+ task :default => :test
14
+
15
+ require "rake/testtask"
16
+ Rake::TestTask.new do |t|
17
+ t.libs << "test"
18
+ t.test_files = FileList["test/**/*_test.rb"]
19
+ t.verbose = true
20
+ end
21
+
22
+ spec = Gem::Specification.new do |s|
23
+ s.name = "anything"
24
+ s.version = "0.0.1"
25
+ s.summary = "An object that matches anything. May be useful for pattern matching in case statements."
26
+ s.author = "Paul Battley"
27
+ s.email = "pbattley@gmail.com"
28
+
29
+ s.has_rdoc = false
30
+
31
+ s.files = %w(Rakefile README.md) + Dir.glob("{bin,test,lib}/**/*")
32
+ s.executables = FileList["bin/**"].map { |f| File.basename(f) }
33
+
34
+ s.require_paths = ["lib"]
35
+ end
36
+
37
+ Rake::GemPackageTask.new(spec) do |pkg|
38
+ pkg.gem_spec = spec
39
+ end
40
+
41
+ desc 'Clear out generated packages'
42
+ task :clean => [:clobber_package] do
43
+ rm "#{spec.name}.gemspec"
44
+ end
@@ -0,0 +1,9 @@
1
+ Anything = Object.new
2
+
3
+ def Anything.===(other)
4
+ true
5
+ end
6
+
7
+ def Anything.==(other)
8
+ true
9
+ end
@@ -0,0 +1,39 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), "..", "lib")
2
+ require "test/unit"
3
+ require "anything"
4
+
5
+ class AnythingTest < Test::Unit::TestCase
6
+
7
+ def test_should_match_in_case_when_alone
8
+ actual =
9
+ case "foo"
10
+ when Anything
11
+ :expected
12
+ else
13
+ :unexpected
14
+ end
15
+ assert_equal :expected, actual
16
+ end
17
+
18
+ def test_should_match_in_case_when_in_array
19
+ actual =
20
+ case ["foo", "bar"]
21
+ when ["foo", Anything]
22
+ :expected
23
+ else
24
+ :unexpected
25
+ end
26
+ assert_equal :expected, actual
27
+ end
28
+
29
+ def test_should_match_in_case_when_in_nested_array
30
+ actual =
31
+ case ["foo", ["bar", "baz"]]
32
+ when ["foo", ["bar", Anything]]
33
+ :expected
34
+ else
35
+ :unexpected
36
+ end
37
+ assert_equal :expected, actual
38
+ end
39
+ end
metadata ADDED
@@ -0,0 +1,58 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: anything
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Paul Battley
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-01-04 00:00:00 +00:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: pbattley@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - Rakefile
26
+ - README.md
27
+ - test/test_anything.rb
28
+ - lib/anything.rb
29
+ has_rdoc: true
30
+ homepage:
31
+ licenses: []
32
+
33
+ post_install_message:
34
+ rdoc_options: []
35
+
36
+ require_paths:
37
+ - lib
38
+ required_ruby_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: "0"
43
+ version:
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: "0"
49
+ version:
50
+ requirements: []
51
+
52
+ rubyforge_project:
53
+ rubygems_version: 1.3.5
54
+ signing_key:
55
+ specification_version: 3
56
+ summary: An object that matches anything. May be useful for pattern matching in case statements.
57
+ test_files: []
58
+