kind 4.0.0 → 5.3.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.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/.tool-versions +1 -1
  3. data/.travis.sh +39 -7
  4. data/.travis.yml +1 -2
  5. data/CHANGELOG.md +486 -28
  6. data/Gemfile +13 -6
  7. data/README.md +153 -49
  8. data/kind.gemspec +1 -1
  9. data/lib/kind.rb +2 -84
  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 -2
  29. data/lib/kind/empty/constant.rb +7 -0
  30. data/lib/kind/enum.rb +63 -0
  31. data/lib/kind/enum/item.rb +40 -0
  32. data/lib/kind/enum/methods.rb +72 -0
  33. data/lib/kind/function.rb +45 -0
  34. data/lib/kind/functional.rb +89 -0
  35. data/lib/kind/functional/action.rb +90 -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} +9 -7
  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 +21 -11
  93. data/lib/kind/validator.rb +111 -0
  94. data/lib/kind/version.rb +1 -1
  95. metadata +78 -48
  96. data/lib/kind/active_model/kind_validator.rb +0 -96
  97. data/lib/kind/core.rb +0 -9
  98. data/lib/kind/core/deprecation.rb +0 -29
  99. data/lib/kind/core/kind.rb +0 -61
  100. data/lib/kind/core/undefined.rb +0 -7
  101. data/lib/kind/deprecations/built_in_type_checkers.rb +0 -23
  102. data/lib/kind/deprecations/checker.rb +0 -16
  103. data/lib/kind/deprecations/checker/factory.rb +0 -31
  104. data/lib/kind/deprecations/checker/protocol.rb +0 -73
  105. data/lib/kind/deprecations/is.rb +0 -35
  106. data/lib/kind/deprecations/of.rb +0 -258
  107. data/lib/kind/deprecations/types.rb +0 -121
  108. data/lib/kind/error.rb +0 -15
  109. data/lib/kind/maybe/result.rb +0 -51
  110. data/lib/kind/type_checker.rb +0 -73
  111. data/lib/kind/type_checkers.rb +0 -30
@@ -3,26 +3,32 @@
3
3
  module Kind
4
4
  module Maybe
5
5
  class Typed
6
- include Wrappable
6
+ include Wrapper
7
+
8
+ singleton_class.send(:alias_method, :[], :new)
7
9
 
8
10
  def initialize(kind)
9
11
  @kind = kind
10
12
  end
11
13
 
12
14
  def new(arg)
13
- value = Result::Value.(arg)
15
+ value = Monad::Value[arg]
14
16
 
15
- value.kind_of?(@kind) ? Maybe.some(value) : Maybe.none
17
+ @kind === value ? Maybe::Some[value] : Maybe::NONE_INSTANCE
16
18
  end
17
19
 
18
20
  alias_method :[], :new
19
21
 
22
+ def inspect
23
+ "Kind::Maybe<#{@kind}>"
24
+ end
25
+
20
26
  private
21
27
 
22
28
  def __call_before_expose_the_arg_in_a_block(arg)
23
- value = Result::Value.(arg)
29
+ value = Monad::Value[arg]
24
30
 
25
- value.kind_of?(@kind) ? value : Maybe.none
31
+ @kind === value ? value : Maybe::NONE_INSTANCE
26
32
  end
27
33
  end
28
34
  end
@@ -2,9 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module Maybe
5
- module Wrappable
6
- WRONG_NUMBER_OF_ARGS = 'wrong number of arguments (given 0, expected 1)'.freeze
7
-
5
+ module Wrapper
8
6
  def wrap(arg = UNDEFINED)
9
7
  if block_given?
10
8
  begin
@@ -12,17 +10,21 @@ module Kind
12
10
 
13
11
  input = __call_before_expose_the_arg_in_a_block(arg)
14
12
 
15
- input.kind_of?(Kind::Maybe::None) ? input : new(yield(input))
13
+ input.kind_of?(Maybe::None) ? input : new(yield(input))
16
14
  rescue StandardError => exception
17
- Maybe.__none__(exception)
15
+ Maybe::None.new(exception)
18
16
  end
19
17
  else
20
18
  return new(arg) if UNDEFINED != arg
21
19
 
22
- raise ArgumentError, WRONG_NUMBER_OF_ARGS
20
+ Error.wrong_number_of_args!(given: 0, expected: 1)
23
21
  end
24
22
  end
25
23
 
24
+ def from(&block)
25
+ wrap(&block)
26
+ end
27
+
26
28
  private
27
29
 
28
30
  def __call_before_expose_the_arg_in_a_block(input)
@@ -30,6 +32,6 @@ module Kind
30
32
  end
31
33
  end
32
34
 
33
- private_constant :Wrappable
35
+ private_constant :Wrapper
34
36
  end
35
37
  end
data/lib/kind/monad.rb ADDED
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Monad
5
+ Error = ::Class.new(Kind::Error)
6
+
7
+ class Wrapper
8
+ def initialize(monad)
9
+ @monad = monad
10
+ @output = UNDEFINED
11
+ end
12
+
13
+ def output?
14
+ UNDEFINED != @output
15
+ end
16
+
17
+ def output
18
+ @output if output?
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kind/maybe'
4
+ require 'kind/either'
5
+ require 'kind/result'
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kind/try'
4
+ require 'kind/maybe'
5
+
6
+ require 'kind/objects/basic_object'
7
+ require 'kind/objects/respond_to'
8
+ require 'kind/objects/union_type'
9
+ require 'kind/objects/nil'
10
+ require 'kind/objects/not_nil'
11
+ require 'kind/objects/object'
12
+ require 'kind/objects/modules'
13
+
14
+ module Kind
15
+ UnionType.send(:include, Maybe::Buildable)
16
+ RespondTo.send(:include, Maybe::Buildable)
17
+ end
@@ -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, TypeChecker
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,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module Class
5
- extend self, TypeChecker
5
+ extend self, ::Kind::Object
6
6
 
7
7
  def kind; ::Class; end
8
8
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module Comparable
5
- extend self, TypeChecker
5
+ extend self, ::Kind::Object
6
6
 
7
7
  def kind; ::Comparable; end
8
8
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module Enumerable
5
- extend self, TypeChecker
5
+ extend self, ::Kind::Object
6
6
 
7
7
  def kind; ::Enumerable; end
8
8
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module Enumerator
5
- extend self, TypeChecker
5
+ extend self, ::Kind::Object
6
6
 
7
7
  def kind; ::Enumerator; end
8
8
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module File
5
- extend self, TypeChecker
5
+ extend self, ::Kind::Object
6
6
 
7
7
  def kind; ::File; end
8
8
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module Float
5
- extend self, TypeChecker
5
+ extend self, ::Kind::Object
6
6
 
7
7
  def kind; ::Float; end
8
8
  end
@@ -2,13 +2,15 @@
2
2
 
3
3
  module Kind
4
4
  module Hash
5
- extend self, TypeChecker
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,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module Integer
5
- extend self, TypeChecker
5
+ extend self, ::Kind::Object
6
6
 
7
7
  def kind; ::Integer; end
8
8
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module IO
5
- extend self, TypeChecker
5
+ extend self, ::Kind::Object
6
6
 
7
7
  def kind; ::IO; end
8
8
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module Method
5
- extend self, TypeChecker
5
+ extend self, ::Kind::Object
6
6
 
7
7
  def kind; ::Method; end
8
8
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module Module
5
- extend self, TypeChecker
5
+ extend self, ::Kind::Object
6
6
 
7
7
  def kind; ::Module; end
8
8
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module Numeric
5
- extend self, TypeChecker
5
+ extend self, ::Kind::Object
6
6
 
7
7
  def kind; ::Numeric; end
8
8
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module Proc
5
- extend self, TypeChecker
5
+ extend self, ::Kind::Object
6
6
 
7
7
  def kind; ::Proc; end
8
8
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module Queue
5
- extend self, TypeChecker
5
+ extend self, ::Kind::Object
6
6
 
7
7
  def kind; ::Queue; end
8
8
  def name; 'Queue'; end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module Range
5
- extend self, TypeChecker
5
+ extend self, ::Kind::Object
6
6
 
7
7
  def kind; ::Range; end
8
8
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module Regexp
5
- extend self, TypeChecker
5
+ extend self, ::Kind::Object
6
6
 
7
7
  def kind; ::Regexp; end
8
8
  end
@@ -2,13 +2,15 @@
2
2
 
3
3
  module Kind
4
4
  module String
5
- extend self, TypeChecker
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,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module Struct
5
- extend self, TypeChecker
5
+ extend self, ::Kind::Object
6
6
 
7
7
  def kind; ::Struct; end
8
8
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module Symbol
5
- extend self, TypeChecker
5
+ extend self, ::Kind::Object
6
6
 
7
7
  def kind; ::Symbol; end
8
8
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Kind
4
4
  module Time
5
- extend self, TypeChecker
5
+ extend self, ::Kind::Object
6
6
 
7
7
  def kind; ::Time; end
8
8
  end