just_maybe 0.1.2 → 0.2.0

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/README.md CHANGED
@@ -16,7 +16,7 @@ Maybe(nil).foo.bar.or_else { 'default' }
16
16
 
17
17
  Add this line to your application's Gemfile:
18
18
 
19
- gem "just_maybe", "~> 0.1.0"
19
+ gem "just_maybe", "~> 0.2.0"
20
20
 
21
21
  And then execute:
22
22
 
@@ -44,22 +44,22 @@ require 'just_maybe'
44
44
 
45
45
  # Calling Maybe(object) returns that object wrapped in a instance of Maybe
46
46
  Maybe(42)
47
- # => #<Maybe:0x000000010e7c88> @value=42
47
+ # => #<Maybe:0x000000010e7c88 @value=42>
48
48
 
49
49
  # An instance of maybe will pass all valid messages to the underlying value
50
50
  # and wrap the result in a new instance Maybe
51
51
  Maybe(42).next
52
- # => <Maybe:0x0000000110b0e8> @value=43
52
+ # => <Maybe:0x0000000110b0e8 @value=43>
53
53
 
54
54
  # If the Maybe's underlying value doesn't respond to the message it returns
55
55
  # nil wrapped in a new instance of Maybe
56
56
  Maybe(42).foo
57
- # => #<Maybe:0x00000001113540> @value=nil
57
+ # => #<Maybe:0x00000001113540 @value=nil>
58
58
 
59
59
  # This allows you to make arbitrarily long method chains with no risk of raising
60
60
  # NoMethodError on a nil object
61
- Maybe(nil).foo.bar.baz # => Maybe(nil)
62
- # => #<Maybe:0x00000001120830> @value=nil
61
+ Maybe(nil).foo.bar.baz
62
+ # => #<Maybe:0x00000001120830 @value=nil>
63
63
 
64
64
  # Finally Maybe responds to #or_else { ... }. This causes the Maybe to return the
65
65
  # underlying value if it exists or the result of the block if it does not.
@@ -77,15 +77,19 @@ Maybe(nil).foo.bar.or_s # => ''
77
77
 
78
78
  # Remember if you don't call or_else or one of it's alternatives you will get back
79
79
  # an instance of Maybe. It is possible to get the underlying value back by calling
80
- # __value__ but I'd generally consider using this a code smell.
81
- Maybe(42).__value__ # => 42
82
- Maybe(42).foo.bar.baz.__value__ # => nil
80
+ # __object__ but I'd generally consider using this a code smell.
81
+ Maybe(42).__object__
82
+ # => 42
83
+ Maybe(42).foo.bar.baz.__object__
84
+ # => nil
83
85
  ```
84
86
  ## Related
85
- * [Virtuous Code](http://devblog.avdi.org/2011/05/30/null-objects-and-falsiness/)
86
- * [mondadic](https://github.com/pzol/monadic)
87
- * [rumonade](https://github.com/ms-ati/rumonade)
88
- * [thoughtbot](http://robots.thoughtbot.com/post/8181879506/if-you-gaze-into-nil-nil-gazes-also-into-you)
87
+ * [Null Objects and Falsiness](http://devblog.avdi.org/2011/05/30/null-objects-and-falsiness/)
88
+ * [If you gaze into nil, nil gazes also into you](http://robots.thoughtbot.com/post/8181879506/if-you-gaze-into-nil-nil-gazes-also-into-you)
89
+ * [The Maybe Monad In Ruby](http://lostechies.com/derickbailey/2010/10/10/the-maybe-monad-in-ruby/)
90
+ * [Mondadic](https://github.com/pzol/monadic)
91
+ * [Rumonade](https://github.com/ms-ati/rumonade)
92
+ * [Wrapped](https://github.com/mike-burns/wrapped)
89
93
 
90
94
  ## Contributing
91
95
 
@@ -1,22 +1,18 @@
1
1
  class Maybe < BasicObject
2
2
  def initialize(object)
3
- if object.instance_of?(::Maybe)
4
- @object = object.__value__
5
- else
3
+ begin
4
+ @object = object.__object__
5
+ rescue
6
6
  @object = object
7
- end
8
- end
9
-
10
- def instance_of?(klass)
11
- ::Maybe == klass
7
+ end
12
8
  end
13
9
 
14
- def __value__
10
+ def __object__
15
11
  @object
16
12
  end
17
13
 
18
14
  def inspect
19
- ::Kernel.sprintf('#<Maybe:0x%0.14x> @object=%s', __id__ * 2, @object.inspect)
15
+ ::Kernel.sprintf('#<Maybe:0x%0.14x @object=%s>', __id__ * 2, @object.inspect)
20
16
  end
21
17
 
22
18
  def method_missing(method, *args, &block)
@@ -27,39 +23,33 @@ class Maybe < BasicObject
27
23
  end
28
24
  end
29
25
 
30
- def or_a
31
- return @object unless @object.nil?
32
- []
33
- end
34
-
35
26
  def or_else(&block)
36
27
  return @object unless @object.nil?
37
28
  yield
38
29
  end
39
30
 
31
+ def or_a
32
+ or_else { [] }
33
+ end
34
+
40
35
  def or_f
41
- return @object unless @object.nil?
42
- 0.0
36
+ or_else { 0.0 }
43
37
  end
44
38
 
45
39
  def or_h
46
- return @object unless @object.nil?
47
- {}
40
+ or_else { {} }
48
41
  end
49
42
 
50
43
  def or_i
51
- return @object unless @object.nil?
52
- 0
44
+ or_else { 0 }
53
45
  end
54
46
 
55
47
  def or_nil
56
- return @object unless @object.nil?
57
- nil
48
+ or_else { nil }
58
49
  end
59
50
 
60
51
  def or_s
61
- return @object unless @object.nil?
62
- ''
52
+ or_else { '' }
63
53
  end
64
54
  end
65
55
 
@@ -1,3 +1,3 @@
1
1
  module JustMaybe
2
- VERSION = "0.1.2"
2
+ VERSION = "0.2.0"
3
3
  end
data/spec/maybe_spec.rb CHANGED
@@ -3,21 +3,25 @@ require 'just_maybe/maybe'
3
3
  describe Maybe do
4
4
  let(:object) { double }
5
5
 
6
+ before do
7
+ object.stub(:__object__).and_raise(NoMethodError)
8
+ end
9
+
6
10
  it "delegates messages to wrapped object" do
7
11
  object.should_receive(:foo).with('bar')
8
12
  Maybe(object).foo('bar')
9
13
  end
10
14
 
11
15
  it "calling methods that don't exist return Maybe(nil)" do
12
- Maybe(nil).foo.__value__.should be_nil
16
+ Maybe(nil).foo.__object__.should be_nil
13
17
  end
14
18
 
15
19
  it "it doesn't nest" do
16
- Maybe(Maybe(nil)).__value__.should_not be_instance_of(Maybe)
20
+ Maybe(Maybe(nil)).__object__.should_not be_instance_of(Maybe)
17
21
  end
18
22
 
19
- it "__value__ unwraps the underlying object" do
20
- Maybe(object).__value__.should be(object)
23
+ it "__object__ unwraps the underlying object" do
24
+ Maybe(object).__object__.should be(object)
21
25
  end
22
26
 
23
27
  it "#or_else returns then underlying object when it's not nil" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: just_maybe
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-06-16 00:00:00.000000000 Z
12
+ date: 2012-06-17 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: A simple implmenetation of the Maybe special case pattern
15
15
  email:
@@ -48,7 +48,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
48
48
  version: '0'
49
49
  requirements: []
50
50
  rubyforge_project:
51
- rubygems_version: 1.8.19
51
+ rubygems_version: 1.8.21
52
52
  signing_key:
53
53
  specification_version: 3
54
54
  summary: A simple implmenetation of the Maybe special case pattern