Skip to content

Commit f329463

Browse files
authored
Merge pull request #95 from fsprojects/fasterIndexMapping
optimized IndexMapping<'k>: key is no longer searched twice
2 parents bff8255 + bb33bbf commit f329463

1 file changed

Lines changed: 14 additions & 13 deletions

File tree

src/FSharp.Data.Adaptive/Utilities/Utilities.fs

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -175,20 +175,21 @@ module internal AdaptiveIndexListHelpers =
175175
let mutable store = MapExt.empty<'k, Index>
176176

177177
member x.Invoke(k : 'k) =
178-
let (left, self, right) = MapExt.neighbours k store
179-
match self with
180-
| Some i ->
181-
i
182-
| None ->
183-
let result =
178+
let mutable index = Index.zero
179+
let inline ret i = index <- i; Some i
180+
let newStore =
181+
store |> MapExt.changeWithNeighbours k (fun left self right ->
182+
match self with
183+
| Some i -> ret i
184+
| None ->
184185
match left, right with
185-
| None, None -> Index.after Index.zero
186-
| Some(_,l), None -> Index.after l
187-
| None, Some(_,r) -> Index.before r
188-
| Some (_,l), Some(_,r) -> Index.between l r
189-
190-
store <- MapExt.add k result store
191-
result
186+
| None, None -> Index.after Index.zero |> ret
187+
| Some(_,l), None -> Index.after l |> ret
188+
| None, Some(_,r) -> Index.before r |> ret
189+
| Some (_,l), Some(_,r) -> Index.between l r |> ret
190+
)
191+
store <- newStore
192+
index
192193

193194
member x.Revoke(k : 'k) =
194195
match MapExt.tryRemove k store with

0 commit comments

Comments
 (0)