Skip to content

Commit e6fe125

Browse files
committed
updated IndexListDeltaEnumerator
1 parent 26007c5 commit e6fe125

2 files changed

Lines changed: 84 additions & 24 deletions

File tree

src/FSharp.Data.Adaptive/AdaptiveIndexList/AdaptiveIndexList.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ module internal Reductions =
5050
result <- reduction.view sum
5151
else
5252
let mutable working = true
53-
use e = ops.GetEnumerator()
53+
let mutable e = ops.GetEnumerator()
5454
while working && e.MoveNext() do
5555
let index, op = e.Current
5656
match op with

src/FSharp.Data.Adaptive/Datastructures/IndexListDelta.fs

Lines changed: 83 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -89,33 +89,93 @@ type IndexListDelta< [<EqualityConditionalOn>] 'T> internal(content : MapExt<Ind
8989
res <- res.Combine(mapping i v)
9090
res
9191

92-
member x.GetEnumerator() = new IndexListDeltaEnumerator<'T>(x)
92+
member x.GetEnumerator() = new IndexListDeltaEnumerator<'T>(x.Content.Root)
9393

9494
interface System.Collections.IEnumerable with
95-
member x.GetEnumerator() = new IndexListDeltaEnumerator<'T>(x) :> _
95+
member x.GetEnumerator() = new IndexListDeltaEnumerator<'T>(x.Content.Root) :> _
9696

9797
interface System.Collections.Generic.IEnumerable<Index * ElementOperation<'T>> with
98-
member x.GetEnumerator() = new IndexListDeltaEnumerator<'T>(x) :> _
99-
100-
and IndexListDeltaEnumerator<'T>(delta : IndexListDelta<'T>) =
101-
let mutable e = new MapExtEnumerator<Index, ElementOperation<'T>>(delta.Content.Root)
102-
103-
member x.MoveNext() = e.MoveNext()
104-
member x.Current =
105-
let kvp = e.Current
106-
kvp.Key, kvp.Value
107-
108-
member x.Reset() = e.Reset()
109-
member x.Dispose() = ()
110-
111-
interface System.Collections.IEnumerator with
112-
member x.MoveNext() = x.MoveNext()
113-
member x.Current = x.Current :> obj
114-
member x.Reset() = x.Reset()
115-
116-
interface System.Collections.Generic.IEnumerator<Index * ElementOperation<'T>> with
117-
member x.Current = x.Current
118-
member x.Dispose() = x.Dispose()
98+
member x.GetEnumerator() = new IndexListDeltaEnumerator<'T>(x.Content.Root) :> _
99+
100+
and IndexListDeltaEnumerator<'T> =
101+
struct
102+
val mutable internal Root : MapExtImplementation.Node<Index, ElementOperation<'T>>
103+
val mutable internal Head : struct(MapExtImplementation.Node<Index, ElementOperation<'T>> * bool)
104+
val mutable internal Tail : list<struct(MapExtImplementation.Node<Index, ElementOperation<'T>> * bool)>
105+
val mutable internal CurrentNode : MapExtImplementation.Node<Index, ElementOperation<'T>>
106+
107+
member x.MoveNext() =
108+
let struct(n, deep) = x.Head
109+
if not (isNull n) then
110+
111+
if n.Height > 1uy && deep then
112+
let inner = n :?> MapExtImplementation.Inner<Index, ElementOperation<'T>>
113+
114+
if isNull inner.Left then
115+
if isNull inner.Right then
116+
if x.Tail.IsEmpty then
117+
x.Head <- Unchecked.defaultof<_>
118+
x.Tail <- []
119+
else
120+
x.Head <- x.Tail.Head
121+
x.Tail <- x.Tail.Tail
122+
else
123+
x.Head <- struct(inner.Right, true)
124+
125+
x.CurrentNode <- n
126+
true
127+
else
128+
x.Head <- struct(inner.Left, true)
129+
if isNull inner.Right then
130+
x.Tail <- struct(n, false) :: x.Tail
131+
else
132+
x.Tail <- struct(n, false) :: struct(inner.Right, true) :: x.Tail
133+
x.MoveNext()
134+
else
135+
x.CurrentNode <- n
136+
if x.Tail.IsEmpty then
137+
x.Head <- Unchecked.defaultof<_>
138+
x.Tail <- []
139+
else
140+
x.Head <- x.Tail.Head
141+
x.Tail <- x.Tail.Tail
142+
true
143+
144+
else
145+
false
146+
147+
148+
member x.Reset() =
149+
x.Head <- if isNull x.Root then Unchecked.defaultof<_> else struct(x.Root, true)
150+
x.Tail <- []
151+
x.CurrentNode <- null
152+
153+
member x.Dispose() =
154+
x.Root <- null
155+
x.CurrentNode <- null
156+
x.Head <- Unchecked.defaultof<_>
157+
x.Tail <- []
158+
159+
member x.Current =
160+
(x.CurrentNode.Key, x.CurrentNode.Value)
161+
162+
interface System.Collections.IEnumerator with
163+
member x.MoveNext() = x.MoveNext()
164+
member x.Reset() = x.Reset()
165+
member x.Current = x.Current :> obj
166+
167+
interface System.Collections.Generic.IEnumerator<Index * ElementOperation<'T>> with
168+
member x.Current = x.Current
169+
member x.Dispose() = x.Dispose()
170+
171+
internal new(root : MapExtImplementation.Node<Index, ElementOperation<'T>>) =
172+
{
173+
Root = root
174+
Head = if isNull root then Unchecked.defaultof<_> else struct(root, true)
175+
Tail = []
176+
CurrentNode = null
177+
}
178+
end
119179

120180
/// Functional operators for IndexListDelta.
121181
[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]

0 commit comments

Comments
 (0)