Files
wren/builtin/core.wren
Thorbjørn Lindeijer c00d6ad694 Added Sequence.each
This is a bit of a style preference since of course you can always write
the same thing with a for loop. However, I think sometimes the code
looks better when using this method.

It also provides an alternative to Sequence.map for cases where you
don't need the resulting list, and one that becomes especially necessary
when Sequence.map is changed to return a new sequence. The example in
the README.md file was using Sequence.map in a way that required this
alternative in that case.
2015-03-31 21:53:29 +02:00

179 lines
2.9 KiB
Plaintext

class Sequence {
contains(element) {
for (item in this) {
if (element == item) {
return true
}
}
return false
}
count {
var result = 0
for (element in this) {
result = result + 1
}
return result
}
count(f) {
var result = 0
for (element in this) {
if (f.call(element)) {
result = result + 1
}
}
return result
}
each(f) {
for (element in this) {
f.call(element)
}
}
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
}
any(f) {
for (element in this) {
if (f.call(element)) return true
}
return false
}
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
}
list {
var result = new List
for (element in this) {
result.add(element)
}
return result
}
}
class String is Sequence {
bytes { new StringByteSequence(this) }
}
class StringByteSequence is Sequence {
new(string) {
_string = string
}
[index] { _string.byteAt(index) }
iterate(iterator) { _string.iterateByte_(iterator) }
iteratorValue(iterator) { _string.byteAt(iterator) }
}
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
}
}
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 {}