kind 4.1.0 → 5.0.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 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