Господа, есть ли способ избавиться от явного использования IEnumerator в следующем коде преобразования потока лексем в дерево?
#light
type Dest = | Node of string * list<Dest>
let incremented(it : System.Collections.Generic.IEnumerator<'a>) =
if it.MoveNext() then it else failwith "enumeration finished"
let parse(src : seq<int * string>) : seq<Dest> =
let rec impl (it : System.Collections.Generic.IEnumerator<int * string>) : Dest =
let (count, label) = it.Current
Node(label, seq { for i in 0 .. count-1 -> impl(incremented(it)) } |> Seq.to_list)
seq {
let it = src.GetEnumerator()
while it.MoveNext() do
yield impl it
}
let input = [(2,"root");(0,"A");(2,"B");(0,"B1");(0,"B2")]
let output = input |> parse |> Seq.to_list
output |> any_to_string |>System.Console.WriteLine