Files
wren/builtin/core.wren
T

199 lines
3.5 KiB
Plaintext
Raw Normal View History

class Bool {}
class Fiber {}
class Fn {}
class Null {}
class Num {}
2014-02-16 09:20:31 -08:00
class Sequence {
2015-03-28 10:18:45 -07:00
all(f) {
var result = true
for (element in this) {
result = f.call(element)
if (!result) return result
}
return result
}
any(f) {
var result = false
for (element in this) {
result = f.call(element)
if (result) return result
}
return result
}
contains(element) {
for (item in this) {
2015-03-28 10:18:45 -07:00
if (element == item) return true
}
return false
}
2015-03-06 07:01:02 -08:00
count {
var result = 0
for (element in this) {
result = result + 1
}
return result
}
2015-03-14 14:17:21 +01:00
count(f) {
var result = 0
for (element in this) {
2015-03-28 10:18:45 -07:00
if (f.call(element)) result = result + 1
2015-03-14 14:17:21 +01:00
}
return result
}
2015-03-28 20:35:20 +01:00
each(f) {
for (element in this) {
f.call(element)
}
}
map(transformation) { new MapSequence(this, transformation) }
2014-02-16 09:20:31 -08:00
where(predicate) { new WhereSequence(this, predicate) }
2015-01-15 16:29:49 +01:00
reduce(acc, f) {
for (element in this) {
acc = f.call(acc, element)
}
return acc
}
2015-01-16 09:24:18 +01:00
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
}
2015-01-15 16:29:49 +01:00
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
}
2015-03-27 22:59:58 +01:00
2015-04-03 11:22:34 -07:00
toList {
2015-03-27 22:59:58 +01:00
var result = new List
for (element in this) {
result.add(element)
}
return result
}
2014-02-16 09:20:31 -08:00
}
class MapSequence is Sequence {
2015-04-01 07:31:15 -07:00
new(sequence, fn) {
_sequence = sequence
_fn = fn
}
2015-04-01 07:31:15 -07:00
iterate(iterator) { _sequence.iterate(iterator) }
iteratorValue(iterator) { _fn.call(_sequence.iteratorValue(iterator)) }
}
class WhereSequence is Sequence {
2015-04-01 07:31:15 -07:00
new(sequence, fn) {
_sequence = sequence
_fn = fn
}
2015-04-01 07:31:15 -07:00
iterate(iterator) {
while (iterator = _sequence.iterate(iterator)) {
if (_fn.call(_sequence.iteratorValue(iterator))) break
}
2015-04-01 07:31:15 -07:00
return iterator
}
2015-04-01 07:31:15 -07:00
iteratorValue(iterator) { _sequence.iteratorValue(iterator) }
}
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) }
}
2014-02-16 09:20:31 -08:00
class List is Sequence {
2014-04-06 08:37:37 -07:00
addAll(other) {
for (element in other) {
add(element)
}
return other
}
2015-05-19 06:50:17 -07:00
toString { "[" + join(", ") + "]" }
+(other) {
var result = this[0..-1]
for (element in other) {
2014-02-14 17:24:06 -08:00
result.add(element)
}
2014-02-14 17:24:06 -08:00
return result
}
2014-02-04 08:44:59 -08:00
}
2014-02-16 09:20:31 -08:00
2015-01-24 22:27:35 -08:00
class Map {
keys { new MapKeySequence(this) }
values { new MapValueSequence(this) }
toString {
2015-05-19 06:50:17 -07:00
var first = true
var result = "{"
2015-05-19 06:50:17 -07:00
for (key in keys) {
if (!first) result = result + ", "
first = false
result = result + key.toString + ": " + this[key].toString
}
2015-05-19 06:50:17 -07:00
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) }
2015-01-24 22:27:35 -08:00
}
2014-02-16 09:20:31 -08:00
class Range is Sequence {}