kind 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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: