
struct Pair(x:Text, y:Text)

func pairwise(strs:[Text] -> func(->Pair?)):
    i := 1
    return func():
        if i + 1 > strs.length: return none:Pair
        i += 1
        return Pair(strs[i-1], strs[i])?

func range(first:Int, last:Int -> func(->Int?)):
    i := first
    return func():
        if i > last:
            return none:Int
        i += 1
        return (i-1)?

func main():
    values := ["A", "B", "C", "D"]

    >> (++: "($(foo.x)$(foo.y))" for foo in pairwise(values))!
    = "(AB)(BC)(CD)"
    >> ["$(foo.x)$(foo.y)" for foo in pairwise(values)]
    = ["AB", "BC", "CD"]

    do:
        result := @[:Text]
        for foo in pairwise(values):
            result:insert("$(foo.x)$(foo.y)")
        >> result[]
        = ["AB", "BC", "CD"]

    >> [i for i in range(5, 10)]
    = [5, 6, 7, 8, 9, 10]

    >> (+: range(5, 10))!
    = 45
