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.
- checksums.yaml +4 -4
- data/.tool-versions +1 -1
- data/.travis.sh +35 -10
- data/CHANGELOG.md +364 -26
- data/README.md +37 -36
- data/lib/kind.rb +2 -49
- data/lib/kind/__lib__/attributes.rb +66 -0
- data/lib/kind/__lib__/kind.rb +71 -0
- data/lib/kind/__lib__/undefined.rb +14 -0
- data/lib/kind/action.rb +92 -0
- data/lib/kind/active_model/validation.rb +1 -1
- data/lib/kind/basic.rb +73 -0
- data/lib/kind/basic/error.rb +29 -0
- data/lib/kind/{core → basic}/undefined.rb +6 -1
- data/lib/kind/{core/dig.rb → dig.rb} +20 -4
- data/lib/kind/either.rb +30 -0
- data/lib/kind/either/left.rb +29 -0
- data/lib/kind/either/methods.rb +17 -0
- data/lib/kind/either/monad.rb +65 -0
- data/lib/kind/either/monad/wrapper.rb +19 -0
- data/lib/kind/either/right.rb +38 -0
- data/lib/kind/{core/empty.rb → empty.rb} +2 -0
- data/lib/kind/{core/empty → empty}/constant.rb +0 -0
- data/lib/kind/enum.rb +63 -0
- data/lib/kind/enum/item.rb +40 -0
- data/lib/kind/enum/methods.rb +72 -0
- data/lib/kind/function.rb +47 -0
- data/lib/kind/functional.rb +89 -0
- data/lib/kind/functional/action.rb +89 -0
- data/lib/kind/immutable_attributes.rb +34 -0
- data/lib/kind/immutable_attributes/initializer.rb +70 -0
- data/lib/kind/immutable_attributes/reader.rb +38 -0
- data/lib/kind/maybe.rb +69 -0
- data/lib/kind/maybe/methods.rb +21 -0
- data/lib/kind/maybe/monad.rb +82 -0
- data/lib/kind/maybe/monad/wrapper.rb +19 -0
- data/lib/kind/{core/maybe → maybe}/none.rb +11 -18
- data/lib/kind/maybe/some.rb +132 -0
- data/lib/kind/maybe/typed.rb +35 -0
- data/lib/kind/{core/maybe/wrappable.rb → maybe/wrapper.rb} +8 -4
- data/lib/kind/monad.rb +22 -0
- data/lib/kind/monads.rb +5 -0
- data/lib/kind/objects.rb +17 -0
- data/lib/kind/objects/basic_object.rb +45 -0
- data/lib/kind/objects/modules.rb +32 -0
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/array.rb +3 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/class.rb +1 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/comparable.rb +1 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/enumerable.rb +1 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/enumerator.rb +1 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/file.rb +1 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/float.rb +1 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/hash.rb +3 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/integer.rb +1 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/io.rb +1 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/method.rb +1 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/module.rb +1 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/numeric.rb +1 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/proc.rb +1 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/queue.rb +1 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/range.rb +1 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/regexp.rb +1 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/string.rb +3 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/struct.rb +1 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/symbol.rb +1 -1
- data/lib/kind/{core/type_checkers/ruby → objects/modules/core}/time.rb +1 -1
- data/lib/kind/{core/type_checkers → objects/modules}/custom/boolean.rb +2 -2
- data/lib/kind/{core/type_checkers → objects/modules}/custom/callable.rb +1 -1
- data/lib/kind/{core/type_checkers → objects/modules}/custom/lambda.rb +1 -1
- data/lib/kind/{core/type_checkers → objects/modules}/stdlib/open_struct.rb +3 -1
- data/lib/kind/{core/type_checkers → objects/modules}/stdlib/set.rb +3 -1
- data/lib/kind/objects/nil.rb +17 -0
- data/lib/kind/objects/not_nil.rb +13 -0
- data/lib/kind/objects/object.rb +56 -0
- data/lib/kind/objects/respond_to.rb +30 -0
- data/lib/kind/objects/union_type.rb +44 -0
- data/lib/kind/{core/presence.rb → presence.rb} +4 -2
- data/lib/kind/result.rb +31 -0
- data/lib/kind/result/abstract.rb +53 -0
- data/lib/kind/result/failure.rb +31 -0
- data/lib/kind/result/methods.rb +17 -0
- data/lib/kind/result/monad.rb +69 -0
- data/lib/kind/result/monad/wrapper.rb +19 -0
- data/lib/kind/result/success.rb +40 -0
- data/lib/kind/try.rb +46 -0
- data/lib/kind/validator.rb +14 -10
- data/lib/kind/version.rb +1 -1
- metadata +81 -47
- data/lib/kind/core.rb +0 -15
- data/lib/kind/core/error.rb +0 -15
- data/lib/kind/core/maybe.rb +0 -42
- data/lib/kind/core/maybe/result.rb +0 -51
- data/lib/kind/core/maybe/some.rb +0 -90
- data/lib/kind/core/maybe/typed.rb +0 -29
- data/lib/kind/core/try.rb +0 -34
- data/lib/kind/core/type_checker.rb +0 -87
- data/lib/kind/core/type_checkers.rb +0 -30
- data/lib/kind/core/utils/kind.rb +0 -61
- 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
|
data/lib/kind/validator.rb
CHANGED
@@ -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
|
-
|
80
|
+
if ::Array === expected
|
81
|
+
return if expected.any? { |type| type === value }
|
81
82
|
|
82
|
-
|
83
|
+
"must be a kind of #{expected.map { |type| type.name }.join(', ')}"
|
84
|
+
else
|
85
|
+
return if expected === value
|
83
86
|
|
84
|
-
|
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
|
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
|
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
|
139
|
+
return if value.kind_of?(::Array) && !value.empty? && (value - Kind.of!(::Array, expected)).empty?
|
136
140
|
|
137
|
-
"must be an array with
|
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
|
149
|
+
"must be an array of #{types.map { |klass| klass.name }.join(', ')}"
|
146
150
|
end
|
147
151
|
end
|
data/lib/kind/version.rb
CHANGED
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.
|
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-
|
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/
|
36
|
-
- lib/kind/
|
37
|
-
- lib/kind/
|
38
|
-
- lib/kind/
|
39
|
-
- lib/kind/
|
40
|
-
- lib/kind/
|
41
|
-
- lib/kind/
|
42
|
-
- lib/kind/
|
43
|
-
- lib/kind/
|
44
|
-
- lib/kind/
|
45
|
-
- lib/kind/
|
46
|
-
- lib/kind/
|
47
|
-
- lib/kind/
|
48
|
-
- lib/kind/
|
49
|
-
- lib/kind/
|
50
|
-
- lib/kind/
|
51
|
-
- lib/kind/
|
52
|
-
- lib/kind/
|
53
|
-
- lib/kind/
|
54
|
-
- lib/kind/
|
55
|
-
- lib/kind/
|
56
|
-
- lib/kind/
|
57
|
-
- lib/kind/
|
58
|
-
- lib/kind/
|
59
|
-
- lib/kind/
|
60
|
-
- lib/kind/
|
61
|
-
- lib/kind/
|
62
|
-
- lib/kind/
|
63
|
-
- lib/kind/
|
64
|
-
- lib/kind/
|
65
|
-
- lib/kind/
|
66
|
-
- lib/kind/
|
67
|
-
- lib/kind/
|
68
|
-
- lib/kind/
|
69
|
-
- lib/kind/
|
70
|
-
- lib/kind/
|
71
|
-
- lib/kind/
|
72
|
-
- lib/kind/
|
73
|
-
- lib/kind/
|
74
|
-
- lib/kind/
|
75
|
-
- lib/kind/
|
76
|
-
- lib/kind/core/
|
77
|
-
- lib/kind/core/
|
78
|
-
- lib/kind/core/
|
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.
|
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'
|
data/lib/kind/core/error.rb
DELETED
@@ -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
|
data/lib/kind/core/maybe.rb
DELETED
@@ -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
|
data/lib/kind/core/maybe/some.rb
DELETED
@@ -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
|