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.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/.tool-versions +1 -1
  3. data/.travis.sh +39 -7
  4. data/.travis.yml +1 -0
  5. data/CHANGELOG.md +506 -28
  6. data/Gemfile +13 -6
  7. data/README.md +50 -42
  8. data/kind.gemspec +3 -3
  9. data/lib/kind.rb +2 -60
  10. data/lib/kind/__lib__/action_steps.rb +57 -0
  11. data/lib/kind/__lib__/attributes.rb +66 -0
  12. data/lib/kind/__lib__/kind.rb +51 -0
  13. data/lib/kind/__lib__/of.rb +17 -0
  14. data/lib/kind/__lib__/strict.rb +49 -0
  15. data/lib/kind/__lib__/undefined.rb +14 -0
  16. data/lib/kind/action.rb +127 -0
  17. data/lib/kind/active_model/validation.rb +3 -4
  18. data/lib/kind/basic.rb +79 -0
  19. data/lib/kind/basic/error.rb +29 -0
  20. data/lib/kind/{undefined.rb → basic/undefined.rb} +6 -1
  21. data/lib/kind/dig.rb +21 -5
  22. data/lib/kind/either.rb +30 -0
  23. data/lib/kind/either/left.rb +29 -0
  24. data/lib/kind/either/methods.rb +17 -0
  25. data/lib/kind/either/monad.rb +65 -0
  26. data/lib/kind/either/monad/wrapper.rb +19 -0
  27. data/lib/kind/either/right.rb +38 -0
  28. data/lib/kind/empty.rb +2 -0
  29. data/lib/kind/enum.rb +63 -0
  30. data/lib/kind/enum/item.rb +40 -0
  31. data/lib/kind/enum/methods.rb +72 -0
  32. data/lib/kind/function.rb +45 -0
  33. data/lib/kind/functional.rb +89 -0
  34. data/lib/kind/functional/action.rb +87 -0
  35. data/lib/kind/functional/steps.rb +22 -0
  36. data/lib/kind/immutable_attributes.rb +34 -0
  37. data/lib/kind/immutable_attributes/initializer.rb +70 -0
  38. data/lib/kind/immutable_attributes/reader.rb +38 -0
  39. data/lib/kind/maybe.rb +37 -12
  40. data/lib/kind/maybe/methods.rb +21 -0
  41. data/lib/kind/maybe/monad.rb +82 -0
  42. data/lib/kind/maybe/monad/wrapper.rb +19 -0
  43. data/lib/kind/maybe/none.rb +12 -19
  44. data/lib/kind/maybe/some.rb +68 -26
  45. data/lib/kind/maybe/typed.rb +11 -5
  46. data/lib/kind/maybe/{wrappable.rb → wrapper.rb} +8 -4
  47. data/lib/kind/monad.rb +22 -0
  48. data/lib/kind/monads.rb +5 -0
  49. data/lib/kind/objects.rb +17 -0
  50. data/lib/kind/objects/basic_object.rb +43 -0
  51. data/lib/kind/objects/modules.rb +32 -0
  52. data/lib/kind/{type_checkers → objects/modules}/core/array.rb +3 -1
  53. data/lib/kind/{type_checkers → objects/modules}/core/class.rb +1 -1
  54. data/lib/kind/{type_checkers → objects/modules}/core/comparable.rb +1 -1
  55. data/lib/kind/{type_checkers → objects/modules}/core/enumerable.rb +1 -1
  56. data/lib/kind/{type_checkers → objects/modules}/core/enumerator.rb +1 -1
  57. data/lib/kind/{type_checkers → objects/modules}/core/file.rb +1 -1
  58. data/lib/kind/{type_checkers → objects/modules}/core/float.rb +1 -1
  59. data/lib/kind/{type_checkers → objects/modules}/core/hash.rb +3 -1
  60. data/lib/kind/{type_checkers → objects/modules}/core/integer.rb +1 -1
  61. data/lib/kind/{type_checkers → objects/modules}/core/io.rb +1 -1
  62. data/lib/kind/{type_checkers → objects/modules}/core/method.rb +1 -1
  63. data/lib/kind/{type_checkers → objects/modules}/core/module.rb +1 -1
  64. data/lib/kind/{type_checkers → objects/modules}/core/numeric.rb +1 -1
  65. data/lib/kind/{type_checkers → objects/modules}/core/proc.rb +1 -1
  66. data/lib/kind/{type_checkers → objects/modules}/core/queue.rb +1 -1
  67. data/lib/kind/{type_checkers → objects/modules}/core/range.rb +1 -1
  68. data/lib/kind/{type_checkers → objects/modules}/core/regexp.rb +1 -1
  69. data/lib/kind/{type_checkers → objects/modules}/core/string.rb +3 -1
  70. data/lib/kind/{type_checkers → objects/modules}/core/struct.rb +1 -1
  71. data/lib/kind/{type_checkers → objects/modules}/core/symbol.rb +1 -1
  72. data/lib/kind/{type_checkers → objects/modules}/core/time.rb +1 -1
  73. data/lib/kind/{type_checkers → objects/modules}/custom/boolean.rb +2 -2
  74. data/lib/kind/{type_checkers → objects/modules}/custom/callable.rb +1 -1
  75. data/lib/kind/{type_checkers → objects/modules}/custom/lambda.rb +1 -1
  76. data/lib/kind/{type_checkers → objects/modules}/stdlib/open_struct.rb +3 -1
  77. data/lib/kind/{type_checkers → objects/modules}/stdlib/set.rb +3 -1
  78. data/lib/kind/objects/nil.rb +17 -0
  79. data/lib/kind/objects/not_nil.rb +9 -0
  80. data/lib/kind/objects/object.rb +56 -0
  81. data/lib/kind/objects/respond_to.rb +30 -0
  82. data/lib/kind/objects/union_type.rb +44 -0
  83. data/lib/kind/presence.rb +4 -2
  84. data/lib/kind/result.rb +31 -0
  85. data/lib/kind/result/abstract.rb +53 -0
  86. data/lib/kind/result/failure.rb +33 -0
  87. data/lib/kind/result/methods.rb +17 -0
  88. data/lib/kind/result/monad.rb +74 -0
  89. data/lib/kind/result/monad/wrapper.rb +19 -0
  90. data/lib/kind/result/success.rb +53 -0
  91. data/lib/kind/strict/disabled.rb +34 -0
  92. data/lib/kind/try.rb +22 -10
  93. data/lib/kind/validator.rb +111 -0
  94. data/lib/kind/version.rb +1 -1
  95. metadata +83 -42
  96. data/lib/kind/active_model/kind_validator.rb +0 -103
  97. data/lib/kind/core.rb +0 -8
  98. data/lib/kind/core/kind.rb +0 -61
  99. data/lib/kind/core/undefined.rb +0 -7
  100. data/lib/kind/error.rb +0 -15
  101. data/lib/kind/maybe/result.rb +0 -51
  102. data/lib/kind/type_checker.rb +0 -87
  103. data/lib/kind/type_checkers.rb +0 -30
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.0.0'
4
+ VERSION = '5.4.1'
5
5
  end
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.0.0
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-02-23 00:00:00.000000000 Z
11
+ date: 2021-03-26 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: A simple type system (at runtime) for Ruby - free of dependencies.
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/active_model/kind_validator.rb
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/core.rb
37
- - lib/kind/core/kind.rb
38
- - lib/kind/core/undefined.rb
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/error.rb
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/wrappable.rb
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.2.0
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.1.4
144
+ rubygems_version: 3.2.11
105
145
  signing_key:
106
146
  specification_version: 4
107
- summary: A simple type system (at runtime) for Ruby.
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
@@ -1,8 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module Core
5
- require 'kind/core/kind'
6
- require 'kind/core/undefined'
7
- end
8
- end
@@ -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
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- UNDEFINED = Object.new.freeze
5
-
6
- private_constant :UNDEFINED
7
- end
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
@@ -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,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