Reputation: 2990
Is there standard function to enumerate an F# sequence that works like Python's enumerate()?
It's very easy to write from scratch:
let enumerate (sq : seq<'T>) = seq {
let rec loop (e : IEnumerator<'T>) index = seq {
if e.MoveNext() then
yield (index, e.Current)
yield! loop e (index+1)
}
use enum = sq.GetEnumerator()
yield! loop enum 0
}
but I don't want to reinvent the wheel.
PS: also, I tried
let seasons = ["Spring"; "Summer"; "Fall"; "Winter"]
for x in Seq.zip [0..100000] seasons do
printfn "%A" x
but this [0..10000]
part looks ugly.
Upvotes: 5
Views: 1785
Reputation: 4594
This is what you want:
module Seq =
let inline enumerate source = Seq.mapi (fun i x -> i,x) source
> ["a"; "b"] |> Seq.enumerate;;
val it : seq<int * string> = seq [(0, "a"); (1, "b")]
Or Hot 'n Spicy with FSharpx:
let enumerate source = Seq.mapi (curry id) source
Well, actually, in FSharpx it's already available as Seq.index
.
Upvotes: 1
Reputation: 118865
I think maybe you want Seq.mapi
or Seq.iteri
.
http://msdn.microsoft.com/en-us/library/ee340431.aspx
http://msdn.microsoft.com/en-us/library/ee370541
Upvotes: 5