@@ -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 > 1 uy && 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