diff --git a/lib/possibly.rb b/lib/possibly.rb index a0287a6..8b5ccfd 100644 --- a/lib/possibly.rb +++ b/lib/possibly.rb @@ -19,6 +19,18 @@ def ==(other) # Represents a non-empty value class Some < Maybe + + class SomeInnerValue + + def initialize(value) + @value = value + end + + def method_missing(method_sym, *args, &block) + Maybe(@value.send(method_sym, *args, &block)) + end + end + def initialize(value) @value = value end @@ -54,6 +66,10 @@ def method_missing(method_sym, *args, &block) map { |value| value.send(method_sym, *args, &block) } end + def inner + SomeInnerValue.new(@value) + end + private def __enumerable_value diff --git a/spec/spec.rb b/spec/spec.rb index bc7709e..9332309 100644 --- a/spec/spec.rb +++ b/spec/spec.rb @@ -156,4 +156,12 @@ def test_case_when(case_value, match_value, non_match_value) expect(Some([1, 2, 3]).map { |arr| arr.map { |v| v * v } }.get).to eql([1, 4, 9]) end end + + describe "inner" do + it "forwards all (also Enumerable) methods" do + expect(Some(["first", "second", "third"]).inner.first.upcase.or_else { false }).to eql("FIRST") + expect(Some(["first", "second", "third"]).inner.map(&:upcase).or_else { false }).to eql(["FIRST", "SECOND", "THIRD"]) + expect(Some([]).inner.first.upcase.or_else { "NONE" }).to eql("NONE") + end + end end \ No newline at end of file