forked from SwensenSoftware/fseye
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSeqExt.fs
44 lines (36 loc) · 1.71 KB
/
SeqExt.fs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
(*
Copyright 2011 Stephen Swensen
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*)
namespace Swensen.Utils
module internal Seq =
let distinctByResolve primaryKey resolveCollision values = seq { //make lazy seq? (YES, Seq.distinct does)
let cache = System.Collections.Generic.Dictionary<_,_>(HashIdentity.Structural)
for canidateValue in values do
let key = primaryKey canidateValue
match cache.TryGetValue(key) with
| true, existingValue -> //collision
match resolveCollision existingValue canidateValue with
| x when x >= 0 -> () //if existing equal or greater, keep it
| _ -> //canidate key wins in collision resolution
cache.Remove(key) |> ignore
cache.Add(key,canidateValue)
| false, _ ->
cache.Add(key, canidateValue)
yield! cache.Values }
let partition condition values =
let pairs = seq {
for i in values do
if condition i then
yield Some(i), None
else
yield None, Some(i) }
pairs |> Seq.choose fst, pairs |> Seq.choose snd