Home
Insert
Update snippet 'Take value from a sequence only when it changes'
Title
Description
Take value from a sequence only when it changes (based on a predicate). Ex: Seq [1;1;1;3;3;3;5;5;5] will result in [3;5]
Source code
open System.Collections.Generic //Filter function with accumulator let filter (acc:'a) (f:('a -> 'b -> bool * 'a)) (s:'b seq) = let rec iter (acc:'a) (e:IEnumerator<'b>) = match e.MoveNext() with | false -> Seq.empty | true -> match f acc e.Current with | (true,newAcc) -> seq { yield e.Current; yield! iter newAcc e} | (false,newAcc) -> seq { yield! iter newAcc e} iter acc (s.GetEnumerator()) //main function let skipUntilChange (f : 'a -> 'b) (s : 'a seq) = s |> Seq.skip 1 |> filter (s |> Seq.head |> f) (fun a b -> if a = f b then false,f b else true,f b) //Example: [1;1;1;3;3;3;5;5;5] |> skipUntilChange id |> printfn "%A"
Tags
seq
filtering
seq
filtering
Author
Link
Reference NuGet packages
If your snippet has external dependencies, enter the names of NuGet packages to reference, separated by a comma (
#r
directives are not required).
Update