kind 4.1.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ffb9807682a295f94cb8e4076d32fc3217da97268e943e7d6b028b6de95ed765
4
- data.tar.gz: 7b61164996c0d96853ad5a0cde9269ecd18bb489b483b46956a7fa2e9b9f2cd6
3
+ metadata.gz: 8a58bdad80758ce4b68dd663984a2b505dc5bcc346861c8aa0da7826e458d71b
4
+ data.tar.gz: 4de72ab2b437c0743e28440ddf7a637a03ee290d03d484157202f2d967b4863c
5
5
  SHA512:
6
- metadata.gz: 0f23b38b9f63d03638ded172c037b6ba9e048c397e9a31907850beca5151822c4983129e5726b777ccbdb30db18c8bcdfb9392c813c3e05546dfd33f97db9660
7
- data.tar.gz: 3d7e663d65a591bff7bfeb152dd4e605948df7e95de15bb3632be0f52c747fd522041fc1be7678c8385cd9c0606a688abd203348e376ce264f3088d62ecb5f88
6
+ metadata.gz: 8ab61cb4339b6e979e505cf623b391ce9b946b853893b7e32ea734b6ff325ca007b8509b4c66669a90cfbdade64830843ed7ac0a2aeb30eb4324dca11d056c79
7
+ data.tar.gz: 04cc0c6f36ab19167de1b13cd484ccd00b576c13f1703ec42017c334e5c270b02e9d77d20f14346b74d2564837cf97024cc3bafc0dd7b7675c4ac8c0b42c5398
data/.travis.yml CHANGED
@@ -1,8 +1,6 @@
1
1
  ---
2
2
  language: ruby
3
3
 
4
- sudo: false
5
-
6
4
  cache:
7
5
  bundler: true
8
6
  directories:
data/CHANGELOG.md CHANGED
@@ -3,6 +3,9 @@
3
3
  This project follows [semver 2.0.0](http://semver.org/spec/v2.0.0.html) and the recommendations of [keepachangelog.com](http://keepachangelog.com/).
4
4
 
5
5
  - [Unreleased](#unreleased)
6
+ - [5.0.0 (2021-02-22)](#500-2021-02-22)
7
+ - [Breaking Changes](#breaking-changes)
8
+ - [Removed](#removed)
6
9
  - [4.1.0 (2021-02-22)](#410-2021-02-22)
7
10
  - [Added](#added)
8
11
  - [4.0.0 (2021-02-22)](#400-2021-02-22)
@@ -12,7 +15,7 @@ This project follows [semver 2.0.0](http://semver.org/spec/v2.0.0.html) and the
12
15
  - [3.1.0 (2020-07-08)](#310-2020-07-08)
13
16
  - [Added](#added-2)
14
17
  - [3.0.0 (2020-06-25)](#300-2020-06-25)
15
- - [Breaking Changes](#breaking-changes)
18
+ - [Breaking Changes](#breaking-changes-1)
16
19
  - [Added](#added-3)
17
20
  - [2.3.0 (2020-06-24)](#230-2020-06-24)
18
21
  - [Added](#added-4)
@@ -20,11 +23,11 @@ This project follows [semver 2.0.0](http://semver.org/spec/v2.0.0.html) and the
20
23
  - [Added](#added-5)
21
24
  - [2.1.0 (2020-05-12)](#210-2020-05-12)
22
25
  - [Added](#added-6)
23
- - [Breaking Changes](#breaking-changes-1)
26
+ - [Breaking Changes](#breaking-changes-2)
24
27
  - [2.0.0 (2020-05-07)](#200-2020-05-07)
25
28
  - [Added](#added-7)
26
- - [Breaking Changes](#breaking-changes-2)
27
- - [Removed](#removed)
29
+ - [Breaking Changes](#breaking-changes-3)
30
+ - [Removed](#removed-1)
28
31
  - [1.9.0 (2020-05-06)](#190-2020-05-06)
29
32
  - [Added](#added-8)
30
33
  - [1.8.0 (2020-05-03)](#180-2020-05-03)
@@ -55,7 +58,7 @@ This project follows [semver 2.0.0](http://semver.org/spec/v2.0.0.html) and the
55
58
  - [Added](#added-19)
56
59
  - [0.3.0 (2020-01-03)](#030-2020-01-03)
57
60
  - [Added](#added-20)
58
- - [Breaking Changes](#breaking-changes-3)
61
+ - [Breaking Changes](#breaking-changes-4)
59
62
  - [0.2.0 (2020-01-02)](#020-2020-01-02)
60
63
  - [Added](#added-21)
61
64
  - [0.1.0 (2019-12-26)](#010-2019-12-26)
@@ -71,6 +74,31 @@ This project follows [semver 2.0.0](http://semver.org/spec/v2.0.0.html) and the
71
74
  ### Fixed
72
75
  -->
73
76
 
77
+ 5.0.0 (2021-02-22)
78
+ ------------------
79
+
80
+ ### Breaking Changes
81
+
82
+ * [#44](https://github.com/serradura/kind/pull/44) - Now, do you need to require `"kind/empty/constant"` to define the constant `Empty` as a `Kind::Empty` alias.
83
+
84
+ ### Removed
85
+
86
+ * [#44](https://github.com/serradura/kind/pull/44) - Remove `Kind::Is.call`
87
+
88
+ * [#44](https://github.com/serradura/kind/pull/44) - Remove `Kind::Of.call`
89
+
90
+ * [#44](https://github.com/serradura/kind/pull/44) - Remove `Kind::Types.add`.
91
+
92
+ * [#44](https://github.com/serradura/kind/pull/44) - Remove `Kind::Of::<Type>` and `Kind::Is::<Type>` modules.
93
+
94
+ * [#44](https://github.com/serradura/kind/pull/44) - Remove `Kind::Checker`, `Kind::Checker::Protocol`, `Kind::Checker::Factory`.
95
+
96
+ * [#44](https://github.com/serradura/kind/pull/44) - Remove the invocation of `Kind.is` without arguments.
97
+
98
+ * [#44](https://github.com/serradura/kind/pull/44) - Remove the invocation of `Kind.of` without arguments.
99
+
100
+ * [#44](https://github.com/serradura/kind/pull/44) - Remove the invocation of `Kind.of` with a single argument (the kind).
101
+
74
102
  4.1.0 (2021-02-22)
75
103
  ------------------
76
104
 
data/README.md CHANGED
@@ -35,6 +35,7 @@ One of the goals of this project is to do simple type checking like `"some strin
35
35
  Version | Documentation
36
36
  ---------- | -------------
37
37
  unreleased | https://github.com/serradura/u-case/blob/main/README.md
38
+ 5.0.0 | https://github.com/serradura/u-case/blob/v5.x/README.md
38
39
  4.1.0 | https://github.com/serradura/u-case/blob/v4.x/README.md
39
40
  3.1.0 | https://github.com/serradura/u-case/blob/v3.x/README.md
40
41
  2.3.0 | https://github.com/serradura/u-case/blob/v2.x/README.md
@@ -95,6 +96,7 @@ unreleased | https://github.com/serradura/u-case/blob/main/README.md
95
96
  - [Kind::Maybe#check](#kindmaybecheck)
96
97
  - [Kind::Maybe#presence](#kindmaybepresence)
97
98
  - [Kind::Empty](#kindempty)
99
+ - [Defining Empty as Kind::Empty an alias](#defining-empty-as-kindempty-an-alias)
98
100
  - [Kind::Validator (ActiveModel::Validations)](#kindvalidator-activemodelvalidations)
99
101
  - [Usage](#usage-1)
100
102
  - [Object#===](#object)
@@ -1429,7 +1431,11 @@ def do_something(value, with_options: Kind::Empty::HASH)
1429
1431
  end
1430
1432
  ```
1431
1433
 
1432
- One last thing, if there is no constant declared as Empty, the `kind` gem will define `Empty` as an alias for `Kind::Empty`. Knowing this, the previous example could be written like this:
1434
+ ### Defining Empty as Kind::Empty an alias
1435
+
1436
+ You can require `kind/empty/constant` to define `Empty` as a `Kind::Empty` alias. But, a `LoadError` will be raised if there is an already defined constant `Empty`.
1437
+
1438
+ So if you required this file, the previous example could be written like this:
1433
1439
 
1434
1440
  ```ruby
1435
1441
  def do_something(value, with_options: Empty::HASH)
@@ -1437,7 +1443,7 @@ def do_something(value, with_options: Empty::HASH)
1437
1443
  end
1438
1444
  ```
1439
1445
 
1440
- Follows the list of constants, if the alias is available to be created:
1446
+ Follows the list of constants if the alias was defined:
1441
1447
 
1442
1448
  - `Empty::SET`
1443
1449
  - `Empty::HASH`
data/lib/kind.rb CHANGED
@@ -17,70 +17,46 @@ require 'kind/maybe'
17
17
  require 'kind/type_checker'
18
18
  require 'kind/type_checkers'
19
19
 
20
- require 'kind/deprecations/checker'
21
- require 'kind/deprecations/of'
22
- require 'kind/deprecations/is'
23
- require 'kind/deprecations/types'
24
- require 'kind/deprecations/built_in_type_checkers'
25
-
26
20
  module Kind
27
- def self.is?(kind, arg)
21
+ extend self
22
+
23
+ def is?(kind, arg)
28
24
  KIND.is?(kind, arg)
29
25
  end
30
26
 
31
- def self.of?(kind, *args)
27
+ alias is is?
28
+
29
+ def of?(kind, *args)
32
30
  KIND.of?(kind, args)
33
31
  end
34
32
 
35
- def self.of_class?(value)
33
+ def of_class?(value)
36
34
  KIND.of_class?(value)
37
35
  end
38
36
 
39
- def self.of_module?(value)
37
+ def of_module?(value)
40
38
  KIND.of_module?(value)
41
39
  end
42
40
 
43
- def self.respond_to(value, *method_names)
41
+ def respond_to(value, *method_names)
44
42
  method_names.each { |method_name| KIND.respond_to!(method_name, value) }
45
43
 
46
44
  value
47
45
  end
48
46
 
49
- def self.of_module_or_class(value)
47
+ def of_module_or_class(value)
50
48
  KIND.of_module_or_class!(value)
51
49
  end
52
50
 
53
- def self.is(expected = UNDEFINED, object = UNDEFINED)
54
- if UNDEFINED == expected && UNDEFINED == object
55
- DEPRECATION.warn('`Kind.is` without args is deprecated. This behavior will be removed in %{version}')
56
-
57
- return Is
58
- end
59
-
60
- return is?(expected, object) if UNDEFINED != object
61
-
62
- WRONG_NUMBER_OF_ARGS.error!(given: 1, expected: 2)
63
- end
64
-
65
- def self.of(kind = UNDEFINED, object = UNDEFINED)
66
- if UNDEFINED == kind && UNDEFINED == object
67
- DEPRECATION.warn('`Kind.of` without args is deprecated. This behavior will be removed in %{version}')
68
-
69
- Of
70
- elsif UNDEFINED != object
71
- KIND.of!(kind, object)
72
- else
73
- DEPRECATION.warn_method_replacement('Kind.of(<Kind>)', 'Kind::Of(<Kind>)')
74
-
75
- Checker::Factory.create(kind)
76
- end
51
+ def of(kind, object)
52
+ KIND.of!(kind, object)
77
53
  end
78
54
 
79
- def self.value(kind, value, default:)
55
+ def value(kind, value, default:)
80
56
  KIND.value(kind, value, of(kind, default))
81
57
  end
82
58
 
83
- def self.Of(kind, opt = Empty::HASH)
59
+ def Of(kind, opt = Empty::HASH)
84
60
  TypeChecker::Object.new(kind, opt)
85
61
  end
86
62
  end
data/lib/kind/core.rb CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  module Kind
4
4
  module Core
5
- require 'kind/core/wrong_number_of_args'
6
- require 'kind/core/deprecation'
7
5
  require 'kind/core/kind'
8
6
  require 'kind/core/undefined'
9
7
  end
data/lib/kind/empty.rb CHANGED
@@ -11,5 +11,3 @@ module Kind
11
11
  STR = STRING
12
12
  end
13
13
  end
14
-
15
- Empty = Kind::Empty unless defined?(Empty)
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ if defined?(Empty)
4
+ raise LoadError, "already initialized constant Empty"
5
+ else
6
+ Empty = Kind::Empty
7
+ end
@@ -17,7 +17,7 @@ module Kind
17
17
  else
18
18
  return new(arg) if UNDEFINED != arg
19
19
 
20
- WRONG_NUMBER_OF_ARGS.error!(given: 0, expected: 1)
20
+ raise ArgumentError, 'wrong number of arguments (given 0, expected 1)'
21
21
  end
22
22
  end
23
23
 
data/lib/kind/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kind
4
- VERSION = '4.1.0'
4
+ VERSION = '5.0.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: 4.1.0
4
+ version: 5.0.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-22 00:00:00.000000000 Z
11
+ date: 2021-02-23 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:
@@ -34,19 +34,11 @@ files:
34
34
  - lib/kind/active_model/kind_validator.rb
35
35
  - lib/kind/active_model/validation.rb
36
36
  - lib/kind/core.rb
37
- - lib/kind/core/deprecation.rb
38
37
  - lib/kind/core/kind.rb
39
38
  - lib/kind/core/undefined.rb
40
- - lib/kind/core/wrong_number_of_args.rb
41
- - lib/kind/deprecations/built_in_type_checkers.rb
42
- - lib/kind/deprecations/checker.rb
43
- - lib/kind/deprecations/checker/factory.rb
44
- - lib/kind/deprecations/checker/protocol.rb
45
- - lib/kind/deprecations/is.rb
46
- - lib/kind/deprecations/of.rb
47
- - lib/kind/deprecations/types.rb
48
39
  - lib/kind/dig.rb
49
40
  - lib/kind/empty.rb
41
+ - lib/kind/empty/constant.rb
50
42
  - lib/kind/error.rb
51
43
  - lib/kind/maybe.rb
52
44
  - lib/kind/maybe/none.rb
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module DEPRECATION # :nodoc: all
5
- WARN_IS_DISABLED = String(ENV['DISABLE_KIND_DEPRECATION']).strip == 't'
6
-
7
- module DevNull
8
- def self.warn(_)
9
- end
10
- end
11
-
12
- OUTPUT = WARN_IS_DISABLED ? DevNull : ::Kernel
13
-
14
- def self.warn(message)
15
- OUTPUT.warn("[DEPRECATION] #{message}" % { version: 'version 5.0' })
16
- end
17
-
18
- def self.warn_method_replacement(old_method, new_method)
19
- self.warn "`#{old_method}` is deprecated, it will be removed in %{version}. " \
20
- "Please use `#{new_method}` instead."
21
- end
22
-
23
- def self.warn_removal(name)
24
- self.warn "`#{name}` is deprecated, it will be removed in %{version}."
25
- end
26
-
27
- private_constant :DevNull, :OUTPUT
28
- end
29
- end
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module WRONG_NUMBER_OF_ARGS
5
- def self.error!(given:, expected:)
6
- raise ArgumentError, "wrong number of arguments (given #{given}, expected #{expected})"
7
- end
8
- end
9
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- # -- Classes
5
- [
6
- ::String, ::Symbol, ::Numeric, ::Integer, ::Float, ::Regexp, ::Time,
7
- ::Array, ::Range, ::Hash, ::Struct, ::Enumerator, ::Set, ::OpenStruct,
8
- ::Method, ::Proc,
9
- ::IO, ::File
10
- ].each { |klass| Types.add(klass) }
11
-
12
- Types.add(::Queue, name: 'Queue'.freeze)
13
-
14
- # -- Modules
15
- [
16
- ::Enumerable, ::Comparable
17
- ].each { |klass| Types.add(klass) }
18
-
19
- # -- Kind::Of::Maybe
20
-
21
- Types.add(Kind::Maybe::Result, name: 'Maybe'.freeze)
22
- Types.add(Kind::Maybe::Result, name: 'Optional'.freeze)
23
- end
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'kind/deprecations/checker/factory'
4
- require 'kind/deprecations/checker/protocol'
5
-
6
- module Kind
7
- class Checker
8
- include Protocol
9
-
10
- attr_reader :__kind
11
-
12
- def initialize(kind)
13
- @__kind = kind
14
- end
15
- end
16
- end
@@ -1,31 +0,0 @@
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
- def create(kind)
19
- @__checkers__[kind] ||= begin
20
- kind_name = kind.name
21
-
22
- if Kind::Of.const_defined?(kind_name, false)
23
- Kind::Of.const_get(kind_name)
24
- else
25
- Kind::Checker.new(Kind.of_module_or_class(kind))
26
- end
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,73 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- class Checker
5
- module Protocol
6
- def class?(value)
7
- KIND.is?(__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::KIND.null?(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
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module Is
5
- def self.call(expected, object)
6
- DEPRECATION.warn_method_replacement('Kind::Is.call', 'Kind::KIND.is?')
7
-
8
- KIND.is?(expected, object)
9
- end
10
-
11
- def self.Class(value)
12
- DEPRECATION.warn_method_replacement('Kind::Is.Class', 'Kind.of_class?')
13
-
14
- Kind.of_class?(value)
15
- end
16
-
17
- def self.Module(value)
18
- DEPRECATION.warn_method_replacement('Kind::Is.Module', 'Kind.of_module?')
19
-
20
- Kind.of_module?(value)
21
- end
22
-
23
- def self.Boolean(value)
24
- DEPRECATION.warn_removal('Kind::Is.Boolean')
25
-
26
- Kind::Class[value] <= TrueClass || value <= FalseClass
27
- end
28
-
29
- def self.Callable(value)
30
- DEPRECATION.warn_method_replacement('Kind::Is.Callable', 'Kind::Callable?')
31
-
32
- value.respond_to?(:call)
33
- end
34
- end
35
- end
@@ -1,258 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module Of
5
- def self.call(kind, object, kind_name = nil)
6
- DEPRECATION.warn_method_replacement('Kind::Of.call', 'Kind::KIND.of!')
7
-
8
- KIND.of!(kind, object, kind_name)
9
- end
10
-
11
- # -- Class
12
-
13
- def self.Class(object = Undefined)
14
- DEPRECATION.warn_method_replacement('Kind::Of::Class', 'Kind::Class')
15
-
16
- return Class if Undefined == object
17
-
18
- self.call(::Class, object)
19
- end
20
-
21
- const_set(:Class, ::Module.new do
22
- extend Checker::Protocol
23
-
24
- def self.__kind; ::Class; end
25
-
26
- def self.class?(value); Kind.of_class?(value); end
27
-
28
- def self.__is_instance__(value); class?(value); end
29
- end)
30
-
31
- def self.Class?(*args)
32
- DEPRECATION.warn_method_replacement('Kind::Of::Class?', 'Kind::Class?')
33
-
34
- Kind::Class?(*args)
35
- end
36
-
37
- # -- Module
38
-
39
- def self.Module(object = Undefined)
40
- DEPRECATION.warn_method_replacement('Kind::Of::Module', 'Kind::Module')
41
-
42
- return Module if Undefined == object
43
-
44
- self.call(::Module, object)
45
- end
46
-
47
- const_set(:Module, ::Module.new do
48
- extend Checker::Protocol
49
-
50
- def self.__kind_undefined(value)
51
- __kind_error(Kind::Undefined) if Kind::Undefined == value
52
-
53
- yield
54
- end
55
-
56
- def self.__kind_error(value)
57
- raise Kind::Error.new('Module'.freeze, value)
58
- end
59
-
60
- def self.__kind_of(value)
61
- return value if Kind.of_module?(value)
62
-
63
- __kind_error(value)
64
- end
65
-
66
- def self.__kind; ::Module; end
67
-
68
- def self.class?(value); Kind.of_module?(value); end
69
-
70
- def self.instance(value, options = Empty::HASH)
71
- default = options[:or]
72
-
73
- if ::Kind::KIND.null?(default)
74
- __kind_undefined(value) { __kind_of(value) }
75
- else
76
- return value if Kind::Undefined != value && instance?(value)
77
-
78
- __kind_undefined(default) { __kind_of(default) }
79
- end
80
- end
81
-
82
- def self.__is_instance__(value); class?(value); end
83
- end)
84
-
85
- def self.Module?(*args)
86
- DEPRECATION.warn_method_replacement('Kind::Of::Module?', 'Kind::Module?')
87
-
88
- Kind::Module?(*args)
89
- end
90
-
91
- # -- Boolean
92
-
93
- def self.Boolean(object = Undefined, options = Empty::HASH)
94
- DEPRECATION.warn_method_replacement('Kind::Of::Boolean', 'Kind::Boolean')
95
-
96
- default = options[:or]
97
-
98
- return Kind::Of::Boolean if Undefined == object && default.nil?
99
-
100
- bool = object.nil? ? default : object
101
-
102
- return bool if bool.is_a?(::TrueClass) || bool.is_a?(::FalseClass)
103
-
104
- raise Kind::Error.new('Boolean'.freeze, bool)
105
- end
106
-
107
- const_set(:Boolean, ::Module.new do
108
- extend Checker::Protocol
109
-
110
- def self.__kind; [TrueClass, FalseClass].freeze; end
111
-
112
- def self.class?(value); Kind.is.Boolean(value); end
113
-
114
- def self.instance(value, options= Empty::HASH)
115
- default = options[:or]
116
-
117
- if ::Kind::KIND.null?(default)
118
- __kind_undefined(value) { Kind::Of::Boolean(value) }
119
- else
120
- return value if Kind::Undefined != value && instance?(value)
121
-
122
- __kind_undefined(default) { Kind::Of::Boolean(default) }
123
- end
124
- end
125
-
126
- def self.__kind_undefined(value)
127
- if Kind::Undefined == value
128
- raise Kind::Error.new('Boolean'.freeze, Kind::Undefined)
129
- else
130
- yield
131
- end
132
- end
133
-
134
- def self.__is_instance__(value);
135
- value.is_a?(TrueClass) || value.is_a?(FalseClass)
136
- end
137
-
138
- def self.or_undefined(value)
139
- result = or_nil(value)
140
- result.nil? ? Kind::Undefined : result
141
- end
142
- end)
143
-
144
- def self.Boolean?(*args)
145
- DEPRECATION.warn_method_replacement('Kind::Of::Boolean?', 'Kind::Boolean?')
146
-
147
- Kind::Boolean?(*args)
148
- end
149
-
150
- # -- Lambda
151
-
152
- def self.Lambda(object = Undefined, options = Empty::HASH)
153
- DEPRECATION.warn_method_replacement('Kind::Of::Lambda', 'Kind::Lambda')
154
-
155
- default = options[:or]
156
-
157
- return Kind::Of::Lambda if Undefined == object && default.nil?
158
-
159
- func = object || default
160
-
161
- return func if func.is_a?(::Proc) && func.lambda?
162
-
163
- raise Kind::Error.new('Lambda'.freeze, func)
164
- end
165
-
166
- const_set(:Lambda, ::Module.new do
167
- extend Checker::Protocol
168
-
169
- def self.__kind; ::Proc; end
170
-
171
- def self.instance(value, options = Empty::HASH)
172
- default = options[:or]
173
-
174
- if ::Kind::KIND.null?(default)
175
- __kind_undefined(value) { Kind::Of::Lambda(value) }
176
- else
177
- return value if Kind::Undefined != value && instance?(value)
178
-
179
- __kind_undefined(default) { Kind::Of::Lambda(default) }
180
- end
181
- end
182
-
183
- def self.__kind_undefined(value)
184
- if Kind::Undefined == value
185
- raise Kind::Error.new('Lambda'.freeze, Kind::Undefined)
186
- else
187
- yield
188
- end
189
- end
190
-
191
- def self.__is_instance__(value)
192
- value.is_a?(__kind) && value.lambda?
193
- end
194
- end)
195
-
196
- def self.Lambda?(*args)
197
- DEPRECATION.warn_method_replacement('Kind::Of::Lambda?', 'Kind::Lambda?')
198
-
199
- Kind::Lambda?(*args)
200
- end
201
-
202
- # -- Callable
203
-
204
- def self.Callable(object = Undefined, options = Empty::HASH)
205
- DEPRECATION.warn_method_replacement('Kind::Of::Callable', 'Kind::Callable')
206
-
207
- default = options[:or]
208
-
209
- return Kind::Of::Callable if Undefined == object && default.nil?
210
-
211
- callable = object || default
212
-
213
- return callable if callable.respond_to?(:call)
214
-
215
- raise Kind::Error.new('Callable'.freeze, callable)
216
- end
217
-
218
- const_set(:Callable, ::Module.new do
219
- extend Checker::Protocol
220
-
221
- def self.__kind; Object; end
222
-
223
- def self.class?(value)
224
- Kind::Is::Callable(value)
225
- end
226
-
227
- def self.instance(value, options = Empty::HASH)
228
- default = options[:or]
229
-
230
- if ::Kind::KIND.null?(default)
231
- __kind_undefined(value) { Kind::Of::Callable(value) }
232
- else
233
- return value if Kind::Undefined != value && instance?(value)
234
-
235
- __kind_undefined(default) { Kind::Of::Callable(default) }
236
- end
237
- end
238
-
239
- def self.__kind_undefined(value)
240
- if Kind::Undefined == value
241
- raise Kind::Error.new('Callable'.freeze, Kind::Undefined)
242
- else
243
- yield
244
- end
245
- end
246
-
247
- def self.__is_instance__(value);
248
- value.respond_to?(:call)
249
- end
250
- end)
251
-
252
- def self.Callable?(*args)
253
- DEPRECATION.warn_method_replacement('Kind::Of::Callable?', 'Kind::Callable?')
254
-
255
- Kind::Callable?(*args)
256
- end
257
- end
258
- end
@@ -1,121 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module Types
5
- extend self
6
-
7
- COLONS = '::'.freeze
8
-
9
- KIND_OF = <<-RUBY
10
- def self.%{method_name}(object = Undefined, options = Empty::HASH)
11
- DEPRECATION.warn_method_replacement('Kind::Of::%{method_name}', 'Kind::%{method_name}')
12
-
13
- default = options[:or]
14
-
15
- return Kind::Of::%{kind_name} if Undefined == object && default.nil?
16
-
17
- is_instance = Kind::Of::%{kind_name}.__is_instance__(object)
18
-
19
- return object if is_instance
20
-
21
- KIND.of!(::%{kind_name_to_check}, object && default ? default : object || default)
22
- end
23
- RUBY
24
-
25
- KIND_OF_IS = <<-RUBY
26
- def self.%{method_name}?(*args)
27
- DEPRECATION.warn_method_replacement('Kind::Of::%{method_name}?', 'Kind::%{method_name}?')
28
-
29
- Kind::Of::%{kind_name}.instance?(*args)
30
- end
31
- RUBY
32
-
33
- KIND_IS = <<-RUBY
34
- def self.%{method_name}(value)
35
- DEPRECATION.warn_removal('Kind::Is::%{method_name}')
36
-
37
- KIND.is!(::%{kind_name_to_check}, value)
38
- end
39
- RUBY
40
-
41
- private_constant :KIND_OF, :KIND_IS, :COLONS
42
-
43
- def add(kind, name: nil)
44
- DEPRECATION.warn_removal('Kind::Types')
45
-
46
- kind_name = KIND.of_module_or_class!(kind).name
47
- checker = name ? Kind::String[name] : kind_name
48
-
49
- if checker.include?(COLONS)
50
- add_kind_with_namespace(checker, method_name: name)
51
- else
52
- add_root(checker, kind_name, method_name: name,
53
- kind_name_to_check: kind_name,
54
- create_kind_is_mod: false)
55
- end
56
- end
57
-
58
- private
59
-
60
- def add_root(checker, kind_name, method_name:, create_kind_is_mod:, kind_name_to_check: nil)
61
- root_kind_name = method_name ? method_name : kind_name
62
-
63
- params = {
64
- method_name: method_name ? method_name : checker,
65
- kind_name: method_name ? method_name : kind_name,
66
- kind_name_to_check: kind_name_to_check || root_kind_name
67
- }
68
-
69
- add_kind(params, Kind::Of, Kind::Is, create_kind_is_mod)
70
- end
71
-
72
- def add_kind_with_namespace(checker, method_name:)
73
- raise NotImplementedError if method_name
74
-
75
- const_names = checker.split(COLONS)
76
- const_names.each_with_index do |const_name, index|
77
- if index == 0
78
- add_root(const_name, const_name, method_name: nil, create_kind_is_mod: true)
79
- else
80
- add_node(const_names, index)
81
- end
82
- end
83
- end
84
-
85
- def add_node(const_names, index)
86
- namespace = const_names[0..(index-1)]
87
- namespace_name = namespace.join(COLONS)
88
-
89
- kind_of_mod = Kind::Of.const_get(namespace_name)
90
- kind_is_mod = Kind::Is.const_get(namespace_name)
91
-
92
- checker = const_names[index]
93
- kind_name = const_names[0..index].join(COLONS)
94
-
95
- params = { method_name: checker, kind_name: kind_name }
96
-
97
- add_kind(params, kind_of_mod, kind_is_mod, true)
98
- end
99
-
100
- def add_kind(params, kind_of_mod, kind_is_mod, create_kind_is_mod)
101
- method_name = params[:method_name]
102
-
103
- unless kind_of_mod.respond_to?(method_name)
104
- kind_name = params[:kind_name]
105
- params[:kind_name_to_check] ||= kind_name
106
-
107
- kind_checker = ::Module.new { extend Checker::Protocol }
108
- kind_checker.module_eval("def self.__kind; ::#{params[:kind_name_to_check]}; end")
109
-
110
- kind_of_mod.instance_eval(KIND_OF % params)
111
- kind_of_mod.const_set(method_name, kind_checker)
112
- kind_of_mod.instance_eval(KIND_OF_IS % params)
113
- end
114
-
115
- unless kind_is_mod.respond_to?(method_name)
116
- kind_is_mod.instance_eval(KIND_IS % params)
117
- kind_is_mod.const_set(method_name, ::Module.new) if create_kind_is_mod
118
- end
119
- end
120
- end
121
- end