forked from Mirror/wren
Get rid of the separate opt-in IO class and replace it with a core System class. - Remove wren_io.c, wren_io.h, and io.wren. - Remove the flags that disable it. - Remove the overloads for print() with different arity. (It was an experiment, but I don't think it's that useful.) - Remove IO.read(). That will reappear using libuv in the CLI at some point. - Remove IO.time. Doesn't seem to have been used. - Update all of the tests, docs, etc. I'm sorry for all the breakage this causes, but I think "System" is a better name for this class (it makes it natural to add things like "System.gc()") and frees up "IO" for referring to the CLI's IO module.
251 lines
4.5 KiB
Plaintext
251 lines
4.5 KiB
Plaintext
class Bool {}
|
|
class Fiber {}
|
|
class Fn {}
|
|
class Null {}
|
|
class Num {}
|
|
|
|
class Sequence {
|
|
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) {
|
|
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)
|
|
}
|
|
}
|
|
|
|
isEmpty { iterate(null) ? false : true }
|
|
|
|
map(transformation) { MapSequence.new(this, transformation) }
|
|
|
|
where(predicate) { WhereSequence.new(this, predicate) }
|
|
|
|
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
|
|
}
|
|
|
|
toList {
|
|
var result = List.new()
|
|
for (element in this) {
|
|
result.add(element)
|
|
}
|
|
return result
|
|
}
|
|
}
|
|
|
|
class MapSequence is Sequence {
|
|
construct new(sequence, fn) {
|
|
_sequence = sequence
|
|
_fn = fn
|
|
}
|
|
|
|
iterate(iterator) { _sequence.iterate(iterator) }
|
|
iteratorValue(iterator) { _fn.call(_sequence.iteratorValue(iterator)) }
|
|
}
|
|
|
|
class WhereSequence is Sequence {
|
|
construct new(sequence, fn) {
|
|
_sequence = sequence
|
|
_fn = fn
|
|
}
|
|
|
|
iterate(iterator) {
|
|
while (iterator = _sequence.iterate(iterator)) {
|
|
if (_fn.call(_sequence.iteratorValue(iterator))) break
|
|
}
|
|
return iterator
|
|
}
|
|
|
|
iteratorValue(iterator) { _sequence.iteratorValue(iterator) }
|
|
}
|
|
|
|
class String is Sequence {
|
|
bytes { StringByteSequence.new(this) }
|
|
codePoints { StringCodePointSequence.new(this) }
|
|
}
|
|
|
|
class StringByteSequence is Sequence {
|
|
construct new(string) {
|
|
_string = string
|
|
}
|
|
|
|
[index] { _string.byteAt_(index) }
|
|
iterate(iterator) { _string.iterateByte_(iterator) }
|
|
iteratorValue(iterator) { _string.byteAt_(iterator) }
|
|
|
|
count { _string.byteCount_ }
|
|
}
|
|
|
|
class StringCodePointSequence is Sequence {
|
|
construct new(string) {
|
|
_string = string
|
|
}
|
|
|
|
[index] { _string.codePointAt_(index) }
|
|
iterate(iterator) { _string.iterate(iterator) }
|
|
iteratorValue(iterator) { _string.codePointAt_(iterator) }
|
|
|
|
count { _string.count }
|
|
}
|
|
|
|
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 { MapKeySequence.new(this) }
|
|
values { MapValueSequence.new(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 {
|
|
construct new(map) {
|
|
_map = map
|
|
}
|
|
|
|
iterate(n) { _map.iterate_(n) }
|
|
iteratorValue(iterator) { _map.keyIteratorValue_(iterator) }
|
|
}
|
|
|
|
class MapValueSequence is Sequence {
|
|
construct new(map) {
|
|
_map = map
|
|
}
|
|
|
|
iterate(n) { _map.iterate_(n) }
|
|
iteratorValue(iterator) { _map.valueIteratorValue_(iterator) }
|
|
}
|
|
|
|
class Range is Sequence {}
|
|
|
|
class System {
|
|
static print() {
|
|
writeString_("\n")
|
|
}
|
|
|
|
static print(obj) {
|
|
writeObject_(obj)
|
|
writeString_("\n")
|
|
return obj
|
|
}
|
|
|
|
static printAll(sequence) {
|
|
for (object in sequence) writeObject_(object)
|
|
writeString_("\n")
|
|
}
|
|
|
|
static write(obj) {
|
|
writeObject_(obj)
|
|
return obj
|
|
}
|
|
|
|
static writeAll(sequence) {
|
|
for (object in sequence) writeObject_(object)
|
|
}
|
|
|
|
static writeObject_(obj) {
|
|
var string = obj.toString
|
|
if (string is String) {
|
|
writeString_(string)
|
|
} else {
|
|
writeString_("[invalid toString]")
|
|
}
|
|
}
|
|
}
|