dry-monads 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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 578a10e9ec2b0ca63809f588c68d14a643a43f4b
4
- data.tar.gz: 8d69e82a8e58de7488aca590a7f321c978431734
3
+ metadata.gz: ac64c7b3b46d180bb1109ba4272763f79ffc9f57
4
+ data.tar.gz: a44861c02c43c629b65cbada6d3cae5fc2f56917
5
5
  SHA512:
6
- metadata.gz: f2d1786620c51d8ab53e8b59099143e8867f9ac2223b155a946bee1d6b23bc5740a4623250002e33df54562c371d802977b27553f2b70ab3270b906a51a75ead
7
- data.tar.gz: 46bc1e583a5fbb1e597aad4ed157757aa960abe39bf3aab92af54110f17bebf09a10a1ce2d0d4f198f0dfc0174841fd3b360275a716d95e6c45f77f64e0e3175
6
+ metadata.gz: e2f903e40b08f17b314f95c773b0b161c084da2df3e59d56cd570c0f104166711f7ac8091fc1901d8118cfc36590493ab08f2d950cee914d83c1fa99855f5a4d
7
+ data.tar.gz: ef594ee9cc4766bbe519f12d13c398b4e7c8ae8458ec7a551348e559ce2e76de23fd9fcbaf4b7cbaa85b64feac074956004b83f96ce839320a2b88f4325fedc8
data/.rubocop.yml CHANGED
@@ -1,5 +1,10 @@
1
1
  inherit_from: .rubocop_todo.yml
2
2
 
3
+ AllCops:
4
+ Exclude:
5
+ - 'spec/integration/either_spec.rb'
6
+ - 'vendor/**/*'
7
+
3
8
  Style/Documentation:
4
9
  Enabled: false
5
10
 
@@ -24,6 +29,21 @@ Style/MultilineBlockChain:
24
29
  Style/GuardClause:
25
30
  Enabled: false
26
31
 
32
+ Style/SymbolProc:
33
+ Exclude:
34
+ # This rule is broken in specs on purpose to make examples clearer
35
+ - 'spec/**/*'
36
+
37
+ Style/SignalException:
38
+ Exclude:
39
+ - 'spec/**/*'
40
+
41
+ Style/ModuleFunction:
42
+ Enabled: false
43
+
44
+ Style/RescueModifier:
45
+ Enabled: false
46
+
27
47
  Metrics/LineLength:
28
48
  Max: 110
29
49
 
data/.travis.yml CHANGED
@@ -1,16 +1,16 @@
1
1
  language: ruby
2
2
  sudo: false
3
3
  cache: bundler
4
- bundler_args: --without benchmarks tools
4
+ bundler_args: --without benchmarks
5
5
  script:
6
6
  - bundle exec rake spec
7
+ - bundle exec rubocop
7
8
  rvm:
8
- - 2.0
9
- - 2.1
10
- - 2.2
11
- - 2.3.0
9
+ - 2.1.10
10
+ - 2.2.5
11
+ - 2.3.1
12
12
  - rbx-2
13
- - jruby-9000
13
+ - jruby-9.1.1.0
14
14
  - ruby-head
15
15
  env:
16
16
  global:
data/README.md CHANGED
@@ -11,6 +11,7 @@
11
11
  [![Code Climate](https://img.shields.io/codeclimate/github/dry-rb/dry-monads.svg)][code_climate]
12
12
  [![Test Coverage](https://img.shields.io/codeclimate/coverage/github/dry-rb/dry-monads.svg)][code_climate]
13
13
  [![API Documentation Coverage](http://inch-ci.org/github/dry-rb/dry-monads.svg)][inch]
14
+ ![No monkey-patches](https://img.shields.io/badge/monkey--patches-0-brightgreen.svg)
14
15
 
15
16
  Monads for Ruby.
16
17
 
@@ -46,4 +47,4 @@ prompt that will allow you to experiment.
46
47
 
47
48
  ## Contributing
48
49
 
49
- Bug reports and pull requests are welcome on GitHub at [https://github.com/dry-rb/dry-monads]().
50
+ Bug reports and pull requests are welcome on GitHub at <https://github.com/dry-rb/dry-monads>.
data/dry-monads.gemspec CHANGED
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
25
25
  spec.bindir = 'exe'
26
26
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
27
  spec.require_paths = ['lib']
28
+ spec.add_dependency 'dry-equalizer'
28
29
 
29
30
  spec.add_development_dependency 'bundler'
30
31
  spec.add_development_dependency 'rake'
data/lib/dry/monads.rb CHANGED
@@ -1,27 +1,41 @@
1
+ require 'dry/equalizer'
1
2
  require 'dry/monads/either'
2
3
  require 'dry/monads/maybe'
3
4
  require 'dry/monads/try'
4
5
 
5
6
  module Dry
7
+ # @api public
6
8
  module Monads
7
9
  extend self
8
10
 
11
+ # Stores the given value in one of the subtypes of {Maybe} monad.
12
+ # It is essentially a wrapper for {Maybe.lift}.
13
+ #
14
+ # @param value [Object] the value to be stored in the monad
15
+ # @return [Maybe::Some, Maybe::None]
9
16
  def Maybe(value)
10
17
  Maybe.lift(value)
11
18
  end
12
19
 
20
+ # @param value [Object] the value to be stored in the monad
21
+ # @return [Maybe::Some]
13
22
  def Some(value)
14
23
  Maybe::Some.new(value)
15
24
  end
16
25
 
26
+ # @return [Maybe::None]
17
27
  def None
18
28
  Maybe::Some::None.instance
19
29
  end
20
30
 
31
+ # @param value [Object] the value to be stored in the monad
32
+ # @return [Either::Right]
21
33
  def Right(value)
22
34
  Either::Right.new(value)
23
35
  end
24
36
 
37
+ # @param value [Object] the value to be stored in the monad
38
+ # @return [Either::Left]
25
39
  def Left(value)
26
40
  Either::Left.new(value)
27
41
  end
@@ -1,100 +1,167 @@
1
1
  module Dry
2
2
  module Monads
3
+ # Represents a value which is either correct or an error.
4
+ #
5
+ # @api public
3
6
  class Either
7
+ include Dry::Equalizer(:right, :left)
4
8
  attr_reader :right, :left
5
9
 
6
- def ==(other)
7
- other.is_a?(Either) && right == other.right && left == other.left
8
- end
9
-
10
+ # Returns true for an instance of a {Either::Right} monad.
10
11
  def right?
11
12
  is_a? Right
12
13
  end
13
14
  alias success? right?
14
15
 
16
+ # Returns true for an instance of a {Either::Left} monad.
15
17
  def left?
16
18
  is_a? Left
17
19
  end
18
20
  alias failure? left?
19
21
 
22
+ # Returns self, added to keep the interface compatible with other monads.
23
+ #
24
+ # @return [Either::Right, Either::Left]
20
25
  def to_either
21
26
  self
22
27
  end
23
28
 
29
+ # Represents a value that is in a correct state, i.e. everything went right.
30
+ #
31
+ # @api public
24
32
  class Right < Either
25
33
  alias value right
26
34
 
35
+ # @param right [Object] a value in a correct state
27
36
  def initialize(right)
28
37
  @right = right
29
38
  end
30
39
 
31
- def bind(proc = nil)
32
- if proc
33
- proc.call(value)
40
+ # Calls the passed in Proc object with value stored in self
41
+ # and returns the result.
42
+ #
43
+ # If proc is nil, it expects a block to be given and will yield to it.
44
+ #
45
+ # @example
46
+ # Dry::Monads.Right(4).bind(&:succ) # => 5
47
+ #
48
+ # @param [Array<Object>] args arguments that will be passed to a block
49
+ # if one was given, otherwise the first
50
+ # value assumed to be a Proc (callable)
51
+ # object and the rest of args will be passed
52
+ # to this object along with the internal value
53
+ # @return [Object] result of calling proc or block on the internal value
54
+ def bind(*args)
55
+ if block_given?
56
+ yield(value, *args)
34
57
  else
35
- yield(value)
58
+ args[0].call(value, *args.drop(1))
36
59
  end
37
60
  end
38
61
 
39
- def fmap(proc = nil, &block)
40
- Right.new(bind(&(proc || block)))
62
+ # Does the same thing as #bind except it also wraps the value
63
+ # in an instance of Either::Right monad. This allows for easier
64
+ # chaining of calls.
65
+ #
66
+ # @example
67
+ # Dry::Monads.Right(4).fmap(&:succ).fmap(->(n) { n**2 }) # => Right(25)
68
+ #
69
+ # @param [Array<Object>] args arguments will be transparently passed through to #bind
70
+ # @return [Either::Right]
71
+ def fmap(*args, &block)
72
+ Right.new(bind(*args, &block))
41
73
  end
42
74
 
43
- def or(_val = nil)
75
+ # Ignores arguments and returns self. It exists to keep the interface
76
+ # identical to that of {Either::Left}.
77
+ #
78
+ # @return [Either::Right]
79
+ def or(*)
44
80
  self
45
81
  end
46
82
 
83
+ # @return [String]
47
84
  def to_s
48
85
  "Right(#{value.inspect})"
49
86
  end
50
87
  alias inspect to_s
51
88
 
89
+ # @return [Maybe::Some]
52
90
  def to_maybe
53
91
  Maybe::Some.new(value)
54
92
  end
55
93
  end
56
94
 
95
+ # Represents a value that is in an incorrect state, i.e. something went wrong.
96
+ #
97
+ # @api public
57
98
  class Left < Either
58
99
  alias value left
59
100
 
101
+ # @param left [Object] a value in an error state
60
102
  def initialize(left)
61
103
  @left = left
62
104
  end
63
105
 
64
- def bind(_proc = nil)
106
+ # Ignores the input parameter and returns self. It exists to keep the interface
107
+ # identical to that of {Either::Right}.
108
+ #
109
+ # @return [Either::Left]
110
+ def bind(*)
65
111
  self
66
112
  end
67
113
 
68
- def fmap(_proc = nil)
114
+ # Ignores the input parameter and returns self. It exists to keep the interface
115
+ # identical to that of {Either::Right}.
116
+ #
117
+ # @return [Either::Left]
118
+ def fmap(*)
69
119
  self
70
120
  end
71
121
 
72
- def or(val = nil)
122
+ # If a block is given passes internal value to it and returns the result,
123
+ # otherwise simply returns the parameter val.
124
+ #
125
+ # @example
126
+ # Dry::Monads.Left(ArgumentError.new('error message')).or(&:message) # => "error message"
127
+ #
128
+ # @param [Array<Object>] args arguments that will be passed to a block
129
+ # if one was given, otherwise the first
130
+ # value will be returned
131
+ # @return [Object]
132
+ def or(*args)
73
133
  if block_given?
74
- yield(value)
134
+ yield(value, *args)
75
135
  else
76
- val
136
+ args[0]
77
137
  end
78
138
  end
79
139
 
140
+ # @return [String]
80
141
  def to_s
81
142
  "Left(#{value.inspect})"
82
143
  end
83
144
  alias inspect to_s
84
145
 
146
+ # @return [Maybe::None]
85
147
  def to_maybe
86
148
  Maybe::None.instance
87
149
  end
88
150
  end
89
151
 
152
+ # A module that can be included for easier access to Either monads.
90
153
  module Mixin
91
154
  Right = Right
92
155
  Left = Left
93
156
 
157
+ # @param value [Object] the value to be stored in the monad
158
+ # @return [Either::Right]
94
159
  def Right(value)
95
160
  Right.new(value)
96
161
  end
97
162
 
163
+ # @param value [Object] the value to be stored in the monad
164
+ # @return [Either::Left]
98
165
  def Left(value)
99
166
  Left.new(value)
100
167
  end
@@ -1,6 +1,15 @@
1
1
  module Dry
2
2
  module Monads
3
+ # Represents a value which can exist or not, i.e. it could be nil.
4
+ #
5
+ # @api public
3
6
  class Maybe
7
+ include Dry::Equalizer(:value)
8
+
9
+ # Lifts the given value into Maybe::None or Maybe::Some monad.
10
+ #
11
+ # @param value [Object] the value to be stored in the monad
12
+ # @return [Maybe::Some, Maybe::None]
4
13
  def self.lift(value)
5
14
  if value.nil?
6
15
  None.instance
@@ -9,22 +18,26 @@ module Dry
9
18
  end
10
19
  end
11
20
 
12
- def ==(other)
13
- other.is_a?(Maybe) && value == other.value
14
- end
15
-
21
+ # Returns true for an instance of a {Maybe::None} monad.
16
22
  def none?
17
23
  is_a?(None)
18
24
  end
19
25
 
26
+ # Returns true for an instance of a {Maybe::Some} monad.
20
27
  def some?
21
28
  is_a?(Some)
22
29
  end
23
30
 
31
+ # Returns self, added to keep the interface compatible with that of Either monad types.
32
+ #
33
+ # @return [Maybe::Some, Maybe::None]
24
34
  def to_maybe
25
35
  self
26
36
  end
27
37
 
38
+ # Represents a value that is present, i.e. not nil.
39
+ #
40
+ # @api public
28
41
  class Some < Maybe
29
42
  attr_reader :value
30
43
 
@@ -33,71 +46,128 @@ module Dry
33
46
  @value = value
34
47
  end
35
48
 
36
- def bind(proc = nil)
37
- if proc
38
- proc.call(value)
49
+ # Calls the passed in Proc object with value stored in self
50
+ # and returns the result.
51
+ #
52
+ # If proc is nil, it expects a block to be given and will yield to it.
53
+ #
54
+ # @example
55
+ # Dry::Monads.Some(4).bind(&:succ) # => 5
56
+ #
57
+ # @param [Array<Object>] args arguments that will be passed to a block
58
+ # if one was given, otherwise the first
59
+ # value assumed to be a Proc (callable)
60
+ # object and the rest of args will be passed
61
+ # to this object along with the internal value
62
+ # @return [Object] result of calling proc or block on the internal value
63
+ def bind(*args)
64
+ if block_given?
65
+ yield(value, *args)
39
66
  else
40
- yield(value)
67
+ args[0].call(value, *args.drop(1))
41
68
  end
42
69
  end
43
70
 
44
- def fmap(proc = nil, &block)
45
- self.class.lift(bind(&(proc || block)))
71
+ # Does the same thing as #bind except it also wraps the value
72
+ # in an instance of Maybe::Some monad. This allows for easier
73
+ # chaining of calls.
74
+ #
75
+ # @example
76
+ # Dry::Monads.Some(4).fmap(&:succ).fmap(->(n) { n**2 }) # => Some(25)
77
+ #
78
+ # @param [Array<Object>] args arguments will be transparently passed through to #bind
79
+ # @return [Maybe::Some, Maybe::None] Lifted result, i.e. nil will be mapped to None,
80
+ # other values will be wrapped with Some
81
+ def fmap(*args, &block)
82
+ self.class.lift(bind(*args, &block))
46
83
  end
47
84
 
48
- def or(_val = nil)
85
+ # Ignores arguments and returns self. It exists to keep the interface
86
+ # identical to that of {Maybe::None}.
87
+ #
88
+ # @return [Maybe::Some]
89
+ def or(*)
49
90
  self
50
91
  end
51
92
 
93
+ # @return [String]
52
94
  def to_s
53
95
  "Some(#{value.inspect})"
54
96
  end
55
97
  alias inspect to_s
56
98
  end
57
99
 
100
+ # Represents an absence of a value, i.e. the value nil.
101
+ #
102
+ # @api public
58
103
  class None < Maybe
59
104
  @instance = new
60
105
  singleton_class.send(:attr_reader, :instance)
61
106
 
107
+ # @return [nil]
62
108
  def value
63
109
  nil
64
110
  end
65
111
 
66
- def bind(_proc = nil)
112
+ # Ignores arguments and returns self. It exists to keep the interface
113
+ # identical to that of {Maybe::Some}.
114
+ #
115
+ # @return [Maybe::None]
116
+ def bind(*)
67
117
  self
68
118
  end
69
119
 
70
- def fmap(_proc = nil)
120
+ # Ignores arguments and returns self. It exists to keep the interface
121
+ # identical to that of {Maybe::Some}.
122
+ #
123
+ # @return [Maybe::None]
124
+ def fmap(*)
71
125
  self
72
126
  end
73
127
 
74
- def or(val = nil)
128
+ # If a block is given passes internal value to it and returns the result,
129
+ # otherwise simply returns the parameter val.
130
+ #
131
+ # @example
132
+ # Dry::Monads.None.or('no value') # => "no value"
133
+ # Dry::Monads.None.or { Time.now } # => current time
134
+ #
135
+ # @param val [Object, nil]
136
+ # @return [Object]
137
+ def or(*args)
75
138
  if block_given?
76
- yield(value)
139
+ yield(*args)
77
140
  else
78
- val
141
+ args[0]
79
142
  end
80
143
  end
81
144
 
145
+ # @return [String]
82
146
  def to_s
83
147
  'None'
84
148
  end
85
149
  alias inspect to_s
86
150
  end
87
151
 
152
+ # A module that can be included for easier access to Maybe monads.
88
153
  module Mixin
89
154
  Maybe = Maybe
90
155
  Some = Some
91
156
  None = None
92
157
 
158
+ # @param value [Object] the value to be stored in the monad
159
+ # @return [Maybe::Some, Maybe::None]
93
160
  def Maybe(value)
94
161
  Maybe.lift(value)
95
162
  end
96
163
 
164
+ # @param value [Object] the value to be stored in the monad
165
+ # @return [Maybe::Some]
97
166
  def Some(value)
98
167
  Some.new(value)
99
168
  end
100
169
 
170
+ # @return [Maybe::None]
101
171
  def None
102
172
  None.instance
103
173
  end
@@ -1,96 +1,178 @@
1
1
  module Dry
2
2
  module Monads
3
+ # Represents a value which can be either success or a failure (an exception).
4
+ # Use it to wrap code that can raise exceptions.
5
+ #
6
+ # @api public
3
7
  class Try
4
8
  attr_reader :exception, :value
5
9
 
10
+ # Calls the passed in proc object and if successful stores the result in a
11
+ # {Try::Success} monad, but if one of the specified exceptions was raised it stores
12
+ # it in a {Try::Failure} monad.
13
+ #
14
+ # @param exceptions [Array<Exception>] list of exceptions to be rescued
15
+ # @param f [Proc] the proc to be called
16
+ # @return [Try::Success, Try::Failure]
6
17
  def self.lift(exceptions, f)
7
18
  Success.new(exceptions, f.call)
8
19
  rescue *exceptions => e
9
20
  Failure.new(e)
10
21
  end
11
22
 
23
+ # Returns true for an instance of a {Try::Success} monad.
12
24
  def success?
13
25
  is_a? Success
14
26
  end
15
27
 
28
+ # Returns true for an instance of a {Try::Failure} monad.
16
29
  def failure?
17
30
  is_a? Failure
18
31
  end
19
32
 
33
+ # Represents a result of a successful execution.
34
+ #
35
+ # @api public
20
36
  class Success < Try
37
+ include Dry::Equalizer(:value, :catchable)
21
38
  attr_reader :catchable
22
39
 
40
+ # @param exceptions [Array<Exception>] list of exceptions to be rescued
41
+ # @param value [Object] the value to be stored in the monad
23
42
  def initialize(exceptions, value)
24
43
  @catchable = exceptions
25
44
  @value = value
26
45
  end
27
46
 
28
- def bind(proc = nil)
29
- if proc
30
- proc.call(value)
47
+ # Calls the passed in Proc object with value stored in self
48
+ # and returns the result.
49
+ #
50
+ # If proc is nil, it expects a block to be given and will yield to it.
51
+ #
52
+ # @example
53
+ # success = Dry::Monads::Try::Success.new(ZeroDivisionError, 10)
54
+ # success.bind(->(n) { n / 2 }) # => 5
55
+ # success.bind { |n| n / 0 } # => Try::Failure(ZeroDivisionError: divided by 0)
56
+ #
57
+ # @param [Array<Object>] args arguments that will be passed to a block
58
+ # if one was given, otherwise the first
59
+ # value assumed to be a Proc (callable)
60
+ # object and the rest of args will be passed
61
+ # to this object along with the internal value
62
+ # @return [Object, Try::Failure]
63
+ def bind(*args)
64
+ if block_given?
65
+ yield(value, *args)
31
66
  else
32
- yield(@value)
67
+ args[0].call(value, *args.drop(1))
33
68
  end
34
69
  rescue *catchable => e
35
70
  Failure.new(e)
36
71
  end
37
72
 
38
- def fmap(proc = nil, &block)
39
- Try.lift(catchable, -> { (block || proc).call(@value) })
40
- end
41
-
42
- def ==(other)
43
- other.is_a?(Success) && @value == other.value && @catchable == other.catchable
73
+ # Does the same thing as #bind except it also wraps the value
74
+ # in an instance of a Try monad. This allows for easier
75
+ # chaining of calls.
76
+ #
77
+ # @example
78
+ # success = Dry::Monads::Try::Success.new(ZeroDivisionError, 10)
79
+ # success.fmap(&:succ).fmap(&:succ).value # => 12
80
+ # success.fmap(&:succ).fmap { |n| n / 0 }.fmap(&:succ).value # => nil
81
+ #
82
+ # @param [Array<Object>] args extra arguments for the block, arguments are being processes
83
+ # just as in #bind
84
+ # @return [Try::Success, Try::Failure]
85
+ def fmap(*args, &block)
86
+ if block
87
+ Try.lift(catchable, -> { yield(value, *args) })
88
+ else
89
+ Try.lift(catchable, -> { args[0].call(value, *args.drop(1)) })
90
+ end
44
91
  end
45
92
 
93
+ # @return [Maybe]
46
94
  def to_maybe
47
- Dry::Monads::Maybe(@value)
95
+ Dry::Monads::Maybe(value)
48
96
  end
49
97
 
98
+ # @return [Either::Right]
50
99
  def to_either
51
- Dry::Monads::Right(@value)
100
+ Dry::Monads::Right(value)
52
101
  end
53
102
 
103
+ # @return [String]
54
104
  def to_s
55
105
  "Try::Success(#{value.inspect})"
56
106
  end
57
107
  alias inspect to_s
58
108
  end
59
109
 
110
+ # Represents a result of a failed execution.
111
+ #
112
+ # @api public
60
113
  class Failure < Try
114
+ include Dry::Equalizer(:exception)
115
+
116
+ # @param exception [Exception]
61
117
  def initialize(exception)
62
118
  @exception = exception
63
119
  end
64
120
 
65
- def bind(_f = nil)
121
+ # Ignores arguments and returns self. It exists to keep the interface
122
+ # identical to that of {Try::Success}.
123
+ #
124
+ # @return [Try::Failure]
125
+ def bind(*)
66
126
  self
67
127
  end
68
128
 
69
- def fmap(_f = nil)
129
+ # Ignores arguments and returns self. It exists to keep the interface
130
+ # identical to that of {Try::Success}.
131
+ #
132
+ # @return [Try::Failure]
133
+ def fmap(*)
70
134
  self
71
135
  end
72
136
 
137
+ # @return [Maybe::None]
73
138
  def to_maybe
74
139
  Dry::Monads::None()
75
140
  end
76
141
 
142
+ # @return [Either::Left]
77
143
  def to_either
78
- Dry::Monads::Left(@exception)
79
- end
80
-
81
- def ==(other)
82
- other.is_a?(Failure) && @exception == other.exception
144
+ Dry::Monads::Left(exception)
83
145
  end
84
146
 
147
+ # @return [String]
85
148
  def to_s
86
149
  "Try::Failure(#{exception.class}: #{exception.message})"
87
150
  end
88
151
  alias inspect to_s
89
152
  end
90
153
 
154
+ # A module that can be included for easier access to Try monads.
155
+ #
156
+ # @example
157
+ # class Foo
158
+ # include Dry::Monads::Try::Mixin
159
+ #
160
+ # attr_reader :average
161
+ #
162
+ # def initialize(total, count)
163
+ # @average = Try(ZeroDivisionError) { total / count }.value
164
+ # end
165
+ # end
166
+ #
167
+ # Foo.new(10, 2).average # => 5
168
+ # Foo.new(10, 0).average # => nil
91
169
  module Mixin
92
170
  Try = Try
93
171
 
172
+ # A convenience wrapper for {Try.lift}.
173
+ # If no exceptions are provided it falls back to StandardError.
174
+ # In general, relying on this behaviour is not recommended as it can lead to unnoticed
175
+ # bugs and it is always better to explicitly specify a list of exceptions if possible.
94
176
  def Try(*exceptions, &f)
95
177
  catchable = exceptions.any? ? exceptions.flatten : [StandardError]
96
178
  Try.lift(catchable, f)
@@ -1,5 +1,5 @@
1
1
  module Dry
2
2
  module Monads
3
- VERSION = '0.0.2'.freeze
3
+ VERSION = '0.1.0'.freeze
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-monads
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nikita Shilnikov
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-06-29 00:00:00.000000000 Z
11
+ date: 2016-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dry-equalizer
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement