ruby-maybe 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: cadba4571e8ddf9c546222f3ca6824af468fe7d1
4
+ data.tar.gz: ddfe8a59d92210e65eab97a25d343affeac30a48
5
+ SHA512:
6
+ metadata.gz: 0e0a29cdbbc478a7f0f1ba59febf81577cffc27803a2d4585c422c3b93bf64475217f339a8da1c8b1847146fd0693a254cef5110b19222c0ee8983eeb5db125e
7
+ data.tar.gz: 783603c6b507eb8afd188e5ff92c23ff9b2f8dfa31660b8a2d8a9fb2cb090ab715e19968136ca470c724572644cfe37a8a7839b3737bd6f59c73f5469c560e47
data/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
 
7
7
  ## Description
8
8
 
9
- 'Maybe' not 'Maeby'. This is an implementation of the Maybe monad used in
9
+ 'Maybe' not 'Maeby'. This is an implementation of the 'Maybe' or 'Option' monad similar to that used
10
10
  [Haskell](http://www.haskell.org/haskellwiki/Maybe). Monads provide a
11
11
  safe way to create non deterministic programs (for example, when not all
12
12
  values are known at compile time). The Maybe monad allows programmers to
data/lib/ruby-maybe.rb CHANGED
@@ -1,10 +1,30 @@
1
1
  class Maybe
2
+ def method_missing(method_name, *args, &block)
3
+ if Maybe.method_defined?(method_name)
4
+ super
5
+ else
6
+ Maybe.new
7
+ end
8
+ end
9
+
2
10
  def bind(&block)
3
11
  Maybe.new
4
12
  end
5
13
  end
6
14
 
7
15
  class Just < Maybe
16
+ def method_missing(method_name, *args, &block)
17
+ if Just.method_defined?(method_name)
18
+ super
19
+ else
20
+ values = args.map { |arg|
21
+ return Nothing.new if arg == Nothing.new
22
+ arg.kind_of?(Just) ? arg.value : arg
23
+ }
24
+ Just.new(@value.public_send(method_name, *values, &block))
25
+ end
26
+ end
27
+
8
28
  def initialize(value)
9
29
  @value = value
10
30
  end
@@ -31,6 +51,14 @@ class Just < Maybe
31
51
  end
32
52
 
33
53
  class Nothing < Maybe
54
+ def method_missing(method_name, *args, &block)
55
+ if Nothing.method_defined?(method_name)
56
+ super
57
+ else
58
+ Nothing.new
59
+ end
60
+ end
61
+
34
62
  def bind
35
63
  Nothing.new
36
64
  end
data/ruby-maybe.gemspec CHANGED
@@ -3,7 +3,7 @@ $:.unshift lib unless $:.include?(lib)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "ruby-maybe"
6
- s.version = "0.0.2"
6
+ s.version = "0.1.0"
7
7
  s.platform = Gem::Platform::RUBY
8
8
  s.authors = ["Callum Stott"]
9
9
  s.email = ["callum.stott@me.com"]
@@ -7,6 +7,40 @@ describe "Just" do
7
7
  Just.new(5).bind { |val| Just.new(val * 2) }.must_equal Just.new(10)
8
8
  end
9
9
  end
10
+
11
+ describe "#==" do
12
+ it "returns false if the passed object is not a Just" do
13
+ (Just.new(5) == 5).must_equal false
14
+ end
15
+
16
+ it "returns true if the passed object is a Just with the same value" do
17
+ (Just.new(5) == Just.new(5)).must_equal true
18
+ end
19
+ end
20
+
21
+ describe "method lifting" do
22
+ it "allows using a method for the contained type" do
23
+ just = Just.new(5)
24
+ just.+(5).must_equal(Just.new(10))
25
+ end
26
+
27
+ it "allows passed arguments to be Maybe instances" do
28
+ just = Just.new(5)
29
+ just.+(Just.new(5)).must_equal(Just.new(10))
30
+ end
31
+
32
+ it "returns Nothing if any argument is Nothing" do
33
+ just = Just.new("Hello")
34
+ just.slice(Just.new(0), Nothing.new).must_equal(Nothing.new)
35
+ end
36
+
37
+ it "passes blocks correctly" do
38
+ count = 0
39
+ just = Just.new(5)
40
+ just.times { |i| count += i }
41
+ count.must_equal(10)
42
+ end
43
+ end
10
44
  end
11
45
 
12
46
  describe "Nothing" do
@@ -23,12 +57,18 @@ describe "Nothing" do
23
57
  end
24
58
 
25
59
  describe "#==" do
26
- it "returns false if the passed object is not a Just" do
27
- (Just.new(5) == 5).must_equal false
60
+ it "returns false if the passed object is not a Nothing" do
61
+ (Nothing.new == 5).must_equal false
28
62
  end
29
63
 
30
- it "returns true if the passed object is a Just with the same value" do
31
- (Just.new(5) == Just.new(5)).must_equal true
64
+ it "returns true if the passed object is a Nothing" do
65
+ (Nothing.new == Nothing.new).must_equal true
66
+ end
67
+ end
68
+
69
+ describe "method lifting" do
70
+ it "returns Nothing for any method call" do
71
+ Nothing.new.missing.must_equal(Nothing.new)
32
72
  end
33
73
  end
34
74
  end
@@ -46,13 +86,9 @@ describe "Maybe" do
46
86
  end
47
87
  end
48
88
 
49
- describe "#==" do
50
- it "returns false if the passed object is not a Nothing" do
51
- (Nothing.new == 5).must_equal false
52
- end
53
-
54
- it "returns true if the passed object is a Nothing" do
55
- (Nothing.new == Nothing.new).must_equal true
89
+ describe "method lifting" do
90
+ it "returns Nothing for any method call" do
91
+ Maybe.new.missing.kind_of?(Maybe).must_equal(true)
56
92
  end
57
93
  end
58
94
  end
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-maybe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Callum Stott
@@ -28,26 +27,25 @@ files:
28
27
  - spec/ruby-maybe_spec.rb
29
28
  homepage:
30
29
  licenses: []
30
+ metadata: {}
31
31
  post_install_message:
32
32
  rdoc_options: []
33
33
  require_paths:
34
34
  - lib
35
35
  required_ruby_version: !ruby/object:Gem::Requirement
36
- none: false
37
36
  requirements:
38
- - - ! '>='
37
+ - - '>='
39
38
  - !ruby/object:Gem::Version
40
39
  version: '0'
41
40
  required_rubygems_version: !ruby/object:Gem::Requirement
42
- none: false
43
41
  requirements:
44
- - - ! '>='
42
+ - - '>='
45
43
  - !ruby/object:Gem::Version
46
44
  version: '0'
47
45
  requirements: []
48
46
  rubyforge_project:
49
- rubygems_version: 1.8.23
47
+ rubygems_version: 2.0.0
50
48
  signing_key:
51
- specification_version: 3
49
+ specification_version: 4
52
50
  summary: Maybe monad implementation for Ruby
53
51
  test_files: []