kind 5.0.0 → 5.4.1
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 +39 -7
- data/.travis.yml +1 -0
- data/CHANGELOG.md +506 -28
- data/Gemfile +13 -6
- data/README.md +50 -42
- data/kind.gemspec +3 -3
- data/lib/kind.rb +2 -60
- data/lib/kind/__lib__/action_steps.rb +57 -0
- data/lib/kind/__lib__/attributes.rb +66 -0
- data/lib/kind/__lib__/kind.rb +51 -0
- data/lib/kind/__lib__/of.rb +17 -0
- data/lib/kind/__lib__/strict.rb +49 -0
- data/lib/kind/__lib__/undefined.rb +14 -0
- data/lib/kind/action.rb +127 -0
- data/lib/kind/active_model/validation.rb +3 -4
- data/lib/kind/basic.rb +79 -0
- data/lib/kind/basic/error.rb +29 -0
- data/lib/kind/{undefined.rb → basic/undefined.rb} +6 -1
- data/lib/kind/dig.rb +21 -5
- 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/empty.rb +2 -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 +45 -0
- data/lib/kind/functional.rb +89 -0
- data/lib/kind/functional/action.rb +87 -0
- data/lib/kind/functional/steps.rb +22 -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 +37 -12
- 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/maybe/none.rb +12 -19
- data/lib/kind/maybe/some.rb +68 -26
- data/lib/kind/maybe/typed.rb +11 -5
- data/lib/kind/maybe/{wrappable.rb → 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 +43 -0
- data/lib/kind/objects/modules.rb +32 -0
- data/lib/kind/{type_checkers → objects/modules}/core/array.rb +3 -1
- data/lib/kind/{type_checkers → objects/modules}/core/class.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/comparable.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/enumerable.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/enumerator.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/file.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/float.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/hash.rb +3 -1
- data/lib/kind/{type_checkers → objects/modules}/core/integer.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/io.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/method.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/module.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/numeric.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/proc.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/queue.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/range.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/regexp.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/string.rb +3 -1
- data/lib/kind/{type_checkers → objects/modules}/core/struct.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/symbol.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/core/time.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/custom/boolean.rb +2 -2
- data/lib/kind/{type_checkers → objects/modules}/custom/callable.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/custom/lambda.rb +1 -1
- data/lib/kind/{type_checkers → objects/modules}/stdlib/open_struct.rb +3 -1
- data/lib/kind/{type_checkers → objects/modules}/stdlib/set.rb +3 -1
- data/lib/kind/objects/nil.rb +17 -0
- data/lib/kind/objects/not_nil.rb +9 -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/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 +33 -0
- data/lib/kind/result/methods.rb +17 -0
- data/lib/kind/result/monad.rb +74 -0
- data/lib/kind/result/monad/wrapper.rb +19 -0
- data/lib/kind/result/success.rb +53 -0
- data/lib/kind/strict/disabled.rb +34 -0
- data/lib/kind/try.rb +22 -10
- data/lib/kind/validator.rb +111 -0
- data/lib/kind/version.rb +1 -1
- metadata +83 -42
- data/lib/kind/active_model/kind_validator.rb +0 -103
- data/lib/kind/core.rb +0 -8
- data/lib/kind/core/kind.rb +0 -61
- data/lib/kind/core/undefined.rb +0 -7
- data/lib/kind/error.rb +0 -15
- data/lib/kind/maybe/result.rb +0 -51
- data/lib/kind/type_checker.rb +0 -87
- data/lib/kind/type_checkers.rb +0 -30
data/lib/kind/version.rb
CHANGED
metadata
CHANGED
@@ -1,16 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kind
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.
|
4
|
+
version: 5.4.1
|
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-26 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
|
-
description: A
|
13
|
+
description: A development toolkit for Ruby with several small/cohesive abstractions
|
14
|
+
(monads, enums, business logic, data validation...) to empower your development
|
15
|
+
workflow - It's totally free of dependencies.
|
14
16
|
email:
|
15
17
|
- rodrigo.serradura@gmail.com
|
16
18
|
executables: []
|
@@ -31,52 +33,90 @@ files:
|
|
31
33
|
- bin/setup
|
32
34
|
- kind.gemspec
|
33
35
|
- lib/kind.rb
|
34
|
-
- lib/kind/
|
36
|
+
- lib/kind/__lib__/action_steps.rb
|
37
|
+
- lib/kind/__lib__/attributes.rb
|
38
|
+
- lib/kind/__lib__/kind.rb
|
39
|
+
- lib/kind/__lib__/of.rb
|
40
|
+
- lib/kind/__lib__/strict.rb
|
41
|
+
- lib/kind/__lib__/undefined.rb
|
42
|
+
- lib/kind/action.rb
|
35
43
|
- lib/kind/active_model/validation.rb
|
36
|
-
- lib/kind/
|
37
|
-
- lib/kind/
|
38
|
-
- lib/kind/
|
44
|
+
- lib/kind/basic.rb
|
45
|
+
- lib/kind/basic/error.rb
|
46
|
+
- lib/kind/basic/undefined.rb
|
39
47
|
- lib/kind/dig.rb
|
48
|
+
- lib/kind/either.rb
|
49
|
+
- lib/kind/either/left.rb
|
50
|
+
- lib/kind/either/methods.rb
|
51
|
+
- lib/kind/either/monad.rb
|
52
|
+
- lib/kind/either/monad/wrapper.rb
|
53
|
+
- lib/kind/either/right.rb
|
40
54
|
- lib/kind/empty.rb
|
41
55
|
- lib/kind/empty/constant.rb
|
42
|
-
- lib/kind/
|
56
|
+
- lib/kind/enum.rb
|
57
|
+
- lib/kind/enum/item.rb
|
58
|
+
- lib/kind/enum/methods.rb
|
59
|
+
- lib/kind/function.rb
|
60
|
+
- lib/kind/functional.rb
|
61
|
+
- lib/kind/functional/action.rb
|
62
|
+
- lib/kind/functional/steps.rb
|
63
|
+
- lib/kind/immutable_attributes.rb
|
64
|
+
- lib/kind/immutable_attributes/initializer.rb
|
65
|
+
- lib/kind/immutable_attributes/reader.rb
|
43
66
|
- lib/kind/maybe.rb
|
67
|
+
- lib/kind/maybe/methods.rb
|
68
|
+
- lib/kind/maybe/monad.rb
|
69
|
+
- lib/kind/maybe/monad/wrapper.rb
|
44
70
|
- lib/kind/maybe/none.rb
|
45
|
-
- lib/kind/maybe/result.rb
|
46
71
|
- lib/kind/maybe/some.rb
|
47
72
|
- lib/kind/maybe/typed.rb
|
48
|
-
- lib/kind/maybe/
|
73
|
+
- lib/kind/maybe/wrapper.rb
|
74
|
+
- lib/kind/monad.rb
|
75
|
+
- lib/kind/monads.rb
|
76
|
+
- lib/kind/objects.rb
|
77
|
+
- lib/kind/objects/basic_object.rb
|
78
|
+
- lib/kind/objects/modules.rb
|
79
|
+
- lib/kind/objects/modules/core/array.rb
|
80
|
+
- lib/kind/objects/modules/core/class.rb
|
81
|
+
- lib/kind/objects/modules/core/comparable.rb
|
82
|
+
- lib/kind/objects/modules/core/enumerable.rb
|
83
|
+
- lib/kind/objects/modules/core/enumerator.rb
|
84
|
+
- lib/kind/objects/modules/core/file.rb
|
85
|
+
- lib/kind/objects/modules/core/float.rb
|
86
|
+
- lib/kind/objects/modules/core/hash.rb
|
87
|
+
- lib/kind/objects/modules/core/integer.rb
|
88
|
+
- lib/kind/objects/modules/core/io.rb
|
89
|
+
- lib/kind/objects/modules/core/method.rb
|
90
|
+
- lib/kind/objects/modules/core/module.rb
|
91
|
+
- lib/kind/objects/modules/core/numeric.rb
|
92
|
+
- lib/kind/objects/modules/core/proc.rb
|
93
|
+
- lib/kind/objects/modules/core/queue.rb
|
94
|
+
- lib/kind/objects/modules/core/range.rb
|
95
|
+
- lib/kind/objects/modules/core/regexp.rb
|
96
|
+
- lib/kind/objects/modules/core/string.rb
|
97
|
+
- lib/kind/objects/modules/core/struct.rb
|
98
|
+
- lib/kind/objects/modules/core/symbol.rb
|
99
|
+
- lib/kind/objects/modules/core/time.rb
|
100
|
+
- lib/kind/objects/modules/custom/boolean.rb
|
101
|
+
- lib/kind/objects/modules/custom/callable.rb
|
102
|
+
- lib/kind/objects/modules/custom/lambda.rb
|
103
|
+
- lib/kind/objects/modules/stdlib/open_struct.rb
|
104
|
+
- lib/kind/objects/modules/stdlib/set.rb
|
105
|
+
- lib/kind/objects/nil.rb
|
106
|
+
- lib/kind/objects/not_nil.rb
|
107
|
+
- lib/kind/objects/object.rb
|
108
|
+
- lib/kind/objects/respond_to.rb
|
109
|
+
- lib/kind/objects/union_type.rb
|
49
110
|
- lib/kind/presence.rb
|
111
|
+
- lib/kind/result.rb
|
112
|
+
- lib/kind/result/abstract.rb
|
113
|
+
- lib/kind/result/failure.rb
|
114
|
+
- lib/kind/result/methods.rb
|
115
|
+
- lib/kind/result/monad.rb
|
116
|
+
- lib/kind/result/monad/wrapper.rb
|
117
|
+
- lib/kind/result/success.rb
|
118
|
+
- lib/kind/strict/disabled.rb
|
50
119
|
- lib/kind/try.rb
|
51
|
-
- lib/kind/type_checker.rb
|
52
|
-
- lib/kind/type_checkers.rb
|
53
|
-
- lib/kind/type_checkers/core/array.rb
|
54
|
-
- lib/kind/type_checkers/core/class.rb
|
55
|
-
- lib/kind/type_checkers/core/comparable.rb
|
56
|
-
- lib/kind/type_checkers/core/enumerable.rb
|
57
|
-
- lib/kind/type_checkers/core/enumerator.rb
|
58
|
-
- lib/kind/type_checkers/core/file.rb
|
59
|
-
- lib/kind/type_checkers/core/float.rb
|
60
|
-
- lib/kind/type_checkers/core/hash.rb
|
61
|
-
- lib/kind/type_checkers/core/integer.rb
|
62
|
-
- lib/kind/type_checkers/core/io.rb
|
63
|
-
- lib/kind/type_checkers/core/method.rb
|
64
|
-
- lib/kind/type_checkers/core/module.rb
|
65
|
-
- lib/kind/type_checkers/core/numeric.rb
|
66
|
-
- lib/kind/type_checkers/core/proc.rb
|
67
|
-
- lib/kind/type_checkers/core/queue.rb
|
68
|
-
- lib/kind/type_checkers/core/range.rb
|
69
|
-
- lib/kind/type_checkers/core/regexp.rb
|
70
|
-
- lib/kind/type_checkers/core/string.rb
|
71
|
-
- lib/kind/type_checkers/core/struct.rb
|
72
|
-
- lib/kind/type_checkers/core/symbol.rb
|
73
|
-
- lib/kind/type_checkers/core/time.rb
|
74
|
-
- lib/kind/type_checkers/custom/boolean.rb
|
75
|
-
- lib/kind/type_checkers/custom/callable.rb
|
76
|
-
- lib/kind/type_checkers/custom/lambda.rb
|
77
|
-
- lib/kind/type_checkers/stdlib/open_struct.rb
|
78
|
-
- lib/kind/type_checkers/stdlib/set.rb
|
79
|
-
- lib/kind/undefined.rb
|
80
120
|
- lib/kind/validator.rb
|
81
121
|
- lib/kind/version.rb
|
82
122
|
- test.sh
|
@@ -94,15 +134,16 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
94
134
|
requirements:
|
95
135
|
- - ">="
|
96
136
|
- !ruby/object:Gem::Version
|
97
|
-
version: 2.
|
137
|
+
version: 2.1.0
|
98
138
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
99
139
|
requirements:
|
100
140
|
- - ">="
|
101
141
|
- !ruby/object:Gem::Version
|
102
142
|
version: '0'
|
103
143
|
requirements: []
|
104
|
-
rubygems_version: 3.
|
144
|
+
rubygems_version: 3.2.11
|
105
145
|
signing_key:
|
106
146
|
specification_version: 4
|
107
|
-
summary: A
|
147
|
+
summary: A development toolkit for Ruby with several small/cohesive abstractions to
|
148
|
+
empower your development workflow.
|
108
149
|
test_files: []
|
@@ -1,103 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
class KindValidator < ActiveModel::EachValidator
|
4
|
-
def validate_each(record, attribute, value)
|
5
|
-
return if options[:allow_nil] && value.nil?
|
6
|
-
|
7
|
-
return unless error = call_validation_for(attribute, value)
|
8
|
-
|
9
|
-
raise Kind::Error.new("#{attribute} #{error}") if options[:strict]
|
10
|
-
|
11
|
-
record.errors.add(attribute, error)
|
12
|
-
end
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
def call_validation_for(attribute, value)
|
17
|
-
expected = options[:with] || options[:in]
|
18
|
-
|
19
|
-
return validate_with_default_strategy(expected, value) if expected
|
20
|
-
|
21
|
-
return kind_of(expected, value) if expected = options[:of]
|
22
|
-
return kind_is(expected, value) if expected = options[:is]
|
23
|
-
return respond_to(expected, value) if expected = options[:respond_to]
|
24
|
-
return instance_of(expected, value) if expected = options[:instance_of]
|
25
|
-
return array_with(expected, value) if expected = options[:array_with]
|
26
|
-
return array_of(expected, value) if expected = options[:array_of]
|
27
|
-
|
28
|
-
raise Kind::Validator::InvalidDefinition.new(attribute)
|
29
|
-
end
|
30
|
-
|
31
|
-
def validate_with_default_strategy(expected, value)
|
32
|
-
send(Kind::Validator.default_strategy, expected, value)
|
33
|
-
end
|
34
|
-
|
35
|
-
def kind_of(expected, value)
|
36
|
-
types = Array(expected)
|
37
|
-
|
38
|
-
return if types.any? { |type| type === value }
|
39
|
-
|
40
|
-
"must be a kind of: #{types.map { |type| type.name }.join(', ')}"
|
41
|
-
end
|
42
|
-
|
43
|
-
CLASS_OR_MODULE = 'Class/Module'.freeze
|
44
|
-
|
45
|
-
def kind_is(expected, value)
|
46
|
-
return kind_is_not(expected, value) unless expected.kind_of?(::Array)
|
47
|
-
|
48
|
-
result = expected.map { |kind| kind_is_not(kind, value) }.tap(&:compact!)
|
49
|
-
|
50
|
-
result.empty? || result.size < expected.size ? nil : result.join(', ')
|
51
|
-
end
|
52
|
-
|
53
|
-
def kind_is_not(expected, value)
|
54
|
-
case expected
|
55
|
-
when ::Class
|
56
|
-
return if expected == Kind::Class[value] || value < expected
|
57
|
-
|
58
|
-
"must be the class or a subclass of `#{expected.name}`"
|
59
|
-
when ::Module
|
60
|
-
return if value.kind_of?(Class) && value <= expected
|
61
|
-
return if expected == Kind.of_module_or_class(value) || value.kind_of?(expected)
|
62
|
-
|
63
|
-
"must include the `#{expected.name}` module"
|
64
|
-
else
|
65
|
-
raise Kind::Error.new(CLASS_OR_MODULE, expected)
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
def respond_to(expected, value)
|
70
|
-
method_names = Array(expected)
|
71
|
-
|
72
|
-
expected_methods = method_names.select { |method_name| !value.respond_to?(method_name) }
|
73
|
-
expected_methods.map! { |method_name| "`#{method_name}`" }
|
74
|
-
|
75
|
-
return if expected_methods.empty?
|
76
|
-
|
77
|
-
methods = expected_methods.size == 1 ? 'method' : 'methods'
|
78
|
-
|
79
|
-
"must respond to the #{methods}: #{expected_methods.join(', ')}"
|
80
|
-
end
|
81
|
-
|
82
|
-
def instance_of(expected, value)
|
83
|
-
types = Array(expected)
|
84
|
-
|
85
|
-
return if types.any? { |type| value.instance_of?(type) }
|
86
|
-
|
87
|
-
"must be an instance of: #{types.map { |klass| klass.name }.join(', ')}"
|
88
|
-
end
|
89
|
-
|
90
|
-
def array_with(expected, value)
|
91
|
-
return if value.kind_of?(::Array) && !value.empty? && (value - Kind::Array[expected]).empty?
|
92
|
-
|
93
|
-
"must be an array with: #{expected.join(', ')}"
|
94
|
-
end
|
95
|
-
|
96
|
-
def array_of(expected, value)
|
97
|
-
types = Array(expected)
|
98
|
-
|
99
|
-
return if value.kind_of?(::Array) && !value.empty? && value.all? { |value| types.any? { |type| value.kind_of?(type) } }
|
100
|
-
|
101
|
-
"must be an array of: #{types.map { |klass| klass.name }.join(', ')}"
|
102
|
-
end
|
103
|
-
end
|
data/lib/kind/core.rb
DELETED
data/lib/kind/core/kind.rb
DELETED
@@ -1,61 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Kind
|
4
|
-
module KIND
|
5
|
-
def self.null?(value) # :nodoc:
|
6
|
-
value.nil? || Undefined == value
|
7
|
-
end
|
8
|
-
|
9
|
-
def self.of?(kind, values) # :nodoc:
|
10
|
-
of_kind = -> value { kind === value }
|
11
|
-
|
12
|
-
values.empty? ? of_kind : values.all?(&of_kind)
|
13
|
-
end
|
14
|
-
|
15
|
-
def self.of!(kind, value, kind_name = nil) # :nodoc:
|
16
|
-
return value if kind === value
|
17
|
-
|
18
|
-
error!(kind_name || kind.name, value)
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.error!(kind_name, value) # :nodoc:
|
22
|
-
raise Error.new(kind_name, value)
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.of_class?(value) # :nodoc:
|
26
|
-
value.kind_of?(::Class)
|
27
|
-
end
|
28
|
-
|
29
|
-
def self.of_module?(value) # :nodoc:
|
30
|
-
::Module == value || (value.kind_of?(::Module) && !of_class?(value))
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.of_module_or_class!(value) # :nodoc:
|
34
|
-
of!(::Module, value, 'Module/Class')
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.respond_to!(method_name, value) # :nodoc:
|
38
|
-
return value if value.respond_to?(method_name)
|
39
|
-
|
40
|
-
raise Error.new("expected #{value} to respond to :#{method_name}")
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.is?(expected, value) # :nodoc:
|
44
|
-
is!(of_module_or_class!(expected), value)
|
45
|
-
end
|
46
|
-
|
47
|
-
def self.is!(expected_kind, value) # :nodoc:
|
48
|
-
kind = of_module_or_class!(value)
|
49
|
-
|
50
|
-
if of_class?(kind)
|
51
|
-
kind <= expected_kind || expected_kind == ::Class
|
52
|
-
else
|
53
|
-
kind == expected_kind || kind.kind_of?(expected_kind)
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.value(kind, arg, default) # :nodoc:
|
58
|
-
kind === arg ? arg : default
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
data/lib/kind/core/undefined.rb
DELETED
data/lib/kind/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/maybe/result.rb
DELETED
@@ -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/type_checker.rb
DELETED
@@ -1,87 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Kind
|
4
|
-
module TypeChecker
|
5
|
-
def name
|
6
|
-
kind.name
|
7
|
-
end
|
8
|
-
|
9
|
-
def ===(value)
|
10
|
-
kind === value
|
11
|
-
end
|
12
|
-
|
13
|
-
def [](value)
|
14
|
-
return value if self === value
|
15
|
-
|
16
|
-
KIND.error!(name, value)
|
17
|
-
end
|
18
|
-
|
19
|
-
def or_nil(value)
|
20
|
-
return value if self === value
|
21
|
-
end
|
22
|
-
|
23
|
-
def or_undefined(value)
|
24
|
-
or_nil(value) || Undefined
|
25
|
-
end
|
26
|
-
|
27
|
-
def or(fallback, value = UNDEFINED)
|
28
|
-
return __or_func.(fallback) if UNDEFINED === value
|
29
|
-
|
30
|
-
self === value ? value : fallback
|
31
|
-
end
|
32
|
-
|
33
|
-
def value?(value = UNDEFINED)
|
34
|
-
return self === value if UNDEFINED != value
|
35
|
-
|
36
|
-
@__is_value ||= ->(ck) { ->(value) { ck === value } }.(self)
|
37
|
-
end
|
38
|
-
|
39
|
-
def value(arg, default:)
|
40
|
-
KIND.value(self, arg, self[default])
|
41
|
-
end
|
42
|
-
|
43
|
-
def or_null(value) # :nodoc:
|
44
|
-
KIND.null?(value) ? value : self[value]
|
45
|
-
end
|
46
|
-
|
47
|
-
def maybe(value = UNDEFINED, &block)
|
48
|
-
return __maybe[value] if UNDEFINED != value && !block
|
49
|
-
return __maybe.wrap(&block) if UNDEFINED == value && block
|
50
|
-
return __maybe.wrap(value, &block) if UNDEFINED != value && block
|
51
|
-
|
52
|
-
__maybe
|
53
|
-
end
|
54
|
-
|
55
|
-
alias optional maybe
|
56
|
-
|
57
|
-
private
|
58
|
-
|
59
|
-
def __maybe
|
60
|
-
@__maybe ||= Maybe::Typed.new(self)
|
61
|
-
end
|
62
|
-
|
63
|
-
def __or_func
|
64
|
-
@__or_func ||= ->(tc, fb, value) { tc === value ? value : tc.or_null(fb) }.curry[self]
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
class TypeChecker::Object # :nodoc: all
|
69
|
-
include TypeChecker
|
70
|
-
|
71
|
-
ResolveKindName = ->(kind, opt) do
|
72
|
-
name = Try.(opt, :[], :name)
|
73
|
-
name || Try.(kind, :name)
|
74
|
-
end
|
75
|
-
|
76
|
-
attr_reader :kind, :name
|
77
|
-
|
78
|
-
def initialize(kind, opt)
|
79
|
-
name = ResolveKindName.(kind, opt)
|
80
|
-
|
81
|
-
@name = KIND.of!(::String, name)
|
82
|
-
@kind = KIND.respond_to!(:===, kind)
|
83
|
-
end
|
84
|
-
|
85
|
-
private_constant :ResolveKindName
|
86
|
-
end
|
87
|
-
end
|