/
NSNumber+Nu.m
113 lines (105 loc) · 2.9 KB
/
NSNumber+Nu.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
//
// NSNumber+Nu.m
// Nu
//
// Created by Tim Burks on 4/24/16.
//
//
#import "NSNumber+Nu.h"
#import "NuInternals.h"
#import "NuBlock.h"
#import "NuCell.h"
@implementation NSNumber(Nu)
- (id) times:(id) block
{
if (nu_objectIsKindOfClass(block, [NuBlock class])) {
id args = [[NuCell alloc] init];
int x = [self intValue];
int i;
for (i = 0; i < x; i++) {
@try
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[args setCar:[NSNumber numberWithInt:i]];
[block evalWithArguments:args context:Nu__null];
[pool release];
}
@catch (NuBreakException *exception) {
break;
}
@catch (NuContinueException *exception) {
// do nothing, just continue with the next loop iteration
}
@catch (id exception) {
@throw(exception);
}
}
[args release];
}
return self;
}
- (id) downTo:(id) number do:(id) block
{
int startValue = [self intValue];
int finalValue = [number intValue];
if (startValue < finalValue) {
return self;
}
else {
id args = [[NuCell alloc] init];
if (nu_objectIsKindOfClass(block, [NuBlock class])) {
int i;
for (i = startValue; i >= finalValue; i--) {
@try
{
[args setCar:[NSNumber numberWithInt:i]];
[block evalWithArguments:args context:Nu__null];
}
@catch (NuBreakException *exception) {
break;
}
@catch (NuContinueException *exception) {
// do nothing, just continue with the next loop iteration
}
@catch (id exception) {
@throw(exception);
}
}
}
[args release];
}
return self;
}
- (id) upTo:(id) number do:(id) block
{
int startValue = [self intValue];
int finalValue = [number intValue];
id args = [[NuCell alloc] init];
if (nu_objectIsKindOfClass(block, [NuBlock class])) {
int i;
for (i = startValue; i <= finalValue; i++) {
@try
{
[args setCar:[NSNumber numberWithInt:i]];
[block evalWithArguments:args context:Nu__null];
}
@catch (NuBreakException *exception) {
break;
}
@catch (NuContinueException *exception) {
// do nothing, just continue with the next loop iteration
}
@catch (id exception) {
@throw(exception);
}
}
}
[args release];
return self;
}
- (NSString *) hexValue
{
int x = [self intValue];
return [NSString stringWithFormat:@"0x%x", x];
}
@end