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.
- checksums.yaml +4 -4
- data/README.md +1 -0
- data/lib/kind.rb +111 -88
- data/lib/kind/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d0f8c5e797f181f52a5c27fec17d22c4569c6c9c7ada6bc0d374d64ec0d33142
|
4
|
+
data.tar.gz: 5fca4d34a15a049d57c1c9fb86b6de672309a581b21f3ace634063edcceadc5f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 37a4923bdde1c6cc3e5921c7090e69d50ed8405e9a3783e877e175aa853da8250c68bee76c851c8e1297e8704d1ce4a396cbc6ffea4f1a91a03c032f68fe3a87
|
7
|
+
data.tar.gz: 9bdbae7d4b146af928c944a7e935e612964c9c629101aaf72a163391cff62859d85c796b1612a6c2e9ab7544c411bcfcdc93e5ed616ec3dc6ac605eadbc53c5c
|
data/README.md
CHANGED
data/lib/kind.rb
CHANGED
@@ -9,141 +9,113 @@ module Kind
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
module
|
13
|
-
def self.call(
|
14
|
-
|
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
|
-
|
17
|
+
mod <= expected_mod || false
|
17
18
|
end
|
18
19
|
|
19
|
-
def self.Class(
|
20
|
-
|
20
|
+
def self.Class(value)
|
21
|
+
value.is_a?(::Class)
|
21
22
|
end
|
22
23
|
|
23
|
-
def self.Module(
|
24
|
-
|
24
|
+
def self.Module(value)
|
25
|
+
value == ::Module || (value.is_a?(::Module) && !self.Class(value))
|
25
26
|
end
|
27
|
+
end
|
26
28
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
return object if object.is_a?(::TrueClass) || object.is_a?(::FalseClass)
|
29
|
+
class Checker
|
30
|
+
attr_reader :type
|
31
31
|
|
32
|
-
|
32
|
+
def initialize(type)
|
33
|
+
@type = type
|
33
34
|
end
|
34
35
|
|
35
|
-
|
36
|
-
|
37
|
-
|
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
|
-
|
45
|
-
|
46
|
-
end
|
40
|
+
def instance?(value)
|
41
|
+
value.is_a?(@type)
|
47
42
|
end
|
48
43
|
|
49
|
-
def
|
50
|
-
return
|
44
|
+
def or_nil(value)
|
45
|
+
return value if instance?(value)
|
46
|
+
end
|
47
|
+
end
|
51
48
|
|
52
|
-
|
49
|
+
module Of
|
50
|
+
def self.call(klass, object)
|
51
|
+
return object if object.is_a?(klass)
|
53
52
|
|
54
|
-
raise Kind::Error.new(
|
53
|
+
raise Kind::Error.new(klass, object)
|
55
54
|
end
|
56
55
|
|
57
|
-
|
58
|
-
|
59
|
-
Kind.is.Proc(value)
|
60
|
-
end
|
56
|
+
def self.Class(object = nil)
|
57
|
+
return Class if object.nil?
|
61
58
|
|
62
|
-
|
63
|
-
|
64
|
-
end
|
59
|
+
self.call(::Class, object)
|
60
|
+
end
|
65
61
|
|
66
|
-
|
67
|
-
|
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
|
-
|
73
|
-
|
74
|
-
expected_klass, klass = Kind.of.Module(expected), Kind.of.Module(value)
|
67
|
+
alias class? instance?
|
68
|
+
end.new(::Class).freeze)
|
75
69
|
|
76
|
-
|
77
|
-
|
70
|
+
def self.Module(object = nil)
|
71
|
+
return Module if object.nil?
|
78
72
|
|
79
|
-
|
80
|
-
value.is_a?(::Class)
|
73
|
+
self.call(::Module, object)
|
81
74
|
end
|
82
75
|
|
83
|
-
|
84
|
-
|
85
|
-
|
76
|
+
const_set(:Module, ::Class.new(Checker) do
|
77
|
+
def instance?(value)
|
78
|
+
Kind::Is.Module(value)
|
79
|
+
end
|
86
80
|
|
87
|
-
|
88
|
-
|
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.%{
|
101
|
-
return Kind::Of::%{
|
89
|
+
def self.%{name}(object = nil)
|
90
|
+
return Kind::Of::%{name} if object.nil?
|
102
91
|
|
103
|
-
Kind::Of.call(::%{
|
92
|
+
Kind::Of.call(::%{name}, object)
|
104
93
|
end
|
105
94
|
RUBY
|
106
95
|
|
107
96
|
KIND_IS = <<-RUBY
|
108
|
-
def self.%{
|
109
|
-
Kind::Is.call(::%{
|
97
|
+
def self.%{name}(value)
|
98
|
+
Kind::Is.call(::%{name}, value)
|
110
99
|
end
|
111
100
|
RUBY
|
112
101
|
|
113
|
-
|
114
|
-
def self.class?(value)
|
115
|
-
Kind::Is.call(::%{klass}, value)
|
116
|
-
end
|
102
|
+
private_constant :KIND_OF, :KIND_IS
|
117
103
|
|
118
|
-
|
119
|
-
|
120
|
-
end
|
104
|
+
def add(mod)
|
105
|
+
name = Kind.of.Module(mod).name
|
121
106
|
|
122
|
-
|
123
|
-
|
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
|
-
|
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
|
data/lib/kind/version.rb
CHANGED
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.
|
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-
|
11
|
+
date: 2020-01-03 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Basic type system for Ruby.
|
14
14
|
email:
|