kind 5.1.0 → 5.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.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/.tool-versions +1 -1
  3. data/.travis.sh +35 -10
  4. data/CHANGELOG.md +364 -26
  5. data/README.md +37 -36
  6. data/lib/kind.rb +2 -49
  7. data/lib/kind/__lib__/attributes.rb +66 -0
  8. data/lib/kind/__lib__/kind.rb +71 -0
  9. data/lib/kind/__lib__/undefined.rb +14 -0
  10. data/lib/kind/action.rb +92 -0
  11. data/lib/kind/active_model/validation.rb +1 -1
  12. data/lib/kind/basic.rb +73 -0
  13. data/lib/kind/basic/error.rb +29 -0
  14. data/lib/kind/{core → basic}/undefined.rb +6 -1
  15. data/lib/kind/{core/dig.rb → dig.rb} +20 -4
  16. data/lib/kind/either.rb +30 -0
  17. data/lib/kind/either/left.rb +29 -0
  18. data/lib/kind/either/methods.rb +17 -0
  19. data/lib/kind/either/monad.rb +65 -0
  20. data/lib/kind/either/monad/wrapper.rb +19 -0
  21. data/lib/kind/either/right.rb +38 -0
  22. data/lib/kind/{core/empty.rb → empty.rb} +2 -0
  23. data/lib/kind/{core/empty → empty}/constant.rb +0 -0
  24. data/lib/kind/enum.rb +63 -0
  25. data/lib/kind/enum/item.rb +40 -0
  26. data/lib/kind/enum/methods.rb +72 -0
  27. data/lib/kind/function.rb +47 -0
  28. data/lib/kind/functional.rb +89 -0
  29. data/lib/kind/functional/action.rb +89 -0
  30. data/lib/kind/immutable_attributes.rb +34 -0
  31. data/lib/kind/immutable_attributes/initializer.rb +70 -0
  32. data/lib/kind/immutable_attributes/reader.rb +38 -0
  33. data/lib/kind/maybe.rb +69 -0
  34. data/lib/kind/maybe/methods.rb +21 -0
  35. data/lib/kind/maybe/monad.rb +82 -0
  36. data/lib/kind/maybe/monad/wrapper.rb +19 -0
  37. data/lib/kind/{core/maybe → maybe}/none.rb +11 -18
  38. data/lib/kind/maybe/some.rb +132 -0
  39. data/lib/kind/maybe/typed.rb +35 -0
  40. data/lib/kind/{core/maybe/wrappable.rb → maybe/wrapper.rb} +8 -4
  41. data/lib/kind/monad.rb +22 -0
  42. data/lib/kind/monads.rb +5 -0
  43. data/lib/kind/objects.rb +17 -0
  44. data/lib/kind/objects/basic_object.rb +45 -0
  45. data/lib/kind/objects/modules.rb +32 -0
  46. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/array.rb +3 -1
  47. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/class.rb +1 -1
  48. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/comparable.rb +1 -1
  49. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/enumerable.rb +1 -1
  50. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/enumerator.rb +1 -1
  51. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/file.rb +1 -1
  52. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/float.rb +1 -1
  53. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/hash.rb +3 -1
  54. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/integer.rb +1 -1
  55. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/io.rb +1 -1
  56. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/method.rb +1 -1
  57. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/module.rb +1 -1
  58. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/numeric.rb +1 -1
  59. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/proc.rb +1 -1
  60. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/queue.rb +1 -1
  61. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/range.rb +1 -1
  62. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/regexp.rb +1 -1
  63. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/string.rb +3 -1
  64. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/struct.rb +1 -1
  65. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/symbol.rb +1 -1
  66. data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/time.rb +1 -1
  67. data/lib/kind/{core/type_checkers → objects/modules}/custom/boolean.rb +2 -2
  68. data/lib/kind/{core/type_checkers → objects/modules}/custom/callable.rb +1 -1
  69. data/lib/kind/{core/type_checkers → objects/modules}/custom/lambda.rb +1 -1
  70. data/lib/kind/{core/type_checkers → objects/modules}/stdlib/open_struct.rb +3 -1
  71. data/lib/kind/{core/type_checkers → objects/modules}/stdlib/set.rb +3 -1
  72. data/lib/kind/objects/nil.rb +17 -0
  73. data/lib/kind/objects/not_nil.rb +13 -0
  74. data/lib/kind/objects/object.rb +56 -0
  75. data/lib/kind/objects/respond_to.rb +30 -0
  76. data/lib/kind/objects/union_type.rb +44 -0
  77. data/lib/kind/{core/presence.rb → presence.rb} +4 -2
  78. data/lib/kind/result.rb +31 -0
  79. data/lib/kind/result/abstract.rb +53 -0
  80. data/lib/kind/result/failure.rb +31 -0
  81. data/lib/kind/result/methods.rb +17 -0
  82. data/lib/kind/result/monad.rb +69 -0
  83. data/lib/kind/result/monad/wrapper.rb +19 -0
  84. data/lib/kind/result/success.rb +40 -0
  85. data/lib/kind/try.rb +46 -0
  86. data/lib/kind/validator.rb +14 -10
  87. data/lib/kind/version.rb +1 -1
  88. metadata +81 -47
  89. data/lib/kind/core.rb +0 -15
  90. data/lib/kind/core/error.rb +0 -15
  91. data/lib/kind/core/maybe.rb +0 -42
  92. data/lib/kind/core/maybe/result.rb +0 -51
  93. data/lib/kind/core/maybe/some.rb +0 -90
  94. data/lib/kind/core/maybe/typed.rb +0 -29
  95. data/lib/kind/core/try.rb +0 -34
  96. data/lib/kind/core/type_checker.rb +0 -87
  97. data/lib/kind/core/type_checkers.rb +0 -30
  98. data/lib/kind/core/utils/kind.rb +0 -61
  99. data/lib/kind/core/utils/undefined.rb +0 -7
data/lib/kind/try.rb ADDED
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kind/basic'
4
+ require 'kind/empty'
5
+ require 'kind/presence'
6
+
7
+ module Kind
8
+ module Try
9
+ extend self
10
+
11
+ def call!(object, method_name, args = Empty::ARRAY) # :nodoc
12
+ return if KIND.null?(object)
13
+
14
+ resolve(object, method_name, args)
15
+ end
16
+
17
+ def call(object, *input)
18
+ args = input.size == 1 && input[0].kind_of?(::Array) ? input[0] : input
19
+
20
+ result = call!(object, args.shift, args)
21
+
22
+ return result unless block_given?
23
+
24
+ yield(result) unless KIND.null?(result)
25
+ end
26
+
27
+ def presence(*args, &block)
28
+ Presence.(call(*args, &block))
29
+ end
30
+
31
+ def self.[](*args)
32
+ method_name = args.shift
33
+
34
+ ->(object) { call!(object, method_name, args) }
35
+ end
36
+
37
+ private
38
+
39
+ def resolve(object, method_name, args)
40
+ return unless object.respond_to?(method_name)
41
+ return object.public_send(method_name) if args.empty?
42
+
43
+ object.public_send(method_name, *args)
44
+ end
45
+ end
46
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'kind'
3
+ require 'kind/basic'
4
4
 
5
5
  module Kind
6
6
  module Validator
@@ -77,11 +77,15 @@ class KindValidator < ActiveModel::EachValidator
77
77
  end
78
78
 
79
79
  def kind_of(expected, value)
80
- types = Array(expected)
80
+ if ::Array === expected
81
+ return if expected.any? { |type| type === value }
81
82
 
82
- return if types.any? { |type| type === value }
83
+ "must be a kind of #{expected.map { |type| type.name }.join(', ')}"
84
+ else
85
+ return if expected === value
83
86
 
84
- "must be a kind of: #{types.map { |type| type.name }.join(', ')}"
87
+ expected.respond_to?(:name) ? "must be a kind of #{expected.name}" : 'invalid kind'
88
+ end
85
89
  end
86
90
 
87
91
  CLASS_OR_MODULE = 'Class/Module'.freeze
@@ -97,11 +101,11 @@ class KindValidator < ActiveModel::EachValidator
97
101
  def kind_is_not(expected, value)
98
102
  case expected
99
103
  when ::Class
100
- return if expected == Kind::Class[value] || value < expected
104
+ return if expected == Kind.of!(::Class, value) || value < expected
101
105
 
102
106
  "must be the class or a subclass of `#{expected.name}`"
103
107
  when ::Module
104
- return if value.kind_of?(Class) && value <= expected
108
+ return if value.kind_of?(::Class) && value <= expected
105
109
  return if expected == Kind.of_module_or_class(value) || value.kind_of?(expected)
106
110
 
107
111
  "must include the `#{expected.name}` module"
@@ -128,13 +132,13 @@ class KindValidator < ActiveModel::EachValidator
128
132
 
129
133
  return if types.any? { |type| value.instance_of?(type) }
130
134
 
131
- "must be an instance of: #{types.map { |klass| klass.name }.join(', ')}"
135
+ "must be an instance of #{types.map { |klass| klass.name }.join(', ')}"
132
136
  end
133
137
 
134
138
  def array_with(expected, value)
135
- return if value.kind_of?(::Array) && !value.empty? && (value - Kind::Array[expected]).empty?
139
+ return if value.kind_of?(::Array) && !value.empty? && (value - Kind.of!(::Array, expected)).empty?
136
140
 
137
- "must be an array with: #{expected.join(', ')}"
141
+ "must be an array with #{expected.join(', ')}"
138
142
  end
139
143
 
140
144
  def array_of(expected, value)
@@ -142,6 +146,6 @@ class KindValidator < ActiveModel::EachValidator
142
146
 
143
147
  return if value.kind_of?(::Array) && !value.empty? && value.all? { |val| types.any? { |type| type === val } }
144
148
 
145
- "must be an array of: #{types.map { |klass| klass.name }.join(', ')}"
149
+ "must be an array of #{types.map { |klass| klass.name }.join(', ')}"
146
150
  end
147
151
  end
data/lib/kind/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kind
4
- VERSION = '5.1.0'
4
+ VERSION = '5.2.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kind
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.1.0
4
+ version: 5.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rodrigo Serradura
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-02-24 00:00:00.000000000 Z
11
+ date: 2021-03-18 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: A simple type system (at runtime) for Ruby - free of dependencies.
14
14
  email:
@@ -31,51 +31,85 @@ files:
31
31
  - bin/setup
32
32
  - kind.gemspec
33
33
  - lib/kind.rb
34
+ - lib/kind/__lib__/attributes.rb
35
+ - lib/kind/__lib__/kind.rb
36
+ - lib/kind/__lib__/undefined.rb
37
+ - lib/kind/action.rb
34
38
  - lib/kind/active_model/validation.rb
35
- - lib/kind/core.rb
36
- - lib/kind/core/dig.rb
37
- - lib/kind/core/empty.rb
38
- - lib/kind/core/empty/constant.rb
39
- - lib/kind/core/error.rb
40
- - lib/kind/core/maybe.rb
41
- - lib/kind/core/maybe/none.rb
42
- - lib/kind/core/maybe/result.rb
43
- - lib/kind/core/maybe/some.rb
44
- - lib/kind/core/maybe/typed.rb
45
- - lib/kind/core/maybe/wrappable.rb
46
- - lib/kind/core/presence.rb
47
- - lib/kind/core/try.rb
48
- - lib/kind/core/type_checker.rb
49
- - lib/kind/core/type_checkers.rb
50
- - lib/kind/core/type_checkers/custom/boolean.rb
51
- - lib/kind/core/type_checkers/custom/callable.rb
52
- - lib/kind/core/type_checkers/custom/lambda.rb
53
- - lib/kind/core/type_checkers/ruby/array.rb
54
- - lib/kind/core/type_checkers/ruby/class.rb
55
- - lib/kind/core/type_checkers/ruby/comparable.rb
56
- - lib/kind/core/type_checkers/ruby/enumerable.rb
57
- - lib/kind/core/type_checkers/ruby/enumerator.rb
58
- - lib/kind/core/type_checkers/ruby/file.rb
59
- - lib/kind/core/type_checkers/ruby/float.rb
60
- - lib/kind/core/type_checkers/ruby/hash.rb
61
- - lib/kind/core/type_checkers/ruby/integer.rb
62
- - lib/kind/core/type_checkers/ruby/io.rb
63
- - lib/kind/core/type_checkers/ruby/method.rb
64
- - lib/kind/core/type_checkers/ruby/module.rb
65
- - lib/kind/core/type_checkers/ruby/numeric.rb
66
- - lib/kind/core/type_checkers/ruby/proc.rb
67
- - lib/kind/core/type_checkers/ruby/queue.rb
68
- - lib/kind/core/type_checkers/ruby/range.rb
69
- - lib/kind/core/type_checkers/ruby/regexp.rb
70
- - lib/kind/core/type_checkers/ruby/string.rb
71
- - lib/kind/core/type_checkers/ruby/struct.rb
72
- - lib/kind/core/type_checkers/ruby/symbol.rb
73
- - lib/kind/core/type_checkers/ruby/time.rb
74
- - lib/kind/core/type_checkers/stdlib/open_struct.rb
75
- - lib/kind/core/type_checkers/stdlib/set.rb
76
- - lib/kind/core/undefined.rb
77
- - lib/kind/core/utils/kind.rb
78
- - lib/kind/core/utils/undefined.rb
39
+ - lib/kind/basic.rb
40
+ - lib/kind/basic/error.rb
41
+ - lib/kind/basic/undefined.rb
42
+ - lib/kind/dig.rb
43
+ - lib/kind/either.rb
44
+ - lib/kind/either/left.rb
45
+ - lib/kind/either/methods.rb
46
+ - lib/kind/either/monad.rb
47
+ - lib/kind/either/monad/wrapper.rb
48
+ - lib/kind/either/right.rb
49
+ - lib/kind/empty.rb
50
+ - lib/kind/empty/constant.rb
51
+ - lib/kind/enum.rb
52
+ - lib/kind/enum/item.rb
53
+ - lib/kind/enum/methods.rb
54
+ - lib/kind/function.rb
55
+ - lib/kind/functional.rb
56
+ - lib/kind/functional/action.rb
57
+ - lib/kind/immutable_attributes.rb
58
+ - lib/kind/immutable_attributes/initializer.rb
59
+ - lib/kind/immutable_attributes/reader.rb
60
+ - lib/kind/maybe.rb
61
+ - lib/kind/maybe/methods.rb
62
+ - lib/kind/maybe/monad.rb
63
+ - lib/kind/maybe/monad/wrapper.rb
64
+ - lib/kind/maybe/none.rb
65
+ - lib/kind/maybe/some.rb
66
+ - lib/kind/maybe/typed.rb
67
+ - lib/kind/maybe/wrapper.rb
68
+ - lib/kind/monad.rb
69
+ - lib/kind/monads.rb
70
+ - lib/kind/objects.rb
71
+ - lib/kind/objects/basic_object.rb
72
+ - lib/kind/objects/modules.rb
73
+ - lib/kind/objects/modules/core/array.rb
74
+ - lib/kind/objects/modules/core/class.rb
75
+ - lib/kind/objects/modules/core/comparable.rb
76
+ - lib/kind/objects/modules/core/enumerable.rb
77
+ - lib/kind/objects/modules/core/enumerator.rb
78
+ - lib/kind/objects/modules/core/file.rb
79
+ - lib/kind/objects/modules/core/float.rb
80
+ - lib/kind/objects/modules/core/hash.rb
81
+ - lib/kind/objects/modules/core/integer.rb
82
+ - lib/kind/objects/modules/core/io.rb
83
+ - lib/kind/objects/modules/core/method.rb
84
+ - lib/kind/objects/modules/core/module.rb
85
+ - lib/kind/objects/modules/core/numeric.rb
86
+ - lib/kind/objects/modules/core/proc.rb
87
+ - lib/kind/objects/modules/core/queue.rb
88
+ - lib/kind/objects/modules/core/range.rb
89
+ - lib/kind/objects/modules/core/regexp.rb
90
+ - lib/kind/objects/modules/core/string.rb
91
+ - lib/kind/objects/modules/core/struct.rb
92
+ - lib/kind/objects/modules/core/symbol.rb
93
+ - lib/kind/objects/modules/core/time.rb
94
+ - lib/kind/objects/modules/custom/boolean.rb
95
+ - lib/kind/objects/modules/custom/callable.rb
96
+ - lib/kind/objects/modules/custom/lambda.rb
97
+ - lib/kind/objects/modules/stdlib/open_struct.rb
98
+ - lib/kind/objects/modules/stdlib/set.rb
99
+ - lib/kind/objects/nil.rb
100
+ - lib/kind/objects/not_nil.rb
101
+ - lib/kind/objects/object.rb
102
+ - lib/kind/objects/respond_to.rb
103
+ - lib/kind/objects/union_type.rb
104
+ - lib/kind/presence.rb
105
+ - lib/kind/result.rb
106
+ - lib/kind/result/abstract.rb
107
+ - lib/kind/result/failure.rb
108
+ - lib/kind/result/methods.rb
109
+ - lib/kind/result/monad.rb
110
+ - lib/kind/result/monad/wrapper.rb
111
+ - lib/kind/result/success.rb
112
+ - lib/kind/try.rb
79
113
  - lib/kind/validator.rb
80
114
  - lib/kind/version.rb
81
115
  - test.sh
@@ -100,7 +134,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
134
  - !ruby/object:Gem::Version
101
135
  version: '0'
102
136
  requirements: []
103
- rubygems_version: 3.1.4
137
+ rubygems_version: 3.2.11
104
138
  signing_key:
105
139
  specification_version: 4
106
140
  summary: A simple type system (at runtime) for Ruby.
data/lib/kind/core.rb DELETED
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'kind/core/utils/kind'
4
- require 'kind/core/utils/undefined'
5
-
6
- require 'kind/core/error'
7
- require 'kind/core/empty'
8
- require 'kind/core/dig'
9
- require 'kind/core/try'
10
- require 'kind/core/presence'
11
- require 'kind/core/undefined'
12
- require 'kind/core/maybe'
13
-
14
- require 'kind/core/type_checker'
15
- require 'kind/core/type_checkers'
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- class Error < TypeError
5
- def initialize(arg, object = UNDEFINED)
6
- if UNDEFINED == object
7
- # Will be used when the exception was raised with a message. e.g:
8
- # raise Kind::Error, "some message"
9
- super(arg)
10
- else
11
- super("#{object.inspect} expected to be a kind of #{arg}")
12
- end
13
- end
14
- end
15
- end
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module Maybe
5
- require 'kind/core/maybe/result'
6
- require 'kind/core/maybe/none'
7
- require 'kind/core/maybe/some'
8
- require 'kind/core/maybe/wrappable'
9
- require 'kind/core/maybe/typed'
10
-
11
- extend self
12
-
13
- def new(value)
14
- (KIND.null?(value) ? None : Some)
15
- .new(value)
16
- end
17
-
18
- alias_method :[], :new
19
-
20
- extend Wrappable
21
- end
22
-
23
- Optional = Maybe
24
-
25
- None = Maybe.none
26
-
27
- def self.None
28
- None
29
- end
30
-
31
- def self.Some(value)
32
- Maybe.some(value)
33
- end
34
-
35
- def self.Maybe(kind)
36
- Maybe::Typed.new(kind)
37
- end
38
-
39
- def self.Optional(kind)
40
- Maybe::Typed.new(kind)
41
- end
42
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module Maybe
5
- class Result
6
- attr_reader :value
7
-
8
- Value = ->(arg) { arg.kind_of?(Maybe::Result) ? arg.value : arg } # :nodoc:
9
-
10
- def initialize(arg)
11
- @value = Value.(arg)
12
- end
13
-
14
- def value_or(method_name = UNDEFINED, &block)
15
- raise NotImplementedError
16
- end
17
-
18
- def none?
19
- raise NotImplementedError
20
- end
21
-
22
- def some?; !none?; end
23
-
24
- def map(&fn)
25
- raise NotImplementedError
26
- end
27
-
28
- alias_method :map!, :map
29
- alias_method :then, :map
30
- alias_method :then!, :map
31
-
32
- def check(&fn)
33
- raise NotImplementedError
34
- end
35
-
36
- def try(method_name = UNDEFINED, &block)
37
- raise NotImplementedError
38
- end
39
-
40
- alias_method :try!, :try
41
-
42
- def dig(*keys)
43
- raise NotImplementedError
44
- end
45
-
46
- def presence
47
- raise NotImplementedError
48
- end
49
- end
50
- end
51
- end
@@ -1,90 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module Maybe
5
- class Some < Result
6
- def value_or(default = UNDEFINED, &block)
7
- @value
8
- end
9
-
10
- def none?; false; end
11
-
12
- def map(&fn)
13
- map!(&fn)
14
- rescue StandardError => exception
15
- None.new(exception)
16
- end
17
-
18
- alias_method :then, :map
19
-
20
- def check(&fn)
21
- result = fn.call(@value)
22
-
23
- !result || KIND.null?(result) ? NONE_WITH_NIL_VALUE : self
24
- end
25
-
26
- def map!(&fn)
27
- result = fn.call(@value)
28
-
29
- resolve(result)
30
- end
31
-
32
- alias_method :then!, :map!
33
-
34
- def try!(method_name = UNDEFINED, *args, &block)
35
- return __try_block__(block, args) if block
36
-
37
- return __try_method__(method_name, args) if UNDEFINED != method_name
38
-
39
- raise ArgumentError, 'method name or a block must be present'
40
- end
41
-
42
- def try(method_name = UNDEFINED, *args, &block)
43
- return __try_block__(block, args) if block
44
-
45
- return __try_method__(method_name, args) if value.respond_to?(method_name)
46
-
47
- NONE_WITH_NIL_VALUE
48
- end
49
-
50
- def dig(*keys)
51
- resolve(Dig.(value, keys))
52
- end
53
-
54
- def presence
55
- resolve(Presence.(value))
56
- end
57
-
58
- private
59
-
60
- def __try_method__(method_name, args)
61
- __try_block__(KIND.of!(::Symbol, method_name).to_proc, args)
62
- end
63
-
64
- def __try_block__(block, args)
65
- result = args.empty? ? block.call(value) : block.call(*args.unshift(value))
66
-
67
- resolve(result)
68
- end
69
-
70
- def resolve(result)
71
- return result if Maybe::None === result
72
- return None.new(result) if Exception === result
73
- return NONE_WITH_NIL_VALUE if result.nil?
74
- return NONE_WITH_UNDEFINED_VALUE if Undefined == result
75
-
76
- Some.new(result)
77
- end
78
- end
79
-
80
- VALUE_CANT_BE_NONE = "value can't be nil or Kind::Undefined".freeze
81
-
82
- def self.some(value)
83
- return Maybe::Some.new(value) if !KIND.null?(value)
84
-
85
- raise ArgumentError, VALUE_CANT_BE_NONE
86
- end
87
-
88
- private_constant :VALUE_CANT_BE_NONE
89
- end
90
- end