kind 2.0.0 → 3.0.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.
@@ -4,12 +4,12 @@ require 'kind/version'
4
4
 
5
5
  require 'kind/empty'
6
6
  require 'kind/undefined'
7
+ require 'kind/checker'
7
8
  require 'kind/maybe'
8
9
 
9
10
  require 'kind/error'
10
11
  require 'kind/of'
11
12
  require 'kind/is'
12
- require 'kind/checker'
13
13
  require 'kind/types'
14
14
 
15
15
  module Kind
@@ -18,35 +18,23 @@ module Kind
18
18
  private_constant :WRONG_NUMBER_OF_ARGUMENTS
19
19
 
20
20
  def self.is(expected = Undefined, object = Undefined)
21
- return Is if expected == Undefined && object == Undefined
21
+ return Is if Undefined == expected && Undefined == object
22
22
 
23
- return Kind::Is.(expected, object) if object != Undefined
23
+ return Kind::Is.(expected, object) if Undefined != object
24
24
 
25
25
  raise ArgumentError, WRONG_NUMBER_OF_ARGUMENTS
26
26
  end
27
27
 
28
- MODULE_OR_CLASS = 'Module/Class'.freeze
29
-
30
- private_constant :MODULE_OR_CLASS
31
-
32
28
  def self.of(kind = Undefined, object = Undefined)
33
- return Of if kind == Undefined && object == Undefined
34
-
35
- return Kind::Of.(kind, object) if object != Undefined
29
+ return Of if Undefined == kind && Undefined == object
36
30
 
37
- __checkers__[kind] ||= begin
38
- kind_name = kind.name
31
+ return Kind::Of.(kind, object) if Undefined != object
39
32
 
40
- if Kind::Of.const_defined?(kind_name, false)
41
- Kind::Of.const_get(kind_name)
42
- else
43
- Checker.new(Kind::Of.(Module, kind, MODULE_OR_CLASS))
44
- end
45
- end
33
+ Kind::Checker::Factory.create(kind)
46
34
  end
47
35
 
48
- private_class_method def self.__checkers__
49
- @__checkers__ ||= {}
36
+ def self.of?(kind, *args)
37
+ Kind.of(kind).instance?(*args)
50
38
  end
51
39
 
52
40
  # --------------------- #
@@ -59,7 +47,7 @@ module Kind
59
47
  end
60
48
 
61
49
  def self.Module(value)
62
- value == ::Module || (value.is_a?(::Module) && !self.Class(value))
50
+ ::Module == value || (value.is_a?(::Module) && !self.Class(value))
63
51
  end
64
52
 
65
53
  def self.Boolean(value)
@@ -75,13 +63,13 @@ module Kind
75
63
  # -- Class
76
64
 
77
65
  def self.Class(object = Undefined)
78
- return Class if object == Undefined
66
+ return Class if Undefined == object
79
67
 
80
68
  self.call(::Class, object)
81
69
  end
82
70
 
83
71
  const_set(:Class, ::Module.new do
84
- extend Checkable
72
+ extend Checker::Protocol
85
73
 
86
74
  def self.__kind; ::Class; end
87
75
 
@@ -90,19 +78,23 @@ module Kind
90
78
  def self.__is_instance__(value); class?(value); end
91
79
  end)
92
80
 
81
+ def self.Class?(*args)
82
+ Kind::Of::Class.instance?(*args)
83
+ end
84
+
93
85
  # -- Module
94
86
 
95
87
  def self.Module(object = Undefined)
96
- return Module if object == Undefined
88
+ return Module if Undefined == object
97
89
 
98
90
  self.call(::Module, object)
99
91
  end
100
92
 
101
93
  const_set(:Module, ::Module.new do
102
- extend Checkable
94
+ extend Checker::Protocol
103
95
 
104
96
  def self.__kind_undefined(value)
105
- __kind_error(Kind::Undefined) if value == Kind::Undefined
97
+ __kind_error(Kind::Undefined) if Kind::Undefined == value
106
98
 
107
99
  yield
108
100
  end
@@ -127,7 +119,7 @@ module Kind
127
119
  if ::Kind::Maybe::Value.none?(default)
128
120
  __kind_undefined(value) { __kind_of(value) }
129
121
  else
130
- return value if value != Kind::Undefined && instance?(value)
122
+ return value if Kind::Undefined != value && instance?(value)
131
123
 
132
124
  __kind_undefined(default) { __kind_of(default) }
133
125
  end
@@ -136,12 +128,16 @@ module Kind
136
128
  def self.__is_instance__(value); class?(value); end
137
129
  end)
138
130
 
131
+ def self.Module?(*args)
132
+ Kind::Of::Module.instance?(*args)
133
+ end
134
+
139
135
  # -- Boolean
140
136
 
141
137
  def self.Boolean(object = Undefined, options = Empty::HASH)
142
138
  default = options[:or]
143
139
 
144
- return Kind::Of::Boolean if object == Undefined && default.nil?
140
+ return Kind::Of::Boolean if Undefined == object && default.nil?
145
141
 
146
142
  bool = object.nil? ? default : object
147
143
 
@@ -151,7 +147,7 @@ module Kind
151
147
  end
152
148
 
153
149
  const_set(:Boolean, ::Module.new do
154
- extend Checkable
150
+ extend Checker::Protocol
155
151
 
156
152
  def self.__kind; [TrueClass, FalseClass].freeze; end
157
153
 
@@ -163,14 +159,14 @@ module Kind
163
159
  if ::Kind::Maybe::Value.none?(default)
164
160
  __kind_undefined(value) { Kind::Of::Boolean(value) }
165
161
  else
166
- return value if value != Kind::Undefined && instance?(value)
162
+ return value if Kind::Undefined != value && instance?(value)
167
163
 
168
164
  __kind_undefined(default) { Kind::Of::Boolean(default) }
169
165
  end
170
166
  end
171
167
 
172
168
  def self.__kind_undefined(value)
173
- if value == Kind::Undefined
169
+ if Kind::Undefined == value
174
170
  raise Kind::Error.new('Boolean'.freeze, Kind::Undefined)
175
171
  else
176
172
  yield
@@ -187,12 +183,16 @@ module Kind
187
183
  end
188
184
  end)
189
185
 
186
+ def self.Boolean?(*args)
187
+ Kind::Of::Boolean.instance?(*args)
188
+ end
189
+
190
190
  # -- Lambda
191
191
 
192
192
  def self.Lambda(object = Undefined, options = Empty::HASH)
193
193
  default = options[:or]
194
194
 
195
- return Kind::Of::Lambda if object == Undefined && default.nil?
195
+ return Kind::Of::Lambda if Undefined == object && default.nil?
196
196
 
197
197
  func = object || default
198
198
 
@@ -202,7 +202,7 @@ module Kind
202
202
  end
203
203
 
204
204
  const_set(:Lambda, ::Module.new do
205
- extend Checkable
205
+ extend Checker::Protocol
206
206
 
207
207
  def self.__kind; ::Proc; end
208
208
 
@@ -212,14 +212,14 @@ module Kind
212
212
  if ::Kind::Maybe::Value.none?(default)
213
213
  __kind_undefined(value) { Kind::Of::Lambda(value) }
214
214
  else
215
- return value if value != Kind::Undefined && instance?(value)
215
+ return value if Kind::Undefined != value && instance?(value)
216
216
 
217
217
  __kind_undefined(default) { Kind::Of::Lambda(default) }
218
218
  end
219
219
  end
220
220
 
221
221
  def self.__kind_undefined(value)
222
- if value == Kind::Undefined
222
+ if Kind::Undefined == value
223
223
  raise Kind::Error.new('Lambda'.freeze, Kind::Undefined)
224
224
  else
225
225
  yield
@@ -231,12 +231,16 @@ module Kind
231
231
  end
232
232
  end)
233
233
 
234
+ def self.Lambda?(*args)
235
+ Kind::Of::Lambda.instance?(*args)
236
+ end
237
+
234
238
  # -- Callable
235
239
 
236
240
  def self.Callable(object = Undefined, options = Empty::HASH)
237
241
  default = options[:or]
238
242
 
239
- return Kind::Of::Callable if object == Undefined && default.nil?
243
+ return Kind::Of::Callable if Undefined == object && default.nil?
240
244
 
241
245
  callable = object || default
242
246
 
@@ -246,7 +250,7 @@ module Kind
246
250
  end
247
251
 
248
252
  const_set(:Callable, ::Module.new do
249
- extend Checkable
253
+ extend Checker::Protocol
250
254
 
251
255
  def self.__kind; Object; end
252
256
 
@@ -260,14 +264,14 @@ module Kind
260
264
  if ::Kind::Maybe::Value.none?(default)
261
265
  __kind_undefined(value) { Kind::Of::Callable(value) }
262
266
  else
263
- return value if value != Kind::Undefined && instance?(value)
267
+ return value if Kind::Undefined != value && instance?(value)
264
268
 
265
269
  __kind_undefined(default) { Kind::Of::Callable(default) }
266
270
  end
267
271
  end
268
272
 
269
273
  def self.__kind_undefined(value)
270
- if value == Kind::Undefined
274
+ if Kind::Undefined == value
271
275
  raise Kind::Error.new('Callable'.freeze, Kind::Undefined)
272
276
  else
273
277
  yield
@@ -279,6 +283,10 @@ module Kind
279
283
  end
280
284
  end)
281
285
 
286
+ def self.Callable?(*args)
287
+ Kind::Of::Callable.instance?(*args)
288
+ end
289
+
282
290
  # ---------------------- #
283
291
  # Built-in type checkers #
284
292
  # ---------------------- #
@@ -53,12 +53,12 @@ class KindValidator < ActiveModel::EachValidator
53
53
  def kind_is_not(expected, value)
54
54
  case expected
55
55
  when Class
56
- return if Kind.of.Class(value) == expected || value < expected
56
+ return if expected == Kind.of.Class(value) || value < expected
57
57
 
58
58
  "must be the class or a subclass of `#{expected.name}`"
59
59
  when Module
60
60
  return if value.kind_of?(Class) && value <= expected
61
- return if Kind.of.Module(value) == expected || value.kind_of?(expected)
61
+ return if expected == Kind.of.Module(value) || value.kind_of?(expected)
62
62
 
63
63
  "must include the `#{expected.name}` module"
64
64
  else
@@ -1,70 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'kind/checker/factory'
4
+ require 'kind/checker/protocol'
3
5
  module Kind
4
- module Checkable
5
- def class?(value)
6
- Kind::Is.__call__(__kind, value)
7
- end
8
-
9
- def instance(value, options = Empty::HASH)
10
- default = options[:or]
11
-
12
- return Kind::Of.(__kind, value) if ::Kind::Maybe::Value.none?(default)
13
-
14
- value != Kind::Undefined && instance?(value) ? value : Kind::Of.(__kind, default)
15
- end
16
-
17
- def [](value, options = options = Empty::HASH)
18
- instance(value, options)
19
- end
20
-
21
- def instance?(value = Kind::Undefined)
22
- return __is_instance__(value) if value != Kind::Undefined
23
-
24
- to_proc
25
- end
26
-
27
- def __is_instance__(value)
28
- value.is_a?(__kind)
29
- end
30
-
31
- def to_proc
32
- @to_proc ||=
33
- -> checker { -> value { checker.__is_instance__(value) } }.call(self)
34
- end
35
-
36
- def or_nil(value)
37
- return value if instance?(value)
38
- end
39
-
40
- def or_undefined(value)
41
- or_nil(value) || Kind::Undefined
42
- end
43
-
44
- def as_maybe(value = Kind::Undefined)
45
- return __as_maybe__(value) if value != Kind::Undefined
46
-
47
- as_maybe_to_proc
48
- end
49
-
50
- def as_optional(value = Kind::Undefined)
51
- as_maybe(value)
52
- end
53
-
54
- def __as_maybe__(value)
55
- Kind::Maybe.new(or_nil(value))
56
- end
57
-
58
- def as_maybe_to_proc
59
- @as_maybe_to_proc ||=
60
- -> checker { -> value { checker.__as_maybe__(value) } }.call(self)
61
- end
62
- end
63
-
64
- private_constant :Checkable
65
-
66
6
  class Checker
67
- include Checkable
7
+ include Protocol
68
8
 
69
9
  attr_reader :__kind
70
10
 
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'singleton'
4
+
5
+ module Kind
6
+ class Checker
7
+ class Factory
8
+ include Singleton
9
+
10
+ def self.create(kind)
11
+ instance.create(kind)
12
+ end
13
+
14
+ def initialize
15
+ @__checkers__ = {}
16
+ end
17
+
18
+ MODULE_OR_CLASS = 'Module/Class'.freeze
19
+
20
+ private_constant :MODULE_OR_CLASS
21
+
22
+ def create(kind)
23
+ @__checkers__[kind] ||= begin
24
+ kind_name = kind.name
25
+
26
+ if Kind::Of.const_defined?(kind_name, false)
27
+ Kind::Of.const_get(kind_name)
28
+ else
29
+ Kind::Checker.new(Kind::Of.(Module, kind, MODULE_OR_CLASS))
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ class Checker
5
+ module Protocol
6
+ def class?(value)
7
+ Kind::Is.__call__(__kind, value)
8
+ end
9
+
10
+ def instance(value, options = Empty::HASH)
11
+ default = options[:or]
12
+
13
+ return Kind::Of.(__kind, value) if ::Kind::Maybe::Value.none?(default)
14
+
15
+ Kind::Undefined != value && instance?(value) ? value : Kind::Of.(__kind, default)
16
+ end
17
+
18
+ def [](value, options = options = Empty::HASH)
19
+ instance(value, options)
20
+ end
21
+
22
+ def to_proc
23
+ @to_proc ||=
24
+ -> checker { -> value { checker.instance(value) } }.call(self)
25
+ end
26
+
27
+ def __is_instance__(value)
28
+ value.kind_of?(__kind)
29
+ end
30
+
31
+ def is_instance_to_proc
32
+ @is_instance_to_proc ||=
33
+ -> checker { -> value { checker.__is_instance__(value) } }.call(self)
34
+ end
35
+
36
+ def instance?(*args)
37
+ return is_instance_to_proc if args.empty?
38
+
39
+ return args.all? { |object| __is_instance__(object) } if args.size > 1
40
+
41
+ arg = args[0]
42
+ Kind::Undefined == arg ? is_instance_to_proc : __is_instance__(arg)
43
+ end
44
+
45
+ def or_nil(value)
46
+ return value if instance?(value)
47
+ end
48
+
49
+ def or_undefined(value)
50
+ or_nil(value) || Kind::Undefined
51
+ end
52
+
53
+ def __as_maybe__(value)
54
+ Kind::Maybe.new(or_nil(value))
55
+ end
56
+
57
+ def as_maybe_to_proc
58
+ @as_maybe_to_proc ||=
59
+ -> checker { -> value { checker.__as_maybe__(value) } }.call(self)
60
+ end
61
+
62
+ def as_maybe(value = Kind::Undefined)
63
+ return __as_maybe__(value) if Kind::Undefined != value
64
+
65
+ as_maybe_to_proc
66
+ end
67
+
68
+ def as_optional(value = Kind::Undefined)
69
+ as_maybe(value)
70
+ end
71
+ end
72
+ end
73
+ end