Skip to content

Commit e176b02

Browse files
committed
closer to making work
1 parent ca7d597 commit e176b02

File tree

11 files changed

+147
-61
lines changed

11 files changed

+147
-61
lines changed

PLATFORM/C/LIB/collections.lsts

Lines changed: 67 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,20 @@
22
interface Collection<t> {
33
let .length(self: Collection<t>): U64;
44
let $"[]"(self: Collection<t>, idx: U64): t;
5-
};
5+
}
66

77
interface Iterator<t> {
88
let .next(self: Iterator<t>[]): Maybe<t>;
9-
};
9+
}
1010

1111
interface Iterable<t> {
1212
let .iter(self: Iterable<t>): Iterator<t>;
1313
let .unsafe-iter(self: Iterable<t>): Iterator<t>;
14-
};
14+
}
1515

1616
interface IteratorRemaining {
1717
let .remaining(self: IteratorRemaining+Iterator<t>): U64;
18-
};
18+
}
1919

2020
let remaining-or-zero(from: Iterator<t>): U64 = (
2121
0
@@ -61,7 +61,13 @@ let .skip(self: Iterator<t>, num: U64): Iterator<t> = (
6161
self
6262
);
6363

64-
type RangeIter = RangeIter { let i: U64, len: U64, step: U64 };
64+
type RangeIter = RangeIter { i: U64, len: U64, step: U64 };
65+
type RangeIter => Iterable<U64>;
66+
type RangeIter => IteratorRemaining;
67+
68+
let .remaining(self: RangeIter): U64 = (
69+
(self.len - self.i) / self.step
70+
);
6571

6672
let .next(vp: RangeIter[]): Maybe<U64> = (
6773
let v = open(vp);
@@ -85,6 +91,12 @@ let range(len: U64): RangeIter = (
8591
);
8692

8793
type SkipIterator<i+Iterator<t>> = SkipIterator { ii: i, to_skip: U64 };
94+
type SkipIterator<i+Iterator<t>> => Iterator<t>;
95+
type SkipIterator<i+Iterator<t>+IteratorRemaining> => IteratorRemaining;
96+
97+
let .remaining(self: SkipIterator<i+Iterator<t>+IteratorRemaining>): U64 = (
98+
self.ii.remaining() - self.to_skip
99+
);
88100

89101
let .skip(iter: i+Iterator<t>, amount: U64): SkipIterator<i> = (
90102
SkipIterator { iter.ii, iter.to_skip + amount }
@@ -102,6 +114,12 @@ let .next(vp: SkipIterator<i+Iterator<t>>[]): Maybe<t> = (
102114
);
103115

104116
type LimitIterator<i+Iterator<t>> = LimitIterator { ii: i, idx: U64, limit: U64 };
117+
type LimitIterator<Iterator<t>> => Iterator<t>;
118+
type LimitIterator<Iterator<t>> => IteratorRemaining;
119+
120+
let .remaining(self: LimitIterator<t>): U64 = (
121+
self.limit - self.idx
122+
);
105123

106124
let .next(vp: LimitIterator<i+Iterator<t>>[]): Maybe<t> = (
107125
let v = open(vp);
@@ -121,6 +139,12 @@ let .limit(iter: i+Iterator<t>, amount: U64): LimitIterator<i> = (
121139
);
122140

123141
type ZipIterator<ai+Iterator<at>, bi+Iterator<bt>> = ZipIterator { aii: ai, bii: bi };
142+
type ZipIterator<Iterator<at>, Iterator<bt>> => Iterator<Tuple<at,bt>>;
143+
type ZipIterator<Iterator<at>+IteratorRemaining, Iterator<bt>+IteratorRemaining> => IteratorRemaining;
144+
145+
let .remaining(self: ZipIterator<Iterator<at>+IteratorRemaining, Iterator<bt>+IteratorRemaining>): U64 = (
146+
min(self.aii.remaining(), self.bii.remaining())
147+
);
124148

125149
let .next(p: ZipIterator<ai+Iterator<at>, bi+Iterator<bt>>[]): Maybe<Tuple<at,bt>> = (
126150
let v = open(p);
@@ -138,13 +162,19 @@ let .next(p: ZipIterator<ai+Iterator<at>, bi+Iterator<bt>>[]): Maybe<Tuple<at,bt
138162
res
139163
);
140164

141-
let .zip(ai+Iterator<at>, bi+Iterator<bt>): ZipIterator<ai,bi> = (
165+
let .zip(ai: Iterator<at>, bi: Iterator<bt>): ZipIterator<ai,bi> = (
142166
ZipIterator { ai, bi }
143167
);
144168

145169
type EnumerateIterator<i+Iterator<t>> = EnumerateIterator { ii: i, idx: U64 };
170+
type EnumerateIterator<Iterator<t>> => Iterator<Tuple<U64,t>>;
171+
type EnumerateIterator<Iterator<t>+IteratorRemaining> => IteratorRemaining;
172+
173+
let .remaining(self: EnumerateIterator<Iterator<t>+IteratorRemaining>): U64 = (
174+
self.ii.remaining()
175+
);
146176

147-
let .next(p: EnumerateIterator<i+Iterator<t>>[]): Maybe<Tuple<U64, i>> = (
177+
let .next(p: EnumerateIterator<i+Iterator<t>>[]): Maybe<Tuple<U64, t>> = (
148178
let v = open(p);
149179
let iv = (&v.ii).next();
150180

@@ -165,10 +195,34 @@ let .next(p: EnumerateIterator<i+Iterator<t>>[]): Maybe<Tuple<U64, i>> = (
165195
res
166196
);
167197

168-
let .enumerate(i+Iterator<t>): EnumerateIterator<i> = (
198+
let .enumerate(i: Iterator<t>): EnumerateIterator<i> = (
169199
EnumerateIterator { i, 0_u64 }
170200
);
171201

202+
type CollectionIteratorBase<c+Collection<t>> = CollectionIteratorBase { coll: c, idx: U64 };
203+
type CollectionIteratorBase<c+Collection<t>> => Iterator<t>;
204+
type CollectionIteratorBase<c+Collection<t>> => IteratorRemaining;
205+
206+
let .remaining(self: CollectionIteratorBase<c+Collection<t>>): U64 = (
207+
self.coll.length() - self.idx
208+
);
209+
210+
let .skip(self: CollectionIteratorBase<c>, num: U64): CollectionIteratorBase<c> = (
211+
CollectionIteratorBase { self.coll, self.idx + num }
212+
);
213+
214+
let .next(p: CollectionIteratorBase<c+Collection<t>>[]): Maybe<t> = (
215+
let v = p[0];
216+
if v.idx < v.coll.length() {
217+
let val = v.coll[v.idx];
218+
v.idx = v.idx + 1;
219+
p[0] = v;
220+
Some { val } :: Maybe<t>
221+
} else {
222+
None :: Maybe<t>
223+
}
224+
);
225+
172226
let cmp(ls: Collection<a>, rs: Collection<b>): Ord = (
173227
let diff = Equal;
174228

@@ -199,7 +253,7 @@ let .contains(self: Iterable<t>, value: t): U64 = (
199253
ok
200254
);
201255

202-
# TODO: generic Collection<t> impl for Iterable<t>
256+
# TODO: generic Collection<t> impl for Iterable<t> ?
203257

204258
let .has-prefix-at(self: Iterable<t>, off: U64, seq: Iterable<t>): Bool = (
205259
if (self.length() - off) < seq.length() {
@@ -369,7 +423,7 @@ let .collect(x: Iterator<t>): Vector<t> = (
369423

370424
type SplitWithIndentIter<t,sp,uv,dv> = SplitWithIndentIter { data: Vector<t>, split: sp, up: Vector<uv>, down: Vector<dv> };
371425

372-
let .next(vp: SplitWithIndentIter<t,sp,uv,dv>[]): Maybe<Vector<t>> => (
426+
let .next(vp: SplitWithIndentIter<t,sp,uv,dv>[]): Maybe<Vector<t>> = (
373427
let v = open(vp);
374428

375429
if v.data.length() > 0 {
@@ -424,7 +478,7 @@ let .repeat(self: Iterable<t>, times: U64): Vector<t> = (
424478
while times > 0 {
425479
for x in self {
426480
out = out.push(x);
427-
}
481+
};
428482
times = times - 1;
429483
};
430484
out
@@ -489,3 +543,5 @@ let .pad-right(self: Iterable<t>, value: t, minlen: U64): Vector<t> = (
489543

490544
out
491545
);
546+
547+
# TODO: OnceIterable (from iterator)

PLATFORM/C/LIB/hashtable.lsts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
type HashtableEq<k,v> = HashtableEq { occupied: U64, capacity: U64, contents: Tuple<k,v>[] }
33
| HashtableEqEOF;
44

5+
type HashtableEq<k,v> => Iterable<Tuple<k,v>>;
6+
57
let .clone(self: HashtableEq<k,v>): HashtableEq<k,v> = (
68
match self {
79
HashtableEq { occupied=occupied } => (
@@ -23,6 +25,7 @@ let .clone(self: HashtableEq<k,v>): HashtableEq<k,v> = (
2325
);
2426

2527
type HashtableEqIter<k,v> = HashtableEqIter { table: HashtableEq<k,v>, idx: U64 };
28+
type HashtableEqIter<k,v> => Iterator<Tuple<k,v>>;
2629

2730
# for safety, we clone the table
2831
# All modifications done to the vector after creating the iterator will not be seen

PLATFORM/C/LIB/list.lsts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11

2+
type List<x> => Iterable<x>;
3+
type List<x> => Collection<x>;
4+
25
let $"[]"(tt: List<x>, idx: U64): x = (
36
while idx > 0 {
47
if not(tt.has-head()) {
@@ -19,12 +22,13 @@ let .unique(ls: List<x>): List<x> = (
1922
rs
2023
);
2124

22-
type ListIter<x> = ListIter { list: List<x> }
25+
type ListIter<x> = ListIter { list: List<x> };
26+
type ListIter<x> => Iterator<x>;
2327

2428
let .next(ls: ListIter<x>[]): Maybe<x> = (
2529
match open(ls.list) {
2630
[i.. rst] => (
27-
ls[0_u64].list = rst;
31+
ls[0].list = rst;
2832
Some(i)
2933
);
3034
[] => (None :: Maybe<x>);

PLATFORM/C/LIB/serial.lsts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,14 @@ type SerialVal = SerialUInt { val: U64 }
1010

1111
interface Serializable {
1212
let serialize(self: Serializable): SerialVal;
13-
};
13+
}
1414

1515
interface Deserializable {
1616
let deserialize(val: SerialVal, ty: Type<Deserializable>): Deserializable;
17-
};
17+
}
18+
19+
type SerialVal => Serializable;
20+
type SerialVal => Deserializable;
1821

1922
let deserialize(val: SerialVal, ty: Type<SerialVal>): SerialVal = (
2023
val
@@ -24,6 +27,9 @@ let serialize(val: SerialVal): SerialVal = (
2427
val
2528
);
2629

30+
type Bool => Serializable;
31+
type Bool => Deserializable;
32+
2733
let deserialize(vali: SerialVal, ty: Type<Bool>): Bool = (
2834
deserialize(vali,type(U64)) as Bool
2935
);
@@ -32,6 +38,9 @@ let serialize(val: Bool): SerialVal = (
3238
SerialBool { val }
3339
);
3440

41+
type U64 => Serializable;
42+
type U64 => Deserializable;
43+
3544
let deserialize(vali: SerialVal, ty: Type<U64>): U64 = (
3645
match vali {
3746
SerialBool { val=val } => ( val as U64 );
@@ -60,6 +69,9 @@ let serialize(val: U64): SerialVal = (
6069
SerialUInt { val }
6170
);
6271

72+
type I64 => Serializable;
73+
type I64 => Deserializable;
74+
6375
let deserialize(vali: SerialVal, ty: Type<I64>): I64 = (
6476
match vali {
6577
SerialBool { val=val } => ( val as I64 );
@@ -80,6 +92,9 @@ let serialize(val: I64): SerialVal = (
8092
SerialInt { val }
8193
);
8294

95+
type F64 => Serializable;
96+
type F64 => Deserializable;
97+
8398
let deserialize(vali: SerialVal, ty: Type<F64>): F64 = (
8499
match vali {
85100
SerialBool { val=val } => ( val as F64 );
@@ -95,6 +110,9 @@ let serialize(val: F64): SerialVal = (
95110
SerialFlt { val }
96111
);
97112

113+
type String => Serializable;
114+
type String => Deserializable;
115+
98116
let deserialize(vali: SerialVal, ty: Type<String>): String = (
99117
match vali {
100118
SerialStr { val=val } => ( val );
@@ -106,6 +124,9 @@ let serialize(val: String): SerialVal = (
106124
SerialStr { val }
107125
);
108126

127+
type CString => Serializable;
128+
type CString => Deserializable;
129+
109130
let deserialize(vali: SerialVal, ty: Type<CString>): CString = (
110131
match vali {
111132
SerialStr { val=val } => ( untern(val) );
@@ -117,6 +138,9 @@ let serialize(val: CString): SerialVal = (
117138
SerialStr { (to-smart-string(val)) }
118139
);
119140

141+
type Iterable<Serializable> => Serializable;
142+
type FromVector<Deserializable> => Deserializable;
143+
120144
let deserialize(vali: SerialVal, ty: Type<ot+FromVector<eltt+Deserializable>>): ot = (
121145
match vali {
122146
SerialVec { val=val } => (
@@ -138,6 +162,9 @@ let serialize(self: Iterable<t+Serializable>): SerialVal = (
138162
SerialVec { out }
139163
);
140164

165+
type HashtableEq<Serializable,Serializable> => Serializable;
166+
type HashtableEq<Deserializable,Deserializable> => Deserializable;
167+
141168
let deserialize(val: SerialVal, ty: Type<HashtableEq<k+Deserializable,v+Deserializable>>): HashtableEq<k,v> = (
142169
let out = {} :: HashtableEq<k,v>;
143170
match val {

PLATFORM/C/LIB/smart-string.lsts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,15 @@
11

2+
type SmartString => Collection<U8>;
3+
type SmartString => Iterable<U8>;
4+
5+
let .iter(self: SmartString): CollectionIteratorBase<SmartString> = (
6+
CollectionIteratorBase { self, 0 }
7+
);
8+
9+
let .unsafe-iter(self: SmartString): CollectionIteratorBase<SmartString> = (
10+
self.iter()
11+
);
12+
213
let cmp(l: CString, r: String): Ord = (
314
cmp( intern(l), r )
415
);
@@ -82,7 +93,8 @@ let .count-right-spaces(self: String): U64 = (
8293

8394
let .trim-right(self: String): String = (
8495
while self.length() > 0 && self.last().is-space() {
85-
self = self[:(self.length()-1)];
96+
let l = self.length() - 1;
97+
self = self[:l];
8698
};
8799
self
88100
);

PLATFORM/C/LIB/string.lsts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11

2+
type CString => Iterable<U8>;
3+
type CString => Collection<U8>;
4+
25
# TODO: instead do U8 iterator for S
36

47
let clone-rope(s: S): CString = (
@@ -26,6 +29,7 @@ let clone-rope-impl(s: S, out: Vector<U8>): Vector<U8> = (
2629
);
2730

2831
type CStringIter = CStringIter { ptr: CString };
32+
type CStringIter => Iterator<U8>;
2933

3034
let .next(self: CStringIter[]): U8 = (
3135
let val = open(self).ptr[0];

PLATFORM/C/LIB/u8.lsts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,5 @@ let to-smart-string(i: U8): String = (
3838
);
3939

4040
let .is-space(self: U8): U64 = (
41-
(self >= 1) && (self <= 40)) || (self == 177)
41+
((self >= 1) && (self <= 40)) || (self == 177)
4242
);

PLATFORM/C/LIB/umbra.lsts

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ type UmbraShortLong = UmbraShort { arr: U8[12] } | UmbraLong { prefix: U8[4], pt
3737

3838
type Umbra = Umbra { len: U32, backing: UmbraShortLong };
3939

40+
type Umbra => Collection<U8>;
41+
type Umbra => Iterable<U8>;
42+
4043
let .length(s: Umbra[]): U64 = (
4144
s.len as U64
4245
);
@@ -255,28 +258,11 @@ let $"+"(l: Umbra[], r: t): Umbra = (
255258
concat-to-umbra(l, r)
256259
);
257260

258-
let .iter(self: Umbra): UmbraIter = (
259-
to-umbra(self).unsafe-iter();
261+
let .iter(self: Umbra): CollectionIteratorBase<Umbra> = (
262+
to-umbra(self).unsafe-iter()
260263
);
261264

262-
let .unsafe-iter(self: Umbra): UmbraIter = (
263-
UmbraIter { self, 0 }
265+
let .unsafe-iter(self: Umbra): CollectionIteratorBase<Umbra> = (
266+
CollectionIteratorBase { self, 0 }
264267
);
265268

266-
type UmbraIter = UmbraIter { str: Umbra, idx: U64 };
267-
268-
let .skip(v: UmbraIter, amount: U64): UmbraIter = (
269-
UmbraIter { v, v.idx + amount }
270-
);
271-
272-
let .next(vp: UmbraIter[]): Maybe<U8> = (
273-
let v = open(vp);
274-
if v.idx >= v.str.length {
275-
None :: Maybe<u8>
276-
} else {
277-
let val = v.str[v.idx];
278-
v.idx = v.idx + 1;
279-
vp[0] = v;
280-
Some { val }
281-
}
282-
);

0 commit comments

Comments
 (0)