fn map_string_to_int(list [string ...], func fn((string) int)) {
    // return a function that can be used as an iterator
    () {
        // this function will be called by the for loop
        // whenever it wants to retrieve the next item in the collection.
        // get the element
        elem := &list.remove(0)
        switch! elem {
            // if the element was present, run the map function to convert it from a string to an int and return the result
            [string] [elem] {
                [func.run(elem)]
            }
            // if there are no more elements, return something that doesn't match.
            [] [] []
        }
    }
}

for v ["1" "2" "5" "-10" ...].map_string_to_int((s string) s.parse_int().assume1("list contained strings that can't be parsed to an int!")) {
    debug(v)
}


// returns an iterator to iteratively compute square numbers
// using the fact that (n+1)^2 = n^2 + 2n + 1
fn square_numbers() {
    i := 0
    val := 0
    () {
        &val = val + { 2 * i } + 1
        &i = i + 1
        [val]
    }
}

for n square_numbers() {
    println(n.to_string())
    n >= 100
}