Skip to content

Instantly share code, notes, and snippets.

@nagat01
Created August 20, 2013 10:55
Show Gist options
  • Save nagat01/6280003 to your computer and use it in GitHub Desktop.
Save nagat01/6280003 to your computer and use it in GitHub Desktop.
open System
module Seq =
let split n (xs:_ seq) =
if Seq.length xs > n then
Seq.take n xs, Seq.skip n xs
else
xs, Seq.empty
let chunk n = Seq.unfold(fun xs -> if xs = Seq.empty then None else Some (split n xs))
let split' n (xs:_ seq) =
let en = xs.GetEnumerator()
let next , n = ref true, ref n
seq {
while !next && !n > 0 do
yield! try [en.Current] with _ -> []
next := en.MoveNext()
decr n
},
seq {
while !next do
yield en.Current
next:= en.MoveNext ()
}
let chunk' n = Seq.unfold(fun xs -> if Seq.isEmpty xs then None else Some (split' n xs))
let range a b = seq { for i in a .. b -> printf "!%d " i; i }
let _print xs = printf "seq ["; Seq.iter (printf "%d ") xs; printf "]"
let print (head,tail) = printf "( "; _print head; printf ", "; _print tail; printfn ")"
let print2 xss = Seq.iter _print xss; printfn ""
print <| Seq.split 2 (range 1 1)
// !1 ( seq [!1 1 ], seq [])
print <| Seq.split 4 (range 1 7)
// !1 !2 !3 !4 !5 !6 !7 ( seq [!1 1 !2 2 !3 3 !4 4 ], seq [!1 !2 !3 !4 !5 5 !6 6 !7 7 ])
print2 <| Seq.chunk 2 (range 1 1)
// !1 seq [!1 1 ]
print2 <| Seq.chunk 2 (range 1 5)
// !1 !2 !3 !4 !5 seq [!1 1 !2 2 ]!1 !2 !3 !4 !5 seq [!1 !2 !3 3 !4 4 ]!1 !2 !3 !4 !5 seq [!1 !2 !3 !4 !5 5 ]
print <| Seq.split' 2 (range 1 1)
// ( seq [0 !1 1 ], seq [])
print <| Seq.split' 4 (range 1 7)
// ( seq [0 !1 1 !2 2 !3 3 !4 ], seq [4 !5 5 !6 6 !7 7 ])
print2 <| Seq.chunk' 2 (range 1 1)
// !1 seq [0 !1 1 ]
print2 <| Seq.chunk' 2 (range 1 5)
// !1 seq [0 !1 1 !2 ]seq [0 2 !3 ]seq [0 3 !4 ]seq [0 4 !5 ]seq [0 5 ]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment