kind 0.2.0 → 0.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 (5) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -0
  3. data/lib/kind.rb +111 -88
  4. data/lib/kind/version.rb +1 -1
  5. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9b572e02668d3a89864333fad8605a280f3bb09f5de9c0db9800bdc956632b78
4
- data.tar.gz: 643847caaa8791c0bb5f4304f9e14135e853fb9763c53f92d7c3760c5d384be5
3
+ metadata.gz: d0f8c5e797f181f52a5c27fec17d22c4569c6c9c7ada6bc0d374d64ec0d33142
4
+ data.tar.gz: 5fca4d34a15a049d57c1c9fb86b6de672309a581b21f3ace634063edcceadc5f
5
5
  SHA512:
6
- metadata.gz: c8d9057024bb9c8dd10f69946e5fcf0027f07a848dd16772bcb81dd2d9eeff12f026fe3600808c24bcf60126274d27a170ee32ab37f73f7fdaa26377e2aa1704
7
- data.tar.gz: d4872142369aadb04b2679bc1bf8bb6b690ea19b9a7208dc9b0cb3f25c32f275981479d7847e0fe884bbb3c43c1da748c40ecd47e8833ff4052848514f3fcf1c
6
+ metadata.gz: 37a4923bdde1c6cc3e5921c7090e69d50ed8405e9a3783e877e175aa853da8250c68bee76c851c8e1297e8704d1ce4a396cbc6ffea4f1a91a03c032f68fe3a87
7
+ data.tar.gz: 9bdbae7d4b146af928c944a7e935e612964c9c629101aaf72a163391cff62859d85c796b1612a6c2e9ab7544c411bcfcdc93e5ed616ec3dc6ac605eadbc53c5c
data/README.md CHANGED
@@ -113,6 +113,7 @@ Kind.of.Hash.class?(Hash)
113
113
  # true
114
114
 
115
115
  Kind.of.Hash.class?(ActiveSupport::HashWithIndifferentAccess)
116
+ # true
116
117
  ```
117
118
 
118
119
  ## Built-in type checkers
@@ -9,141 +9,113 @@ module Kind
9
9
  end
10
10
  end
11
11
 
12
- module Of
13
- def self.call(klass, object)
14
- return object if object.is_a?(klass)
12
+ module Is
13
+ def self.call(expected, value)
14
+ expected_mod = Kind::Of.Module(expected)
15
+ mod = Kind::Of.Module(value)
15
16
 
16
- raise Kind::Error.new(klass, object)
17
+ mod <= expected_mod || false
17
18
  end
18
19
 
19
- def self.Class(object)
20
- self.call(::Class, object)
20
+ def self.Class(value)
21
+ value.is_a?(::Class)
21
22
  end
22
23
 
23
- def self.Module(object)
24
- self.call(::Module, object)
24
+ def self.Module(value)
25
+ value == ::Module || (value.is_a?(::Module) && !self.Class(value))
25
26
  end
27
+ end
26
28
 
27
- def self.Boolean(object = nil)
28
- return Kind::Of::Boolean if object.nil?
29
-
30
- return object if object.is_a?(::TrueClass) || object.is_a?(::FalseClass)
29
+ class Checker
30
+ attr_reader :type
31
31
 
32
- raise Kind::Error.new('Boolean'.freeze, object)
32
+ def initialize(type)
33
+ @type = type
33
34
  end
34
35
 
35
- module Boolean
36
- def self.class?(value)
37
- Kind.is.Boolean(value)
38
- end
39
-
40
- def self.instance?(value)
41
- value.is_a?(TrueClass) || value.is_a?(FalseClass)
42
- end
36
+ def class?(value)
37
+ Kind::Is.call(@type, value)
38
+ end
43
39
 
44
- def self.or_nil(value)
45
- return value if instance?(value)
46
- end
40
+ def instance?(value)
41
+ value.is_a?(@type)
47
42
  end
48
43
 
49
- def self.Lambda(object = nil)
50
- return Kind::Of::Lambda if object.nil?
44
+ def or_nil(value)
45
+ return value if instance?(value)
46
+ end
47
+ end
51
48
 
52
- return object if object.is_a?(::Proc) && object.lambda?
49
+ module Of
50
+ def self.call(klass, object)
51
+ return object if object.is_a?(klass)
53
52
 
54
- raise Kind::Error.new('Lambda'.freeze, object)
53
+ raise Kind::Error.new(klass, object)
55
54
  end
56
55
 
57
- module Lambda
58
- def self.class?(value)
59
- Kind.is.Proc(value)
60
- end
56
+ def self.Class(object = nil)
57
+ return Class if object.nil?
61
58
 
62
- def self.instance?(value)
63
- value.is_a?(::Proc) && value.lambda?
64
- end
59
+ self.call(::Class, object)
60
+ end
65
61
 
66
- def self.or_nil(value)
67
- return value if instance?(value)
62
+ const_set(:Class, ::Class.new(Checker) do
63
+ def instance?(value)
64
+ Kind::Is.Class(value)
68
65
  end
69
- end
70
- end
71
66
 
72
- module Is
73
- def self.call(expected, value)
74
- expected_klass, klass = Kind.of.Module(expected), Kind.of.Module(value)
67
+ alias class? instance?
68
+ end.new(::Class).freeze)
75
69
 
76
- klass <= expected_klass || false
77
- end
70
+ def self.Module(object = nil)
71
+ return Module if object.nil?
78
72
 
79
- def self.Class(value)
80
- value.is_a?(::Class)
73
+ self.call(::Module, object)
81
74
  end
82
75
 
83
- def self.Module(value)
84
- value == Module || (value.is_a?(::Module) && !self.Class(value))
85
- end
76
+ const_set(:Module, ::Class.new(Checker) do
77
+ def instance?(value)
78
+ Kind::Is.Module(value)
79
+ end
86
80
 
87
- def self.Boolean(value)
88
- klass = Kind.of.Class(value)
89
- klass <= TrueClass || klass <= FalseClass
90
- end
81
+ alias class? instance?
82
+ end.new(::Module).freeze)
91
83
  end
92
84
 
93
- def self.of; Of; end
94
- def self.is; Is; end
95
-
96
85
  module Types
97
86
  extend self
98
87
 
99
88
  KIND_OF = <<-RUBY
100
- def self.%{klass}(object = nil)
101
- return Kind::Of::%{klass} if object.nil?
89
+ def self.%{name}(object = nil)
90
+ return Kind::Of::%{name} if object.nil?
102
91
 
103
- Kind::Of.call(::%{klass}, object)
92
+ Kind::Of.call(::%{name}, object)
104
93
  end
105
94
  RUBY
106
95
 
107
96
  KIND_IS = <<-RUBY
108
- def self.%{klass}(value)
109
- Kind::Is.call(::%{klass}, value)
97
+ def self.%{name}(value)
98
+ Kind::Is.call(::%{name}, value)
110
99
  end
111
100
  RUBY
112
101
 
113
- KIND_OF_MODULE = <<-RUBY
114
- def self.class?(value)
115
- Kind::Is.call(::%{klass}, value)
116
- end
102
+ private_constant :KIND_OF, :KIND_IS
117
103
 
118
- def self.instance?(value)
119
- value.is_a?(::%{klass})
120
- end
104
+ def add(mod)
105
+ name = Kind.of.Module(mod).name
121
106
 
122
- def self.or_nil(value)
123
- return value if instance?(value)
107
+ unless Of.respond_to?(name)
108
+ Of.instance_eval(KIND_OF % { name: name })
109
+ Of.const_set(name, Checker.new(mod).freeze)
124
110
  end
125
- RUBY
126
-
127
- private_constant :KIND_OF, :KIND_IS, :KIND_OF_MODULE
128
111
 
129
- def add(klass)
130
- klass_name = Kind.of.Module(klass).name
131
-
132
- return if Of.respond_to?(klass_name)
133
-
134
- Of.instance_eval(KIND_OF % { klass: klass_name })
135
-
136
- type_module = Module.new
137
- type_module.instance_eval(KIND_OF_MODULE % { klass: klass_name })
138
-
139
- Of.const_set(klass_name, type_module)
140
-
141
- return if Is.respond_to?(klass_name)
142
-
143
- Is.instance_eval(KIND_IS % { klass: klass_name })
112
+ Is.instance_eval(KIND_IS % { name: name }) unless Is.respond_to?(name)
144
113
  end
145
114
  end
146
115
 
116
+ def self.is; Is; end
117
+ def self.of; Of; end
118
+
147
119
  # Classes
148
120
  [
149
121
  String, Symbol, Numeric, Integer, Float, Regexp, Time,
@@ -156,4 +128,55 @@ module Kind
156
128
  [
157
129
  Enumerable, Comparable
158
130
  ].each { |klass| Types.add(klass) }
131
+
132
+ # --------------------- #
133
+ # Special type checkers #
134
+ # --------------------- #
135
+
136
+ module Is
137
+ def self.Boolean(value)
138
+ klass = Kind.of.Class(value)
139
+ klass <= TrueClass || klass <= FalseClass
140
+ end
141
+ end
142
+
143
+ module Of
144
+ # -- Boolean
145
+
146
+ def self.Boolean(object = nil)
147
+ return Kind::Of::Boolean if object.nil?
148
+
149
+ return object if object.is_a?(::TrueClass) || object.is_a?(::FalseClass)
150
+
151
+ raise Kind::Error.new('Boolean'.freeze, object)
152
+ end
153
+
154
+ const_set(:Boolean, ::Class.new(Checker) do
155
+ def class?(value)
156
+ Kind.is.Boolean(value)
157
+ end
158
+
159
+ def instance?(value)
160
+ value.is_a?(TrueClass) || value.is_a?(FalseClass)
161
+ end
162
+ end.new([TrueClass, FalseClass].freeze).freeze)
163
+
164
+ # -- Lambda
165
+
166
+ def self.Lambda(object = nil)
167
+ return Kind::Of::Lambda if object.nil?
168
+
169
+ return object if object.is_a?(::Proc) && object.lambda?
170
+
171
+ raise Kind::Error.new('Lambda'.freeze, object)
172
+ end
173
+
174
+ const_set(:Lambda, ::Class.new(Checker) do
175
+ def instance?(value)
176
+ value.is_a?(::Proc) && value.lambda?
177
+ end
178
+ end.new(::Proc).freeze)
179
+ end
180
+
181
+ private_constant :Checker
159
182
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Kind
4
- VERSION = '0.2.0'
4
+ VERSION = '0.3.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: 0.2.0
4
+ version: 0.3.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: 2020-01-02 00:00:00.000000000 Z
11
+ date: 2020-01-03 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Basic type system for Ruby.
14
14
  email: