1
0
forked from Mirror/wren
Files
wren/builtin/core.wren
Bob Nystrom ed8e595f54 Get rid of bytecodes for list literals.
Just compile them to:

new List
.add(...)
.add(...)
...

Gets rid of some code in the interpreter loop, which is always good.
Also addresses the old limitation where a list literal could only have
255 elements.
2015-01-25 22:49:30 -08:00

128 lines
2.1 KiB
Plaintext

class Sequence {
map(f) {
var result = new List
for (element in this) {
result.add(f.call(element))
}
return result
}
where(f) {
var result = new List
for (element in this) {
if (f.call(element)) result.add(element)
}
return result
}
all(f) {
for (element in this) {
if (!f.call(element)) return false
}
return true
}
reduce(acc, f) {
for (element in this) {
acc = f.call(acc, element)
}
return acc
}
reduce(f) {
var iter = iterate(null)
if (!iter) Fiber.abort("Can't reduce an empty sequence.")
// Seed with the first element.
var result = iteratorValue(iter)
while (iter = iterate(iter)) {
result = f.call(result, iteratorValue(iter))
}
return result
}
join { join("") }
join(sep) {
var first = true
var result = ""
for (element in this) {
if (!first) result = result + sep
first = false
result = result + element.toString
}
return result
}
}
class String is Sequence {}
class List is Sequence {
addAll(other) {
for (element in other) {
add(element)
}
return other
}
toString { "[" + join(", ") + "]" }
+(other) {
var result = this[0..-1]
for (element in other) {
result.add(element)
}
return result
}
contains(element) {
for (item in this) {
if (element == item) {
return true
}
}
return false
}
}
class Map {
keys { new MapKeySequence(this) }
values { new MapValueSequence(this) }
toString {
var first = true
var result = "{"
for (key in keys) {
if (!first) result = result + ", "
first = false
result = result + key.toString + ": " + this[key].toString
}
return result + "}"
}
}
class MapKeySequence is Sequence {
new(map) {
_map = map
}
iterate(n) { _map.iterate_(n) }
iteratorValue(iterator) { _map.keyIteratorValue_(iterator) }
}
class MapValueSequence is Sequence {
new(map) {
_map = map
}
iterate(n) { _map.iterate_(n) }
iteratorValue(iterator) { _map.valueIteratorValue_(iterator) }
}
class Range is Sequence {}