kind 3.0.1 → 5.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.tool-versions +1 -0
  3. data/.travis.sh +42 -12
  4. data/.travis.yml +7 -5
  5. data/CHANGELOG.md +1309 -0
  6. data/Gemfile +22 -7
  7. data/README.md +990 -490
  8. data/kind.gemspec +1 -1
  9. data/lib/kind.rb +29 -292
  10. data/lib/kind/active_model/validation.rb +3 -4
  11. data/lib/kind/core.rb +15 -0
  12. data/lib/kind/core/dig.rb +40 -0
  13. data/lib/kind/core/empty.rb +13 -0
  14. data/lib/kind/core/empty/constant.rb +7 -0
  15. data/lib/kind/{error.rb → core/error.rb} +2 -6
  16. data/lib/kind/core/maybe.rb +42 -0
  17. data/lib/kind/core/maybe/none.rb +57 -0
  18. data/lib/kind/core/maybe/result.rb +51 -0
  19. data/lib/kind/core/maybe/some.rb +90 -0
  20. data/lib/kind/core/maybe/typed.rb +29 -0
  21. data/lib/kind/core/maybe/wrappable.rb +33 -0
  22. data/lib/kind/core/presence.rb +33 -0
  23. data/lib/kind/core/try.rb +34 -0
  24. data/lib/kind/core/type_checker.rb +87 -0
  25. data/lib/kind/core/type_checkers.rb +30 -0
  26. data/lib/kind/core/type_checkers/custom/boolean.rb +19 -0
  27. data/lib/kind/core/type_checkers/custom/callable.rb +19 -0
  28. data/lib/kind/core/type_checkers/custom/lambda.rb +19 -0
  29. data/lib/kind/core/type_checkers/ruby/array.rb +17 -0
  30. data/lib/kind/core/type_checkers/ruby/class.rb +13 -0
  31. data/lib/kind/core/type_checkers/ruby/comparable.rb +13 -0
  32. data/lib/kind/core/type_checkers/ruby/enumerable.rb +13 -0
  33. data/lib/kind/core/type_checkers/ruby/enumerator.rb +13 -0
  34. data/lib/kind/core/type_checkers/ruby/file.rb +13 -0
  35. data/lib/kind/core/type_checkers/ruby/float.rb +13 -0
  36. data/lib/kind/core/type_checkers/ruby/hash.rb +17 -0
  37. data/lib/kind/core/type_checkers/ruby/integer.rb +13 -0
  38. data/lib/kind/core/type_checkers/ruby/io.rb +13 -0
  39. data/lib/kind/core/type_checkers/ruby/method.rb +13 -0
  40. data/lib/kind/core/type_checkers/ruby/module.rb +17 -0
  41. data/lib/kind/core/type_checkers/ruby/numeric.rb +13 -0
  42. data/lib/kind/core/type_checkers/ruby/proc.rb +13 -0
  43. data/lib/kind/core/type_checkers/ruby/queue.rb +14 -0
  44. data/lib/kind/core/type_checkers/ruby/range.rb +13 -0
  45. data/lib/kind/core/type_checkers/ruby/regexp.rb +13 -0
  46. data/lib/kind/core/type_checkers/ruby/string.rb +17 -0
  47. data/lib/kind/core/type_checkers/ruby/struct.rb +13 -0
  48. data/lib/kind/core/type_checkers/ruby/symbol.rb +13 -0
  49. data/lib/kind/core/type_checkers/ruby/time.rb +13 -0
  50. data/lib/kind/core/type_checkers/stdlib/open_struct.rb +13 -0
  51. data/lib/kind/core/type_checkers/stdlib/set.rb +17 -0
  52. data/lib/kind/{undefined.rb → core/undefined.rb} +4 -2
  53. data/lib/kind/core/utils/kind.rb +61 -0
  54. data/lib/kind/core/utils/undefined.rb +7 -0
  55. data/lib/kind/validator.rb +108 -1
  56. data/lib/kind/version.rb +1 -1
  57. data/test.sh +4 -4
  58. metadata +50 -15
  59. data/lib/kind/active_model/kind_validator.rb +0 -96
  60. data/lib/kind/checker.rb +0 -15
  61. data/lib/kind/checker/factory.rb +0 -35
  62. data/lib/kind/checker/protocol.rb +0 -73
  63. data/lib/kind/empty.rb +0 -21
  64. data/lib/kind/is.rb +0 -19
  65. data/lib/kind/maybe.rb +0 -183
  66. data/lib/kind/of.rb +0 -11
  67. data/lib/kind/types.rb +0 -115
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kind/core/type_checkers/ruby/array'
4
+ require 'kind/core/type_checkers/ruby/class'
5
+ require 'kind/core/type_checkers/ruby/comparable'
6
+ require 'kind/core/type_checkers/ruby/enumerable'
7
+ require 'kind/core/type_checkers/ruby/enumerator'
8
+ require 'kind/core/type_checkers/ruby/file'
9
+ require 'kind/core/type_checkers/ruby/float'
10
+ require 'kind/core/type_checkers/ruby/hash'
11
+ require 'kind/core/type_checkers/ruby/integer'
12
+ require 'kind/core/type_checkers/ruby/io'
13
+ require 'kind/core/type_checkers/ruby/module'
14
+ require 'kind/core/type_checkers/ruby/method'
15
+ require 'kind/core/type_checkers/ruby/numeric'
16
+ require 'kind/core/type_checkers/ruby/proc'
17
+ require 'kind/core/type_checkers/ruby/queue'
18
+ require 'kind/core/type_checkers/ruby/range'
19
+ require 'kind/core/type_checkers/ruby/regexp'
20
+ require 'kind/core/type_checkers/ruby/string'
21
+ require 'kind/core/type_checkers/ruby/struct'
22
+ require 'kind/core/type_checkers/ruby/symbol'
23
+ require 'kind/core/type_checkers/ruby/time'
24
+
25
+ require 'kind/core/type_checkers/stdlib/open_struct'
26
+ require 'kind/core/type_checkers/stdlib/set'
27
+
28
+ require 'kind/core/type_checkers/custom/boolean'
29
+ require 'kind/core/type_checkers/custom/callable'
30
+ require 'kind/core/type_checkers/custom/lambda'
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Boolean
5
+ extend self, TypeChecker
6
+
7
+ def kind; [TrueClass, FalseClass].freeze; end
8
+
9
+ def name; 'Boolean'; end
10
+
11
+ def ===(value)
12
+ ::TrueClass === value || ::FalseClass === value
13
+ end
14
+ end
15
+
16
+ def self.Boolean?(*values)
17
+ KIND.of?(Boolean, values)
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Callable
5
+ extend self, TypeChecker
6
+
7
+ def kind; raise NotImplementedError; end
8
+
9
+ def name; 'Callable'; end
10
+
11
+ def ===(value)
12
+ value.respond_to?(:call)
13
+ end
14
+ end
15
+
16
+ def self.Callable?(*values)
17
+ KIND.of?(Callable, values)
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Lambda
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Proc; end
8
+
9
+ def name; 'Lambda'; end
10
+
11
+ def ===(value)
12
+ value.kind_of?(::Proc) && value.lambda?
13
+ end
14
+ end
15
+
16
+ def self.Lambda?(*values)
17
+ KIND.of?(Lambda, values)
18
+ end
19
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Array
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Array; end
8
+
9
+ def value_or_empty(arg)
10
+ KIND.value(self, arg, Empty::ARRAY)
11
+ end
12
+ end
13
+
14
+ def self.Array?(*values)
15
+ KIND.of?(::Array, values)
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Class
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Class; end
8
+ end
9
+
10
+ def self.Class?(*values)
11
+ KIND.of?(::Class, values)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Comparable
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Comparable; end
8
+ end
9
+
10
+ def self.Comparable?(*values)
11
+ KIND.of?(::Comparable, values)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Enumerable
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Enumerable; end
8
+ end
9
+
10
+ def self.Enumerable?(*values)
11
+ KIND.of?(::Enumerable, values)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Enumerator
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Enumerator; end
8
+ end
9
+
10
+ def self.Enumerator?(*values)
11
+ KIND.of?(::Enumerator, values)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module File
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::File; end
8
+ end
9
+
10
+ def self.File?(*values)
11
+ KIND.of?(::File, values)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Float
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Float; end
8
+ end
9
+
10
+ def self.Float?(*values)
11
+ KIND.of?(::Float, values)
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Hash
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Hash; end
8
+
9
+ def value_or_empty(arg)
10
+ KIND.value(self, arg, Empty::HASH)
11
+ end
12
+ end
13
+
14
+ def self.Hash?(*values)
15
+ KIND.of?(::Hash, values)
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Integer
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Integer; end
8
+ end
9
+
10
+ def self.Integer?(*values)
11
+ KIND.of?(::Integer, values)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module IO
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::IO; end
8
+ end
9
+
10
+ def self.IO?(*values)
11
+ KIND.of?(::IO, values)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Method
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Method; end
8
+ end
9
+
10
+ def self.Method?(*values)
11
+ KIND.of?(::Method, values)
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Module
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Module; end
8
+
9
+ def ===(value)
10
+ Kind.of_module?(value)
11
+ end
12
+ end
13
+
14
+ def self.Module?(*values)
15
+ KIND.of?(::Kind::Module, values)
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Numeric
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Numeric; end
8
+ end
9
+
10
+ def self.Numeric?(*values)
11
+ KIND.of?(::Numeric, values)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Proc
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Proc; end
8
+ end
9
+
10
+ def self.Proc?(*values)
11
+ KIND.of?(::Proc, values)
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Queue
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Queue; end
8
+ def name; 'Queue'; end
9
+ end
10
+
11
+ def self.Queue?(*values)
12
+ KIND.of?(::Queue, values)
13
+ end
14
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Range
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Range; end
8
+ end
9
+
10
+ def self.Range?(*values)
11
+ KIND.of?(::Range, values)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Regexp
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Regexp; end
8
+ end
9
+
10
+ def self.Regexp?(*values)
11
+ KIND.of?(::Regexp, values)
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module String
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::String; end
8
+
9
+ def value_or_empty(arg)
10
+ KIND.value(self, arg, Empty::STRING)
11
+ end
12
+ end
13
+
14
+ def self.String?(*values)
15
+ KIND.of?(::String, values)
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Struct
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Struct; end
8
+ end
9
+
10
+ def self.Struct?(*values)
11
+ KIND.of?(::Struct, values)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Symbol
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Symbol; end
8
+ end
9
+
10
+ def self.Symbol?(*values)
11
+ KIND.of?(::Symbol, values)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Time
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Time; end
8
+ end
9
+
10
+ def self.Time?(*values)
11
+ KIND.of?(::Time, values)
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module OpenStruct
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::OpenStruct; end
8
+ end
9
+
10
+ def self.OpenStruct?(*values)
11
+ KIND.of?(::OpenStruct, values)
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kind
4
+ module Set
5
+ extend self, TypeChecker
6
+
7
+ def kind; ::Set; end
8
+
9
+ def value_or_empty(arg)
10
+ KIND.value(self, arg, Empty::SET)
11
+ end
12
+ end
13
+
14
+ def self.Set?(*values)
15
+ KIND.of?(::Set, values)
16
+ end
17
+ end