Skip to content

Instantly share code, notes, and snippets.

@kos59125
Created September 26, 2012 01:06
Show Gist options
  • Save kos59125/3785398 to your computer and use it in GitHub Desktop.
Save kos59125/3785398 to your computer and use it in GitHub Desktop.
Seq.windowed があるなら buffered があっても良いじゃない。
let buffered<'a> bufferSize (source : seq<'a>) =
seq {
use enumerator = source.GetEnumerator ()
let incomplete = ref true
while !incomplete do
let buffer =
seq {
let request = ref bufferSize
while !request > 0 && enumerator.MoveNext () do
yield enumerator.Current
decr request
} |> Seq.toArray
if buffer.Length > 0
then
yield buffer
else
incomplete := false
}
(*
igeta 氏の https://github.com/igeta/FsugJp.FSharp.Collections を使う場合以下が同等
toArray が冗長に見えてくるかも
*)
let buffered bufferSize =
Seq.zip (Seq.initInfinite id)
>> chunk (fun (i, _) -> i % bufferSize = 0)
>> Seq.map (Seq.map snd >> Seq.toArray)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment