kind 3.0.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.tool-versions +1 -0
  3. data/.travis.sh +37 -12
  4. data/.travis.yml +6 -5
  5. data/CHANGELOG.md +1295 -0
  6. data/Gemfile +10 -2
  7. data/README.md +985 -490
  8. data/lib/kind.rb +35 -287
  9. data/lib/kind/active_model/kind_validator.rb +20 -13
  10. data/lib/kind/core.rb +8 -0
  11. data/lib/kind/core/kind.rb +61 -0
  12. data/lib/kind/core/undefined.rb +7 -0
  13. data/lib/kind/dig.rb +40 -0
  14. data/lib/kind/empty.rb +4 -12
  15. data/lib/kind/empty/constant.rb +7 -0
  16. data/lib/kind/error.rb +2 -6
  17. data/lib/kind/maybe.rb +14 -153
  18. data/lib/kind/maybe/none.rb +57 -0
  19. data/lib/kind/maybe/result.rb +51 -0
  20. data/lib/kind/maybe/some.rb +90 -0
  21. data/lib/kind/maybe/typed.rb +29 -0
  22. data/lib/kind/maybe/wrappable.rb +33 -0
  23. data/lib/kind/presence.rb +33 -0
  24. data/lib/kind/try.rb +34 -0
  25. data/lib/kind/type_checker.rb +87 -0
  26. data/lib/kind/type_checkers.rb +30 -0
  27. data/lib/kind/type_checkers/core/array.rb +17 -0
  28. data/lib/kind/type_checkers/core/class.rb +13 -0
  29. data/lib/kind/type_checkers/core/comparable.rb +13 -0
  30. data/lib/kind/type_checkers/core/enumerable.rb +13 -0
  31. data/lib/kind/type_checkers/core/enumerator.rb +13 -0
  32. data/lib/kind/type_checkers/core/file.rb +13 -0
  33. data/lib/kind/type_checkers/core/float.rb +13 -0
  34. data/lib/kind/type_checkers/core/hash.rb +17 -0
  35. data/lib/kind/type_checkers/core/integer.rb +13 -0
  36. data/lib/kind/type_checkers/core/io.rb +13 -0
  37. data/lib/kind/type_checkers/core/method.rb +13 -0
  38. data/lib/kind/type_checkers/core/module.rb +17 -0
  39. data/lib/kind/type_checkers/core/numeric.rb +13 -0
  40. data/lib/kind/type_checkers/core/proc.rb +13 -0
  41. data/lib/kind/type_checkers/core/queue.rb +14 -0
  42. data/lib/kind/type_checkers/core/range.rb +13 -0
  43. data/lib/kind/type_checkers/core/regexp.rb +13 -0
  44. data/lib/kind/type_checkers/core/string.rb +17 -0
  45. data/lib/kind/type_checkers/core/struct.rb +13 -0
  46. data/lib/kind/type_checkers/core/symbol.rb +13 -0
  47. data/lib/kind/type_checkers/core/time.rb +13 -0
  48. data/lib/kind/type_checkers/custom/boolean.rb +19 -0
  49. data/lib/kind/type_checkers/custom/callable.rb +19 -0
  50. data/lib/kind/type_checkers/custom/lambda.rb +19 -0
  51. data/lib/kind/type_checkers/stdlib/open_struct.rb +13 -0
  52. data/lib/kind/type_checkers/stdlib/set.rb +17 -0
  53. data/lib/kind/undefined.rb +4 -2
  54. data/lib/kind/validator.rb +1 -1
  55. data/lib/kind/version.rb +1 -1
  56. data/test.sh +4 -4
  57. metadata +45 -9
  58. data/lib/kind/checker.rb +0 -15
  59. data/lib/kind/checker/factory.rb +0 -35
  60. data/lib/kind/checker/protocol.rb +0 -73
  61. data/lib/kind/is.rb +0 -19
  62. data/lib/kind/of.rb +0 -11
  63. data/lib/kind/types.rb +0 -115
data/lib/kind/is.rb DELETED
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module Is
5
- def self.call(expected, object)
6
- __call__(Kind::Of.Module(expected), object)
7
- end
8
-
9
- def self.__call__(expected_kind, object)
10
- kind = Kind::Of.Module(object)
11
-
12
- if kind.is_a?(Class)
13
- kind <= expected_kind || false
14
- else
15
- kind == expected_kind || kind.is_a?(expected_kind)
16
- end
17
- end
18
- end
19
- end
data/lib/kind/of.rb DELETED
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kind
4
- module Of
5
- def self.call(kind, object, kind_name = nil)
6
- return object if kind === object
7
-
8
- raise Kind::Error.new(kind_name || kind.name, object)
9
- end
10
- end
11
- end
data/lib/kind/types.rb DELETED
@@ -1,115 +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
- default = options[:or]
12
-
13
- return Kind::Of::%{kind_name} if Undefined == object && default.nil?
14
-
15
- is_instance = Kind::Of::%{kind_name}.__is_instance__(object)
16
-
17
- return object if is_instance
18
-
19
- Kind::Of.(::%{kind_name_to_check}, object && default ? default : object || default)
20
- end
21
- RUBY
22
-
23
- KIND_OF_IS = <<-RUBY
24
- def self.%{method_name}?(*args)
25
- Kind::Of::%{kind_name}.instance?(*args)
26
- end
27
- RUBY
28
-
29
- KIND_IS = <<-RUBY
30
- def self.%{method_name}(value = Undefined)
31
- return Kind::Is::%{kind_name} if Undefined == value
32
-
33
- Kind::Is.__call__(::%{kind_name_to_check}, value)
34
- end
35
- RUBY
36
-
37
- private_constant :KIND_OF, :KIND_IS, :COLONS
38
-
39
- def add(kind, name: nil)
40
- kind_name = Kind.of.Module(kind).name
41
- checker = name ? Kind::Of.(String, name) : kind_name
42
-
43
- if checker.include?(COLONS)
44
- add_kind_with_namespace(checker, method_name: name)
45
- else
46
- add_root(checker, kind_name, method_name: name,
47
- kind_name_to_check: kind_name,
48
- create_kind_is_mod: false)
49
- end
50
- end
51
-
52
- private
53
-
54
- def add_root(checker, kind_name, method_name:, create_kind_is_mod:, kind_name_to_check: nil)
55
- root_kind_name = method_name ? method_name : kind_name
56
-
57
- params = {
58
- method_name: method_name ? method_name : checker,
59
- kind_name: method_name ? method_name : kind_name,
60
- kind_name_to_check: kind_name_to_check || root_kind_name
61
- }
62
-
63
- add_kind(params, Kind::Of, Kind::Is, create_kind_is_mod)
64
- end
65
-
66
- def add_kind_with_namespace(checker, method_name:)
67
- raise NotImplementedError if method_name
68
-
69
- const_names = checker.split(COLONS)
70
- const_names.each_with_index do |const_name, index|
71
- if index == 0
72
- add_root(const_name, const_name, method_name: nil, create_kind_is_mod: true)
73
- else
74
- add_node(const_names, index)
75
- end
76
- end
77
- end
78
-
79
- def add_node(const_names, index)
80
- namespace = const_names[0..(index-1)]
81
- namespace_name = namespace.join(COLONS)
82
-
83
- kind_of_mod = Kind::Of.const_get(namespace_name)
84
- kind_is_mod = Kind::Is.const_get(namespace_name)
85
-
86
- checker = const_names[index]
87
- kind_name = const_names[0..index].join(COLONS)
88
-
89
- params = { method_name: checker, kind_name: kind_name }
90
-
91
- add_kind(params, kind_of_mod, kind_is_mod, true)
92
- end
93
-
94
- def add_kind(params, kind_of_mod, kind_is_mod, create_kind_is_mod)
95
- method_name = params[:method_name]
96
-
97
- unless kind_of_mod.respond_to?(method_name)
98
- kind_name = params[:kind_name]
99
- params[:kind_name_to_check] ||= kind_name
100
-
101
- kind_checker = ::Module.new { extend Checker::Protocol }
102
- kind_checker.module_eval("def self.__kind; #{params[:kind_name_to_check]}; end")
103
-
104
- kind_of_mod.instance_eval(KIND_OF % params)
105
- kind_of_mod.const_set(method_name, kind_checker)
106
- kind_of_mod.instance_eval(KIND_OF_IS % params)
107
- end
108
-
109
- unless kind_is_mod.respond_to?(method_name)
110
- kind_is_mod.instance_eval(KIND_IS % params)
111
- kind_is_mod.const_set(method_name, Module.new) if create_kind_is_mod
112
- end
113
- end
114
- end
115
- end