Skip to content

Commit f83fcb0

Browse files
committed
feat: added RangeOf type
1 parent 3a13562 commit f83fcb0

File tree

3 files changed

+43
-0
lines changed

3 files changed

+43
-0
lines changed

README.md

+9
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,15 @@ sig name: T.RespondTo(:to_s)
9292
def create(name:); end
9393
```
9494
95+
#### `RangeOf`
96+
97+
Value **MUST** be a Range of the given type
98+
99+
```ruby
100+
sig name: T.RangeOf(Integer)
101+
def create(name: 1...2); end
102+
```
103+
95104
#### `Any`
96105
97106
Value **MUST** be any of the given list of values, that is, the value must be one of the given list.

lib/delivered/types.rb

+16
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,21 @@ def ===(value)
1313
end
1414
end
1515

16+
class RangeOfType
17+
def initialize(type)
18+
@type = type
19+
end
20+
21+
def inspect = "Range(#{@type&.inspect})"
22+
23+
def ===(value)
24+
Range === value && (
25+
(@type === value.begin && (nil === value.end || @type === value.end)) ||
26+
(@type === value.end && nil === value.begin)
27+
)
28+
end
29+
end
30+
1631
class RespondToType
1732
def initialize(*methods)
1833
@methods = methods
@@ -53,6 +68,7 @@ module Types
5368
module_function
5469

5570
def Nilable(type = nil) = NilableType.new(type)
71+
def RangeOf(type = nil) = RangeOfType.new(type)
5672
def RespondTo(*methods) = RespondToType.new(*methods)
5773
def Any(*types) = AnyType.new(*types)
5874
def Boolean = BooleanType.new

test/delivered/types.rb

+18
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,24 @@
4343
end
4444
end
4545

46+
describe 'RangeOf' do
47+
it 'should be a Range of given type' do
48+
assert T.RangeOf(Integer) === (1..2)
49+
assert T.RangeOf(Integer) === (..2)
50+
assert T.RangeOf(Integer) === (1..)
51+
end
52+
53+
it 'raises when not a Range' do
54+
expect { 1 => ^(T.RangeOf(Integer)) }.to raise_exception NoMatchingPatternError
55+
end
56+
57+
it 'raises when not a Range of given type' do
58+
expect { 1..2 => ^(T.RangeOf(String)) }.to raise_exception NoMatchingPatternError
59+
expect { 1.. => ^(T.RangeOf(String)) }.to raise_exception NoMatchingPatternError
60+
expect { ..2 => ^(T.RangeOf(String)) }.to raise_exception NoMatchingPatternError
61+
end
62+
end
63+
4664
describe 'Boolean' do
4765
it 'should be true or false' do
4866
assert T.Boolean === true

0 commit comments

Comments
 (0)