Skip to content

Commit d1f1eaf

Browse files
committed
Update site
1 parent b720d95 commit d1f1eaf

File tree

9 files changed

+260
-50
lines changed

9 files changed

+260
-50
lines changed

Fir/Deque.fir

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
type Deque[t](
2+
_data: Array[t],
3+
_head: U32,
4+
_len: U32,
5+
)
6+
7+
8+
Deque.withCapacity(cap: U32) Deque[t]:
9+
Deque(_data = Array.new(cap), _head = 0, _len = 0)
10+
11+
12+
Deque.empty() Deque[t]:
13+
Deque.withCapacity(0)
14+
15+
16+
Deque.fromIter[Iterator[iter, item, exn]](iter: iter) Deque[item] / exn:
17+
let size = iter.size[iter, item, exn, exn]().unwrapOr(10)
18+
let deque = Deque.withCapacity(size)
19+
for item: item in iter:
20+
deque.pushBack(item)
21+
deque
22+
23+
24+
Deque.iter(self: Deque[t]) DequeIter[t]:
25+
DequeIter(_deque = self, _idx = 0)
26+
27+
28+
Deque.get(self: Deque[t], idx: U32) t:
29+
if idx >= self._len:
30+
panic("Deque.get OOB (len=`self._len`, idx=`idx`)")
31+
32+
self._data.get((self._head + idx).rem(self._data.len()))
33+
34+
35+
Deque.reserve(self: Deque[t], additional: U32):
36+
if additional == 0:
37+
return
38+
let len = self.len()
39+
let newCap = max(u32(8), (len + additional).nextPowerOfTwo())
40+
if newCap > self._data.len():
41+
let newData = Array.new(newCap)
42+
let oldHead = self._head
43+
for i: U32 in range(u32(0), len):
44+
newData.set(i, self._data.get((oldHead + i).rem(len)))
45+
self._data = newData
46+
self._head = 0
47+
48+
49+
Deque.len(self: Deque[t]) U32:
50+
self._len
51+
52+
53+
Deque.isEmpty(self: Deque[t]) Bool:
54+
self._len == 0
55+
56+
57+
Deque.pushBack(self: Deque[t], item: t):
58+
self.reserve(1)
59+
self._data.set((self._head + self._len).rem(self._data.len()), item)
60+
self._len += 1
61+
62+
63+
Deque.pushFront(self: Deque[t], item: t):
64+
self.reserve(1)
65+
if self._head == 0:
66+
self._head = self._data.len() - 1
67+
else:
68+
self._head -= 1
69+
self._len += 1
70+
self._data.set(self._head, item)
71+
72+
73+
Deque.popBack(self: Deque[t]) Option[t]:
74+
if self._len == 0:
75+
return Option.None
76+
77+
self._len -= 1
78+
Option.Some(self._data.get((self._head + self._len).rem(self._data.len())))
79+
80+
81+
Deque.popFront(self: Deque[t]) Option[t]:
82+
if self._len == 0:
83+
return Option.None
84+
85+
self._len -= 1
86+
let elem = self._data.get(self._head)
87+
self._head = (self._head + 1).rem(self._data.len())
88+
Option.Some(elem)
89+
90+
91+
impl[ToStr[t]] ToStr[Deque[t]]:
92+
toStr(self: Deque[t]) Str:
93+
let buf = StrBuf.withCapacity(self.len() * 5 + 2)
94+
buf.push('[')
95+
for i: U32 in range(u32(0), self.len()):
96+
if i != 0:
97+
buf.push(',')
98+
buf.pushStr(self.get(i).toStr())
99+
buf.push(']')
100+
buf.toStr()
101+
102+
103+
impl[ToDoc[t]] ToDoc[Deque[t]]:
104+
toDoc(self: Deque[t]) Doc:
105+
if self.isEmpty():
106+
return Doc.str("Deque.[]")
107+
108+
let args = Doc.empty()
109+
for i: U32 in range(u32(0), self.len()):
110+
if i != 0:
111+
args += Doc.char(',') + Doc.break_(1)
112+
args += self.get(i).toDoc()
113+
Doc.grouped(
114+
Doc.str("Deque.[")
115+
+ Doc.nested(4, Doc.break_(0) + args).group()
116+
+ Doc.break_(0)
117+
+ Doc.char(']'),
118+
)
119+
120+
121+
impl[Eq[t]] Eq[Deque[t]]:
122+
__eq(self: Deque[t], other: Deque[t]) Bool:
123+
if self.len() != other.len():
124+
return Bool.False
125+
126+
for i: U32 in range(u32(0), self.len()):
127+
if self.get(i) != other.get(i):
128+
return Bool.False
129+
130+
Bool.True
131+
132+
133+
impl[Hash[t]] Hash[Deque[t]]:
134+
hash(self: Deque[t]) U32:
135+
let hash = self.len()
136+
for t: t in self.iter():
137+
hash += t.hash()
138+
hash
139+
140+
141+
type DequeIter[t](
142+
_deque: Deque[t],
143+
_idx: U32,
144+
)
145+
146+
147+
impl Iterator[DequeIter[t], t, exn]:
148+
next(self: DequeIter[t]) Option[t] / exn:
149+
if self._idx >= self._deque.len():
150+
return Option.None
151+
152+
let val = self._deque.get(self._idx)
153+
self._idx += 1
154+
Option.Some(val)
155+
156+
157+
impl[Clone[t]] Clone[Deque[t]]:
158+
clone(self: Deque[t]) Deque[t]:
159+
let ret: Deque[t] = Deque.withCapacity(self.len())
160+
for t: t in self.iter():
161+
ret.pushBack(t.clone())
162+
ret

Fir/HashMap.fir

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ type HashMap[k, v](
1313
#[derive(ToDoc)]
1414
type Elem[k, v](
1515
key: k,
16-
value: v,
16+
val: v,
1717
next: Option[Elem[k, v]],
1818
)
1919

@@ -46,12 +46,12 @@ HashMap._capacityBeforeGrowth(cap: U32) U32:
4646
(u32(cap) * u32(8000)) / u32(10000)
4747

4848

49-
HashMap.fromIter[Iterator[iter, (key: k, value: v), exn], Eq[k], Hash[k]](
49+
HashMap.fromIter[Iterator[iter, (key: k, val: v), exn], Eq[k], Hash[k]](
5050
iter: iter,
5151
) HashMap[k, v] / exn:
5252
let map = HashMap.withCapacity(10)
53-
for item: (key: k, value: v) in iter:
54-
map.insert(item.key, item.value)
53+
for item: (key: k, val: v) in iter:
54+
map.insert(item.key, item.val)
5555
map
5656

5757

@@ -70,7 +70,7 @@ HashMap._grow[Eq[k], Hash[k]](self: HashMap[k, v]):
7070
let newCapacityLeft: U32 = HashMap._capacityBeforeGrowth(newCap)
7171

7272
for entry: HashMapEntry[k, v] in self.iter():
73-
HashMap._insert(newElems, entry.key, entry.value)
73+
HashMap._insert(newElems, entry.key, entry.val)
7474
newCapacityLeft -= 1
7575

7676
self._buckets = newElems
@@ -83,7 +83,7 @@ HashMap.fromEntries[Iterator[iter, HashMapEntry[k, v], exn], Eq[k], Hash[k]](
8383
) HashMap[k, v] / exn:
8484
let map = HashMap.withCapacity(10)
8585
for item: HashMapEntry[k, v] in iter:
86-
map.insert(item.key, item.value)
86+
map.insert(item.key, item.val)
8787
map
8888

8989

@@ -96,7 +96,7 @@ HashMap.keys(self: HashMap[k, v]) Map[HashMapIter[k, v], HashMapEntry[k, v], k,
9696

9797

9898
HashMap.values(self: HashMap[k, v]) Map[HashMapIter[k, v], HashMapEntry[k, v], v, exn] / exn:
99-
HashMapIter.new(self).map(\(entry: HashMapEntry[k, v]): entry.value)
99+
HashMapIter.new(self).map(\(entry: HashMapEntry[k, v]): entry.val)
100100

101101

102102
# Insert new value, return old value.
@@ -112,7 +112,7 @@ HashMap.remove[Hash[k], Eq[k]](self: HashMap[k, v], key: k) Option[v]:
112112
match prevElem:
113113
Option.None: self._buckets.set(index, Option.None)
114114
Option.Some(prevElem): prevElem.next = elem.next
115-
return Option.Some(elem.value)
115+
return Option.Some(elem.val)
116116
else:
117117
prevElem = Option.Some(elem)
118118
match elem.next:
@@ -123,11 +123,11 @@ HashMap.remove[Hash[k], Eq[k]](self: HashMap[k, v], key: k) Option[v]:
123123

124124

125125
# Insert new value, return old value.
126-
HashMap.insert[Hash[k], Eq[k]](self: HashMap[k, v], key: k, value: v) Option[v]:
126+
HashMap.insert[Hash[k], Eq[k]](self: HashMap[k, v], key: k, val: v) Option[v]:
127127
if self._capacityLeft == 0:
128128
self._grow()
129129

130-
let ret = HashMap._insert(self._buckets, key, value)
130+
let ret = HashMap._insert(self._buckets, key, val)
131131
self._capacityLeft -= 1
132132
self._numElements += 1
133133
ret
@@ -136,26 +136,26 @@ HashMap.insert[Hash[k], Eq[k]](self: HashMap[k, v], key: k, value: v) Option[v]:
136136
HashMap._insert[Hash[k], Eq[k]](
137137
buckets: Array[Option[Elem[k, v]]],
138138
key: k,
139-
value: v,
139+
val: v,
140140
) Option[v]:
141141
let hash = key.hash()
142142
let index = hash.mod(buckets.len())
143143
match buckets.get(index):
144144
Option.None:
145-
buckets.set(index, Option.Some(Elem(key, value, next = Option.None)))
145+
buckets.set(index, Option.Some(Elem(key, val, next = Option.None)))
146146
Option.None
147147
Option.Some(elem):
148148
loop:
149149
if elem.key == key:
150-
let old = elem.value
151-
elem.value = value
150+
let old = elem.val
151+
elem.val = val
152152
return Option.Some(old)
153153
else:
154154
match elem.next:
155155
Option.Some(next): elem = next
156156
Option.None:
157157
elem.next = Option.Some(
158-
Elem(key, value, next = Option.None),
158+
Elem(key, val, next = Option.None),
159159
)
160160
return Option.None
161161

@@ -173,7 +173,7 @@ HashMap.get[Hash[k], Eq[k]](self: HashMap[k, v], key: k) Option[v]:
173173
Option.None: return Option.None
174174
Option.Some(elem_):
175175
if elem_.key == key:
176-
return Option.Some(elem_.value)
176+
return Option.Some(elem_.val)
177177
else:
178178
elem = elem_.next
179179

@@ -197,7 +197,7 @@ impl[Clone[k], Clone[v]] Clone[Elem[k, v]]:
197197
clone(self: Elem[k, v]) Elem[k, v]:
198198
Elem(
199199
key = self.key.clone(),
200-
value = self.value.clone(),
200+
val = self.val.clone(),
201201
next = self.next.clone(),
202202
)
203203

@@ -212,7 +212,7 @@ impl[ToStr[k], ToStr[v]] ToStr[HashMap[k, v]]:
212212
buf.pushStr(", ")
213213
buf.pushStr(entry.key.toStr())
214214
buf.pushStr(": ")
215-
buf.pushStr(entry.value.toStr())
215+
buf.pushStr(entry.val.toStr())
216216
printed += 1
217217
buf.push('}')
218218
buf.toStr()
@@ -230,7 +230,7 @@ impl[ToDoc[k], ToDoc[v]] ToDoc[HashMap[k, v]]:
230230
+ Doc.blank(1)
231231
+ Doc.char('=')
232232
+ Doc.break_(1)
233-
+ entry.value.toDoc(),
233+
+ entry.val.toDoc(),
234234
)
235235
printed += 1
236236

@@ -258,7 +258,7 @@ type HashMapIter[k, v](
258258

259259
type HashMapEntry[k, v](
260260
key: k,
261-
value: v,
261+
val: v,
262262
)
263263

264264

@@ -274,7 +274,7 @@ impl Iterator[HashMapIter[k, v], HashMapEntry[k, v], exn]:
274274
next(self: HashMapIter[k, v]) Option[HashMapEntry[k, v]] / exn:
275275
match self._nextElem:
276276
Option.Some(next):
277-
let ret = HashMapEntry(key = next.key, value = next.value)
277+
let ret = HashMapEntry(key = next.key, val = next.val)
278278
self._nextElem = next.next
279279
Option.Some(ret)
280280

@@ -319,8 +319,7 @@ impl[ToDoc[k], ToDoc[v]] ToDoc[Elem[k, v]]:
319319
)
320320
args += Doc.char(',') + Doc.break_(1)
321321
args += Doc.grouped(
322-
Doc.str("value =")
323-
+ Doc.nested(4, Doc.break_(1) + self.value.toDoc()),
322+
Doc.str("val =") + Doc.nested(4, Doc.break_(1) + self.val.toDoc()),
324323
)
325324
args += Doc.char(',') + Doc.break_(1)
326325
args += Doc.grouped(

Fir/HashSet.fir

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ HashSet.isEmpty(self: HashSet[k]) Bool:
2020

2121

2222
HashSet.fromIter[Iterator[iter, k, exn], Eq[k], Hash[k]](iter: iter) HashSet[k] / exn:
23-
HashSet(_map = HashMap.fromIter(iter.map(\(k): (key = k, value = ()))))
23+
HashSet(_map = HashMap.fromIter(iter.map(\(k): (key = k, val = ()))))
2424

2525

2626
HashSet.iter(self: HashSet[k]) Map[HashMapIter[k, ()], HashMapEntry[k, ()], k, exn]:

0 commit comments

Comments
 (0)