import std.collection.*
main() {
let arr = [1, 2, 3, 4, 5]
arr.forEach { it => println(it) }
arr.forEach { i, it => println("${i}: -> ${it}") }
arr.map { it => it * 2 } |> println
arr.filter { it => it % 2 == 0 } |> println
arr.every { it => it % 2 == 0 } |> println
arr.some { it => it % 2 == 0 } |> println
arr.reduce(10) { prev, next => prev + next } |> println
"Hello".toArray().forEach { it => println(Rune(it)) }
times(5) { i => unless(i % 2 != 0) { println(i) } }
}
/**
* 为Array类扩展一系列函数,以支持各种数组操作
*/
extend<T> Array<T> {
/**
* 遍历数组并执行给定的操作
*
* @param f 一个接受数组元素并返回Unit的操作函数
*/
public func forEach(f: (T) -> Unit): Unit {
for (i in 0..this.size) {
f(this[i])
}
}
/**
* 遍历数组并执行给定的操作,操作函数接收元素的索引和值
*
* @param f 一个接受索引和数组元素并返回Unit的操作函数
*/
public func forEach(f: (Int, T) -> Unit): Unit {
for (i in 0..this.size) {
f(i, this[i])
}
}
/**
* 映射数组中的每个元素到新数组
*
* @param f 一个接受数组元素并返回新值的映射函数
* @return 一个新的数组,包含映射后的元素
*/
public func map(f: (T) -> T): Array<T> {
var list = ArrayList<T>()
for (i in 0..this.size) {
f(this[i]) |> list.add
}
list.toArray()
}
/**
* 过滤数组中的元素,只保留满足条件的元素
*
* @param f 一个接受数组元素并返回Bool的过滤函数
* @return 一个新的数组,包含满足过滤条件的元素
*/
public func filter(f: (T) -> Bool): Array<T> {
var list = ArrayList<T>()
for (i in 0..this.size) {
if (f(this[i])) {
this[i] |> list.add
}
}
list.toArray()
}
/**
* 检查数组中的所有元素是否满足条件
*
* @param f 一个接受数组元素并返回Bool的检查函数
* @return 如果所有元素都满足条件则返回true,否则返回false
*/
public func every(f: (T) -> Bool): Bool {
for (i in 0..this.size) {
if (!f(this[i])) {
return false
}
}
true
}
/**
* 检查数组中是否存在满足条件的元素
*
* @param f 一个接受数组元素并返回Bool的检查函数
* @return 如果存在满足条件的元素则返回true,否则返回false
*/
public func some(f: (T) -> Bool): Bool {
for (i in 0..this.size) {
if (f(this[i])) {
return true
}
}
false
}
/**
* 对数组中的元素执行归约操作
*
* @param f 一个接受两个数组元素并返回一个元素的归约函数
* @return 归约操作的结果
*/
public func reduce(f: (T, T) -> T): T {
var result = this[0]
for (i in 1..this.size) {
result = f(result, this[i])
}
result
}
/**
* 对数组中的元素执行归约操作,初始值为给定的值
*
* @param v 归约操作的初始值
* @param f 一个接受两个数组元素并返回一个元素的归约函数
* @return 归约操作的结果
*/
public func reduce(v: T, f: (T, T) -> T): T {
var result = v
for (i in 0..this.size) {
result = f(result, this[i])
}
result
}
}
func times(n: Int64, f: (Int64) -> Unit): Unit {
for (i in 0..n) { f(i) }
}
func unless(p: Bool, f: () -> Unit): Unit {
if (!p) { f() }
}