deterministic 0.8.1 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/HISTORY.md +17 -0
  3. data/README.md +121 -153
  4. data/lib/deterministic/core_ext/object/result.rb +6 -0
  5. data/lib/deterministic/core_ext/{either.rb → result.rb} +2 -6
  6. data/lib/deterministic/monad.rb +3 -3
  7. data/lib/deterministic/result/chain.rb +27 -0
  8. data/lib/deterministic/result/failure.rb +5 -0
  9. data/lib/deterministic/{either → result}/match.rb +5 -5
  10. data/lib/deterministic/result/success.rb +5 -0
  11. data/lib/deterministic/{either.rb → result.rb} +29 -6
  12. data/lib/deterministic/version.rb +1 -1
  13. data/lib/deterministic.rb +5 -6
  14. data/spec/examples/bookings_spec.rb +3 -5
  15. data/spec/lib/deterministic/core_ext/object/either_spec.rb +3 -20
  16. data/spec/lib/deterministic/core_ext/result_spec.rb +22 -0
  17. data/spec/lib/deterministic/maybe_spec.rb +2 -0
  18. data/spec/lib/deterministic/monad_spec.rb +3 -3
  19. data/spec/lib/deterministic/result/chain_spec.rb +150 -0
  20. data/spec/lib/deterministic/{either → result}/failure_spec.rb +9 -6
  21. data/spec/lib/deterministic/{either → result}/match_spec.rb +5 -5
  22. data/spec/lib/deterministic/result/result_shared.rb +23 -0
  23. data/spec/lib/deterministic/{either → result}/success_spec.rb +10 -6
  24. data/spec/lib/deterministic/{either_spec.rb → result_spec.rb} +3 -3
  25. metadata +24 -27
  26. data/either.rb +0 -97
  27. data/lib/deterministic/core_ext/object/either.rb +0 -6
  28. data/lib/deterministic/either/attempt_all.rb +0 -50
  29. data/lib/deterministic/either/chain.rb +0 -22
  30. data/lib/deterministic/either/failure.rb +0 -22
  31. data/lib/deterministic/either/success.rb +0 -22
  32. data/spec/lib/deterministic/attempt_all_spec.rb +0 -115
  33. data/spec/lib/deterministic/core_ext/either_spec.rb +0 -50
  34. data/spec/lib/deterministic/either/chain_spec.rb +0 -80
  35. data/spec/lib/deterministic/either/either_shared.rb +0 -23
@@ -0,0 +1,22 @@
1
+ require "spec_helper"
2
+ require "deterministic"
3
+ require "deterministic/core_ext/result"
4
+
5
+ describe Deterministic::CoreExt::Result do
6
+ it "does something" do
7
+ h = {}
8
+ h.extend(Deterministic::CoreExt::Result)
9
+ expect(h.success?).to be_falsey
10
+ expect(h.failure?).to be_falsey
11
+ expect(h.result?).to be_falsey
12
+ end
13
+
14
+ it "enables #success?, #failure?, #result? on all Objects" do
15
+ ary = [Deterministic::Success(true), Deterministic::Success(1)]
16
+ expect(ary.all?(&:success?)).to be_truthy
17
+
18
+ ary = [Deterministic::Success(true), Deterministic::Failure(1)]
19
+ expect(ary.all?(&:success?)).to be_falsey
20
+ expect(ary.any?(&:failure?)).to be_truthy
21
+ end
22
+ end
@@ -11,6 +11,8 @@ describe 'maybe' do
11
11
  expect(Maybe({a: 1})[:a]).to eq 1
12
12
  expect(Maybe("a").upcase).to eq "A"
13
13
  expect(Maybe("a")).not_to be_none
14
+
15
+ # expect(Maybe[[]]).to eq be_none
14
16
  end
15
17
 
16
18
  end
@@ -13,9 +13,9 @@ describe Deterministic::Monad do
13
13
 
14
14
  specify { expect(Identity.new(1).to_s).to eq 'Identity(1)' }
15
15
  specify { expect(Identity.new(nil).to_s).to eq 'Identity(nil)' }
16
- specify { expect(Identity.new([1, 2]).map(&:to_s)).to eq Identity.new("[1, 2]") }
17
- specify { expect(Identity.new(1).map {|v| v + 2}).to eq Identity.new(3) }
18
- specify { expect(Identity.new('foo').map(&:upcase)).to eq Identity.new('FOO')}
16
+ specify { expect(Identity.new([1, 2]).fmap(&:to_s)).to eq Identity.new("[1, 2]") }
17
+ specify { expect(Identity.new(1).fmap {|v| v + 2}).to eq Identity.new(3) }
18
+ specify { expect(Identity.new('foo').fmap(&:upcase)).to eq Identity.new('FOO')}
19
19
 
20
20
  context '#bind' do
21
21
  it "raises an error if the passed function does not return a monad of the same class" do
@@ -0,0 +1,150 @@
1
+ require 'spec_helper'
2
+
3
+ include Deterministic
4
+
5
+ describe Deterministic::Result do
6
+ context ">> (map)" do
7
+ specify { expect(Success(0).map { |n| Success(n + 1) }).to eq Success(1) }
8
+ specify { expect(Failure(0).map { |n| Success(n + 1) }).to eq Failure(0) }
9
+
10
+ it "Failure stops execution" do
11
+ class ChainUnderTest
12
+ alias :m :method
13
+
14
+ def call
15
+ init >>
16
+ m(:validate) >>
17
+ m(:send) >>
18
+ m(:parse)
19
+ end
20
+
21
+ def init
22
+ Success({step: 1})
23
+ end
24
+
25
+ def validate(i)
26
+ i[:step] = i[:step] + 1
27
+ Success(i)
28
+ end
29
+
30
+ def send(i)
31
+ i[:step] = i[:step] + 1
32
+ Failure("Error @ #{i.fetch(:step)}")
33
+ end
34
+
35
+ def parse(i)
36
+ i[:step] = i[:step] + 1
37
+ Success(i)
38
+ end
39
+ end
40
+
41
+ test = ChainUnderTest.new
42
+
43
+ expect(test.call).to eq Failure("Error @ 3")
44
+ end
45
+
46
+ it "expects an Result" do
47
+ def returns_non_result(i)
48
+ 2
49
+ end
50
+
51
+ expect { Success(1) >> method(:returns_non_result) }.to raise_error(Deterministic::Monad::NotMonadError)
52
+ end
53
+
54
+ it "works with a block" do
55
+ expect(
56
+ Success(1).map { |i| Success(i + 1) }
57
+ ).to eq Success(2)
58
+ end
59
+
60
+ it "works with a lambda" do
61
+ expect(
62
+ Success(1) >> ->(i) { Success(i + 1) }
63
+ ).to eq Success(2)
64
+ end
65
+
66
+ it "does not catch exceptions" do
67
+ expect {
68
+ Success(1) >> ->(i) { raise "error" }
69
+ }.to raise_error(RuntimeError)
70
+ end
71
+ end
72
+
73
+ context "using self as the context for success" do
74
+ class SelfContextUnderTest
75
+ def call
76
+ @step = 0
77
+ Success(self).
78
+ map(&:validate).
79
+ map(&:build).
80
+ map(&:send)
81
+ end
82
+
83
+ def validate
84
+ @step = 1
85
+ Success(self)
86
+ end
87
+
88
+ def build
89
+ @step = 2
90
+ Success(self)
91
+ end
92
+
93
+ def send
94
+ @step = 3
95
+ Success(self)
96
+ end
97
+
98
+ def to_s
99
+ "Step #{@step}"
100
+ end
101
+
102
+ # # def self.procify(*meths)
103
+ # # meths.each do |m|
104
+ # # new_m = "__#{m}__procified".to_sym
105
+ # # alias new_m m
106
+ # # define_method new_m do |ctx|
107
+ # # method(m)
108
+ # # end
109
+ # # end
110
+ # # end
111
+
112
+ # procify :send
113
+ end
114
+
115
+ it "works" do
116
+ test = SelfContextUnderTest.new.call
117
+ expect(test).to be_a Success
118
+ expect(test.inspect).to eq "Success(Step 3)"
119
+ end
120
+ end
121
+
122
+ context "** (pipe)" do
123
+ it "ignores the output of pipe" do
124
+ acc = "ctx: "
125
+ log = ->(ctx) { acc += ctx.inspect }
126
+
127
+ actual = Success(1).pipe(log).map { Success(2) }
128
+ expect(actual).to eq Success(2)
129
+ expect(acc).to eq "ctx: Success(1)"
130
+ end
131
+
132
+ it "works with **" do
133
+ log = ->(n) { n.value + 1 }
134
+ foo = ->(n) { Success(n + 1) }
135
+
136
+ actual = Success(1) ** log >> foo
137
+ end
138
+ end
139
+
140
+ context ">= (try)" do
141
+ it "try (>=) catches errors and wraps them as Failure" do
142
+ def error(ctx)
143
+ raise "error #{ctx}"
144
+ end
145
+
146
+ actual = Success(1) >= method(:error)
147
+ expect(actual.inspect).to eq "Failure(error 1)"
148
+ end
149
+ end
150
+ end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require_relative '../monad_axioms'
3
- require_relative 'either_shared'
3
+ require_relative 'result_shared'
4
4
 
5
5
  include Deterministic
6
6
 
@@ -18,18 +18,21 @@ describe Deterministic::Failure do
18
18
 
19
19
  specify { expect(subject).to be_an_instance_of described_class }
20
20
  specify { expect(subject).to eq(described_class.new(1)) }
21
- specify { expect(subject << Success(2)).to eq(Failure(1)) }
22
- specify { expect(subject << Failure(2)).to eq(Failure(1)) }
23
- specify { expect(subject.map { |v| v + 1} ).to eq Failure(2) }
21
+ specify { expect(subject.fmap { |v| v + 1} ).to eq Failure(2) }
22
+ specify { expect(subject.map { |v| Success(v + 1)} ).to eq Failure(1) }
23
+ specify { expect(subject.map_err { |v| Success(v + 1)} ).to eq Success(2) }
24
+ specify { expect(subject.pipe { |v| raise RuntimeError unless v == Failure(1) } ).to eq Failure(1) }
24
25
 
25
26
  specify { expect(subject.or(Success(2))).to eq Success(2)}
27
+ specify { expect(subject.or(Failure(2))).to eq Failure(2)}
26
28
  specify { expect(subject.or_else { Success(2) }).to eq Success(2)}
29
+ specify { expect(subject.or_else { Failure(2) }).to eq Failure(2)}
27
30
 
28
31
  specify { expect(subject.and(Success(2))).to eq Failure(1)}
29
32
  specify { expect(subject.and_then { Success(2) }).to eq Failure(1)}
30
33
 
31
- it_behaves_like 'Either' do
32
- let(:either) { described_class }
34
+ it_behaves_like 'Result' do
35
+ let(:result) { described_class }
33
36
  end
34
37
  end
35
38
 
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
 
3
3
  include Deterministic
4
4
 
5
- describe Deterministic::Either::Match do
5
+ describe Deterministic::Result::Match do
6
6
  it "can match Success" do
7
7
  expect(
8
8
  Success(1).match do
@@ -55,14 +55,14 @@ describe Deterministic::Either::Match do
55
55
  ).to eq "catch-all"
56
56
  end
57
57
 
58
- it "can match either" do
58
+ it "can match result" do
59
59
  expect(
60
60
  Failure(2).match do
61
61
  success { |v| "not matched s" }
62
- either(2) { |v| "either #{v}" }
62
+ result(2) { |v| "result #{v}" }
63
63
  failure(3) { |v| "not matched f3" }
64
64
  end
65
- ).to eq "either 2"
65
+ ).to eq "result 2"
66
66
  end
67
67
 
68
68
  it "can match with lambdas" do
@@ -93,7 +93,7 @@ describe Deterministic::Either::Match do
93
93
  ).to eq "it works"
94
94
  end
95
95
 
96
- it "allows for Either values to play with pattern matching comparisons" do
96
+ it "allows for Result values to play with pattern matching comparisons" do
97
97
  class MyErrorHash < Hash
98
98
  def ==(error_type_symbol)
99
99
  self[:type] == error_type_symbol
@@ -0,0 +1,23 @@
1
+ shared_examples 'Result' do
2
+ let(:result_name) { described_class.name.split("::")[-1]}
3
+ specify { expect(subject.value).to eq 1 }
4
+ specify { expect(result.new(subject)).to eq result.new(1) }
5
+
6
+ it "#fmap" do
7
+ expect(result.new(1).fmap { |e| e + 1 }).to eq result.new(2)
8
+ end
9
+
10
+ it "#bind" do
11
+ expect(result.new(1).bind { |v| result.new(v + 1)}).to eq result.new(2)
12
+ end
13
+
14
+ it "#to_s" do
15
+ expect(result.new(1).to_s).to eq "1"
16
+ expect(result.new({a: 1}).to_s).to eq "{:a=>1}"
17
+ end
18
+
19
+ it "#inspect" do
20
+ expect(result.new(1).inspect).to eq "#{result_name}(1)"
21
+ expect(result.new(:a=>1).inspect).to eq "#{result_name}({:a=>1})"
22
+ end
23
+ end
@@ -1,6 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require_relative '../monad_axioms'
3
- require_relative 'either_shared'
3
+ require_relative 'result_shared'
4
4
 
5
5
  include Deterministic
6
6
 
@@ -18,17 +18,21 @@ describe Deterministic::Success do
18
18
 
19
19
  specify { expect(subject).to be_an_instance_of described_class }
20
20
  specify { expect(subject).to eq(described_class.new(1)) }
21
- specify { expect(subject << Success(2)).to eq(Success(2)) }
22
- specify { expect(subject << Failure(2)).to eq(Failure(2)) }
23
- specify { expect(subject.map { |v| v + 1} ).to eq Success(2) }
21
+ specify { expect(subject.fmap { |v| v + 1} ).to eq Success(2) }
22
+ specify { expect(subject.map { |v| Failure(v + 1) } ).to eq Failure(2) }
23
+ specify { expect(subject.map_err { |v| Failure(v + 1) } ).to eq Success(1) }
24
+
25
+ specify { expect(subject.pipe{ |r| raise RuntimeError unless r == Success(1) } ).to eq Success(1) }
24
26
 
25
27
  specify { expect(subject.or(Success(2))).to eq Success(1)}
26
28
  specify { expect(subject.or_else { Success(2) }).to eq Success(1)}
27
29
 
28
30
  specify { expect(subject.and(Success(2))).to eq Success(2)}
31
+ specify { expect(subject.and(Failure(2))).to eq Failure(2)}
29
32
  specify { expect(subject.and_then { Success(2) }).to eq Success(2)}
33
+ specify { expect(subject.and_then { Failure(2) }).to eq Failure(2)}
30
34
 
31
- it_behaves_like 'Either' do
32
- let(:either) { described_class }
35
+ it_behaves_like 'Result' do
36
+ let(:result) { described_class }
33
37
  end
34
38
  end
@@ -1,8 +1,8 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Deterministic::Either do
4
- it "can't call Either#new directly" do
3
+ describe Deterministic::Result do
4
+ it "can't call Result#new directly" do
5
5
  expect { described_class.new(1)}
6
- .to raise_error(NoMethodError, "protected method `new' called for Deterministic::Either:Class")
6
+ .to raise_error(NoMethodError, "protected method `new' called for Deterministic::Result:Class")
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: deterministic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.1
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Piotr Zolnierek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-08-15 00:00:00.000000000 Z
11
+ date: 2014-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -119,39 +119,37 @@ files:
119
119
  - .rspec
120
120
  - Gemfile
121
121
  - Guardfile
122
+ - HISTORY.md
122
123
  - LICENSE.txt
123
124
  - README.md
124
125
  - Rakefile
125
126
  - deterministic.gemspec
126
- - either.rb
127
127
  - lib/deterministic.rb
128
- - lib/deterministic/core_ext/either.rb
129
- - lib/deterministic/core_ext/object/either.rb
130
- - lib/deterministic/either.rb
131
- - lib/deterministic/either/attempt_all.rb
132
- - lib/deterministic/either/chain.rb
133
- - lib/deterministic/either/failure.rb
134
- - lib/deterministic/either/match.rb
135
- - lib/deterministic/either/success.rb
128
+ - lib/deterministic/core_ext/object/result.rb
129
+ - lib/deterministic/core_ext/result.rb
136
130
  - lib/deterministic/maybe.rb
137
131
  - lib/deterministic/monad.rb
138
132
  - lib/deterministic/none.rb
133
+ - lib/deterministic/result.rb
134
+ - lib/deterministic/result/chain.rb
135
+ - lib/deterministic/result/failure.rb
136
+ - lib/deterministic/result/match.rb
137
+ - lib/deterministic/result/success.rb
139
138
  - lib/deterministic/version.rb
140
139
  - spec/examples/bookings_spec.rb
141
140
  - spec/examples/validate_address_spec.rb
142
- - spec/lib/deterministic/attempt_all_spec.rb
143
- - spec/lib/deterministic/core_ext/either_spec.rb
144
141
  - spec/lib/deterministic/core_ext/object/either_spec.rb
145
- - spec/lib/deterministic/either/chain_spec.rb
146
- - spec/lib/deterministic/either/either_shared.rb
147
- - spec/lib/deterministic/either/failure_spec.rb
148
- - spec/lib/deterministic/either/match_spec.rb
149
- - spec/lib/deterministic/either/success_spec.rb
150
- - spec/lib/deterministic/either_spec.rb
142
+ - spec/lib/deterministic/core_ext/result_spec.rb
151
143
  - spec/lib/deterministic/maybe_spec.rb
152
144
  - spec/lib/deterministic/monad_axioms.rb
153
145
  - spec/lib/deterministic/monad_spec.rb
154
146
  - spec/lib/deterministic/none_spec.rb
147
+ - spec/lib/deterministic/result/chain_spec.rb
148
+ - spec/lib/deterministic/result/failure_spec.rb
149
+ - spec/lib/deterministic/result/match_spec.rb
150
+ - spec/lib/deterministic/result/result_shared.rb
151
+ - spec/lib/deterministic/result/success_spec.rb
152
+ - spec/lib/deterministic/result_spec.rb
155
153
  - spec/spec_helper.rb
156
154
  homepage: http://github.com/pzol/deterministic
157
155
  licenses:
@@ -180,17 +178,16 @@ summary: see above
180
178
  test_files:
181
179
  - spec/examples/bookings_spec.rb
182
180
  - spec/examples/validate_address_spec.rb
183
- - spec/lib/deterministic/attempt_all_spec.rb
184
- - spec/lib/deterministic/core_ext/either_spec.rb
185
181
  - spec/lib/deterministic/core_ext/object/either_spec.rb
186
- - spec/lib/deterministic/either/chain_spec.rb
187
- - spec/lib/deterministic/either/either_shared.rb
188
- - spec/lib/deterministic/either/failure_spec.rb
189
- - spec/lib/deterministic/either/match_spec.rb
190
- - spec/lib/deterministic/either/success_spec.rb
191
- - spec/lib/deterministic/either_spec.rb
182
+ - spec/lib/deterministic/core_ext/result_spec.rb
192
183
  - spec/lib/deterministic/maybe_spec.rb
193
184
  - spec/lib/deterministic/monad_axioms.rb
194
185
  - spec/lib/deterministic/monad_spec.rb
195
186
  - spec/lib/deterministic/none_spec.rb
187
+ - spec/lib/deterministic/result/chain_spec.rb
188
+ - spec/lib/deterministic/result/failure_spec.rb
189
+ - spec/lib/deterministic/result/match_spec.rb
190
+ - spec/lib/deterministic/result/result_shared.rb
191
+ - spec/lib/deterministic/result/success_spec.rb
192
+ - spec/lib/deterministic/result_spec.rb
196
193
  - spec/spec_helper.rb
data/either.rb DELETED
@@ -1,97 +0,0 @@
1
- class Either
2
- def chain(&callee)
3
- return self if @value.failure?
4
- value = callee.call
5
- raise "value must be either Success or Failure" unless Either::Abstract === value
6
- @value = value
7
- return self
8
- end
9
-
10
- def self.success(value)
11
- Success.new(value)
12
- end
13
-
14
- def self.failure(value)
15
- Failure.new(value)
16
- end
17
-
18
- class Abstract
19
- def initialize(value)
20
- @value = value
21
- end
22
- end
23
-
24
- class Success < Abstract
25
- def <<(value)
26
- @value = value
27
- end
28
-
29
- def or(*args)
30
- self
31
- end
32
-
33
- def success?
34
- true
35
- end
36
-
37
- def failure?
38
- false
39
- end
40
- end
41
-
42
- class Failure < Abstract
43
- def <<(value)
44
- @value = value
45
- end
46
-
47
- def or(value)
48
- value
49
- end
50
-
51
- def success?
52
- false
53
- end
54
-
55
- def failure?
56
- true
57
- end
58
- end
59
- end
60
-
61
- # a container for storing intermediate state
62
- class Builder
63
- def initialize(deps)
64
- @settings_adapter = deps.fetch(:settings)
65
- end
66
-
67
- def build
68
- Either.new do
69
- on_failure do |result|
70
- p result
71
- end
72
-
73
- chain { @settings = @settings_adapter.call(a, b) }
74
- end
75
- end
76
-
77
- end
78
-
79
- module SettingsAdapter
80
- def self.call(contract, facility)
81
- begin
82
- client = ResfinitySettingsClient::Client.new
83
- auth = self.auth
84
- Either.success(client.settings(auth))
85
- rescue => ex
86
- Either.failure(["Could not get settings: #{ex.message}", ex])
87
- end
88
- end
89
-
90
- def self.auth
91
- {
92
- # config to external
93
- api_user: ENV['SETTINGS_USER'],
94
- api_token: ENV['SETTINGS_TOKEN']
95
- }
96
- end
97
- end
@@ -1,6 +0,0 @@
1
- require "deterministic/core_ext/either"
2
-
3
- include Deterministic
4
- class Object
5
- include Deterministic::CoreExt::Either
6
- end
@@ -1,50 +0,0 @@
1
- require 'ostruct'
2
-
3
- class Deterministic::Either
4
- def self.attempt_all(context=OpenStruct.new, &block)
5
- AttemptAll.new(context, &block).call
6
- end
7
-
8
- class AttemptAll
9
- class EitherExpectedError < StandardError; end
10
- def initialize(context, &block)
11
- @context = context || self
12
- @tries = []
13
- instance_eval(&block)
14
- end
15
-
16
- def call(initial=nil)
17
- result = @tries.inject(Deterministic::Success(initial)) do |acc, try|
18
- acc.success? ? acc << try.call(acc) : acc
19
- end
20
- end
21
-
22
- # This is a functor
23
- def try(&block)
24
- try_p = ->(acc) {
25
- begin
26
- value = @context.instance_exec(acc.value, &block)
27
- case value
28
- when Deterministic::Success, Deterministic::Failure
29
- value
30
- else
31
- Deterministic::Success(value)
32
- end
33
- rescue => ex
34
- Deterministic::Failure(ex)
35
- end
36
- }
37
-
38
- @tries << try_p
39
- end
40
-
41
- # Basicly a monad
42
- def let(sym=nil, &block)
43
- @tries << ->(acc) {
44
- @context.instance_exec(acc.value, &block).tap do |value|
45
- raise EitherExpectedError, "Expected the result to be either Success or Failure" unless value.is_a? Either
46
- end
47
- }
48
- end
49
- end
50
- end
@@ -1,22 +0,0 @@
1
- module Deterministic
2
- class Either
3
- module Chain
4
- def chain(proc=nil, &block)
5
- return self if failure?
6
- bind { (proc || block).call(@value) }
7
- end
8
-
9
- alias :>> :chain
10
-
11
- def try(proc=nil, &block)
12
- return self if failure?
13
- bind { (proc || block).call(@value) }
14
- rescue => err
15
- Failure(err)
16
- end
17
-
18
- alias :>= :try
19
- end
20
- end
21
- end
22
-
@@ -1,22 +0,0 @@
1
- module Deterministic
2
- class Failure < Either
3
- class << self; public :new; end
4
-
5
- def and(other)
6
- self
7
- end
8
-
9
- def and_then(&block)
10
- self
11
- end
12
-
13
- def or(other)
14
- raise NotMonadError, "Expected #{other.inspect} to be an Either" unless other.is_a? Either
15
- other
16
- end
17
-
18
- def or_else(&block)
19
- bind(&block)
20
- end
21
- end
22
- end
@@ -1,22 +0,0 @@
1
- module Deterministic
2
- class Success < Either
3
- class << self; public :new; end
4
-
5
- def and(other)
6
- raise NotMonadError, "Expected #{other.inspect} to be an Either" unless other.is_a? Either
7
- other
8
- end
9
-
10
- def and_then(&block)
11
- bind(&block)
12
- end
13
-
14
- def or(other)
15
- self
16
- end
17
-
18
- def or_else(&block)
19
- self
20
- end
21
- end
22
- end