kind 4.1.0 → 5.4.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 +4 -4
- data/.tool-versions +1 -1
- data/.travis.sh +39 -7
- data/.travis.yml +1 -2
- data/CHANGELOG.md +524 -29
- data/Gemfile +13 -6
- data/README.md +57 -43
- data/kind.gemspec +3 -3
- data/lib/kind.rb +2 -84
- 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 -2
- data/lib/kind/empty/constant.rb +7 -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 +84 -51
- data/lib/kind/active_model/kind_validator.rb +0 -103
- data/lib/kind/core.rb +0 -10
- data/lib/kind/core/deprecation.rb +0 -29
- data/lib/kind/core/kind.rb +0 -61
- data/lib/kind/core/undefined.rb +0 -7
- data/lib/kind/core/wrong_number_of_args.rb +0 -9
- data/lib/kind/deprecations/built_in_type_checkers.rb +0 -23
- data/lib/kind/deprecations/checker.rb +0 -16
- data/lib/kind/deprecations/checker/factory.rb +0 -31
- data/lib/kind/deprecations/checker/protocol.rb +0 -73
- data/lib/kind/deprecations/is.rb +0 -35
- data/lib/kind/deprecations/of.rb +0 -258
- data/lib/kind/deprecations/types.rb +0 -121
- 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
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kind
|
4
|
+
module BasicObject
|
5
|
+
def [](value, label: nil)
|
6
|
+
STRICT.object_is_a(self, value, label)
|
7
|
+
end
|
8
|
+
|
9
|
+
def or_nil(value)
|
10
|
+
return value if self === value
|
11
|
+
end
|
12
|
+
|
13
|
+
def or_undefined(value)
|
14
|
+
or_nil(value) || Undefined
|
15
|
+
end
|
16
|
+
|
17
|
+
def or(fallback, value = UNDEFINED)
|
18
|
+
return __or_func.(fallback) if UNDEFINED === value
|
19
|
+
|
20
|
+
self === value ? value : fallback
|
21
|
+
end
|
22
|
+
|
23
|
+
def value?(value = UNDEFINED)
|
24
|
+
return self === value if UNDEFINED != value
|
25
|
+
|
26
|
+
@__is_value ||= ->(tc) { ->(arg) { tc === arg } }.(self)
|
27
|
+
end
|
28
|
+
|
29
|
+
def value(arg, default:)
|
30
|
+
KIND.value(self, arg, self[default])
|
31
|
+
end
|
32
|
+
|
33
|
+
def or_null(value) # :nodoc:
|
34
|
+
KIND.nil_or_undefined?(value) ? value : self[value]
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def __or_func
|
40
|
+
@__or_func ||= ->(tc, fb, value) { tc === value ? value : tc.or_null(fb) }.curry[self]
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'kind/empty'
|
4
|
+
|
5
|
+
require 'kind/objects/modules/core/array'
|
6
|
+
require 'kind/objects/modules/core/class'
|
7
|
+
require 'kind/objects/modules/core/comparable'
|
8
|
+
require 'kind/objects/modules/core/enumerable'
|
9
|
+
require 'kind/objects/modules/core/enumerator'
|
10
|
+
require 'kind/objects/modules/core/file'
|
11
|
+
require 'kind/objects/modules/core/float'
|
12
|
+
require 'kind/objects/modules/core/hash'
|
13
|
+
require 'kind/objects/modules/core/integer'
|
14
|
+
require 'kind/objects/modules/core/io'
|
15
|
+
require 'kind/objects/modules/core/module'
|
16
|
+
require 'kind/objects/modules/core/method'
|
17
|
+
require 'kind/objects/modules/core/numeric'
|
18
|
+
require 'kind/objects/modules/core/proc'
|
19
|
+
require 'kind/objects/modules/core/queue'
|
20
|
+
require 'kind/objects/modules/core/range'
|
21
|
+
require 'kind/objects/modules/core/regexp'
|
22
|
+
require 'kind/objects/modules/core/string'
|
23
|
+
require 'kind/objects/modules/core/struct'
|
24
|
+
require 'kind/objects/modules/core/symbol'
|
25
|
+
require 'kind/objects/modules/core/time'
|
26
|
+
|
27
|
+
require 'kind/objects/modules/stdlib/open_struct'
|
28
|
+
require 'kind/objects/modules/stdlib/set'
|
29
|
+
|
30
|
+
require 'kind/objects/modules/custom/boolean'
|
31
|
+
require 'kind/objects/modules/custom/callable'
|
32
|
+
require 'kind/objects/modules/custom/lambda'
|
@@ -2,13 +2,15 @@
|
|
2
2
|
|
3
3
|
module Kind
|
4
4
|
module Array
|
5
|
-
extend self,
|
5
|
+
extend self, ::Kind::Object
|
6
6
|
|
7
7
|
def kind; ::Array; end
|
8
8
|
|
9
9
|
def value_or_empty(arg)
|
10
10
|
KIND.value(self, arg, Empty::ARRAY)
|
11
11
|
end
|
12
|
+
|
13
|
+
alias empty_or value_or_empty
|
12
14
|
end
|
13
15
|
|
14
16
|
def self.Array?(*values)
|
@@ -2,13 +2,15 @@
|
|
2
2
|
|
3
3
|
module Kind
|
4
4
|
module Hash
|
5
|
-
extend self,
|
5
|
+
extend self, ::Kind::Object
|
6
6
|
|
7
7
|
def kind; ::Hash; end
|
8
8
|
|
9
9
|
def value_or_empty(arg)
|
10
10
|
KIND.value(self, arg, Empty::HASH)
|
11
11
|
end
|
12
|
+
|
13
|
+
alias empty_or value_or_empty
|
12
14
|
end
|
13
15
|
|
14
16
|
def self.Hash?(*values)
|
@@ -2,13 +2,15 @@
|
|
2
2
|
|
3
3
|
module Kind
|
4
4
|
module String
|
5
|
-
extend self,
|
5
|
+
extend self, ::Kind::Object
|
6
6
|
|
7
7
|
def kind; ::String; end
|
8
8
|
|
9
9
|
def value_or_empty(arg)
|
10
10
|
KIND.value(self, arg, Empty::STRING)
|
11
11
|
end
|
12
|
+
|
13
|
+
alias empty_or value_or_empty
|
12
14
|
end
|
13
15
|
|
14
16
|
def self.String?(*values)
|
@@ -2,13 +2,15 @@
|
|
2
2
|
|
3
3
|
module Kind
|
4
4
|
module Set
|
5
|
-
extend self,
|
5
|
+
extend self, ::Kind::Object
|
6
6
|
|
7
7
|
def kind; ::Set; end
|
8
8
|
|
9
9
|
def value_or_empty(arg)
|
10
10
|
KIND.value(self, arg, Empty::SET)
|
11
11
|
end
|
12
|
+
|
13
|
+
alias empty_or value_or_empty
|
12
14
|
end
|
13
15
|
|
14
16
|
def self.Set?(*values)
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'kind/maybe'
|
4
|
+
|
5
|
+
module Kind
|
6
|
+
module Object
|
7
|
+
include Kind::BasicObject
|
8
|
+
include Maybe::Buildable
|
9
|
+
include UnionType::Buildable
|
10
|
+
|
11
|
+
def name
|
12
|
+
kind.name
|
13
|
+
end
|
14
|
+
|
15
|
+
def ===(value)
|
16
|
+
kind === value
|
17
|
+
end
|
18
|
+
|
19
|
+
def inspect
|
20
|
+
"Kind::Object<#{name}>"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class Object::Instance # :nodoc: all
|
25
|
+
include ::Kind::Object
|
26
|
+
|
27
|
+
ResolveKindName = ->(kind, opt) do
|
28
|
+
name = Try.call!(opt, :[], :name)
|
29
|
+
name || Try.call!(kind, :name)
|
30
|
+
end
|
31
|
+
|
32
|
+
attr_reader :kind, :name
|
33
|
+
|
34
|
+
def initialize(kind, opt)
|
35
|
+
name = ResolveKindName.(kind, opt)
|
36
|
+
|
37
|
+
@name = STRICT.kind_of(::String, name)
|
38
|
+
@kind = KIND.respond_to!(:===, kind)
|
39
|
+
end
|
40
|
+
|
41
|
+
private_constant :ResolveKindName
|
42
|
+
end
|
43
|
+
|
44
|
+
# Kind[]
|
45
|
+
def self.[](kind, opt = Empty::HASH)
|
46
|
+
Object::Instance.new(kind, opt)
|
47
|
+
end
|
48
|
+
|
49
|
+
# Kind::Of()
|
50
|
+
def self.Of(*args)
|
51
|
+
warn '[DEPRECATION] Kind::Of() is deprecated; use Kind[] instead. ' \
|
52
|
+
'It will be removed on next major release.'
|
53
|
+
|
54
|
+
self[*args]
|
55
|
+
end
|
56
|
+
end
|