proper iteration through arrays (for mappings, toJSON, ..)
This commit is contained in:
		
							parent
							
								
									fc38f3b848
								
							
						
					
					
						commit
						6df152c4ec
					
				| @ -18,6 +18,7 @@ const lengthExceeded = error.create('Length exceeded!') | |||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * @todo rename to walker? |  * @todo rename to walker? | ||||||
|  |  * @todo check that inserting character one after another always reuses ListIterators | ||||||
|  */ |  */ | ||||||
| export class ListIterator { | export class ListIterator { | ||||||
|   /** |   /** | ||||||
| @ -214,6 +215,7 @@ export class ListIterator { | |||||||
|    * @param {function(T, T): T} concat |    * @param {function(T, T): T} concat | ||||||
|    */ |    */ | ||||||
|   _slice (tr, len, value, slice, concat) { |   _slice (tr, len, value, slice, concat) { | ||||||
|  |     this.index += len | ||||||
|     while (len > 0 && !this.reachedEnd) { |     while (len > 0 && !this.reachedEnd) { | ||||||
|       while (this.nextItem && this.nextItem.countable && !this.reachedEnd && len > 0) { |       while (this.nextItem && this.nextItem.countable && !this.reachedEnd && len > 0) { | ||||||
|         if (!this.nextItem.deleted) { |         if (!this.nextItem.deleted) { | ||||||
| @ -240,6 +242,9 @@ export class ListIterator { | |||||||
|         this.forward(tr, 0) |         this.forward(tr, 0) | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |     if (len < 0) { | ||||||
|  |       this.index -= len | ||||||
|  |     } | ||||||
|     return value |     return value | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| @ -297,6 +302,7 @@ export class ListIterator { | |||||||
|       this.nextItem = getItemCleanStart(tr, createID(itemid.client, itemid.clock + this.rel)) |       this.nextItem = getItemCleanStart(tr, createID(itemid.client, itemid.clock + this.rel)) | ||||||
|       this.rel = 0 |       this.rel = 0 | ||||||
|     } |     } | ||||||
|  |     const sm = this.type._searchMarker | ||||||
|     const parent = this.type |     const parent = this.type | ||||||
|     const store = tr.doc.store |     const store = tr.doc.store | ||||||
|     const ownClientId = tr.doc.clientID |     const ownClientId = tr.doc.clientID | ||||||
| @ -362,6 +368,10 @@ export class ListIterator { | |||||||
|     } else { |     } else { | ||||||
|       this.nextItem = right |       this.nextItem = right | ||||||
|     } |     } | ||||||
|  |     if (sm) { | ||||||
|  |       updateMarkerChanges(tr, sm, this.index, content.length) | ||||||
|  |     } | ||||||
|  |     this.index += content.length | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
| @ -406,9 +416,12 @@ export class ListIterator { | |||||||
|         return this |         return this | ||||||
|       }, |       }, | ||||||
|       next: () => { |       next: () => { | ||||||
|  |         if (this.reachedEnd) { | ||||||
|  |           return { done: true } | ||||||
|  |         } | ||||||
|         const [value] = this.slice(tr, 1) |         const [value] = this.slice(tr, 1) | ||||||
|         return { |         return { | ||||||
|           done: value == null, |           done: false, | ||||||
|           value: value |           value: value | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| import { init, compare, applyRandomTests, Doc } from './testHelper.js' // eslint-disable-line
 | import { init, compare, applyRandomTests, Doc, AbstractType } from './testHelper.js' // eslint-disable-line
 | ||||||
| 
 | 
 | ||||||
| import * as Y from '../src/index.js' | import * as Y from '../src/index.js' | ||||||
| import * as t from 'lib0/testing' | import * as t from 'lib0/testing' | ||||||
| @ -473,6 +473,7 @@ const arrayTransactions = [ | |||||||
|     yarray.insert(pos, content) |     yarray.insert(pos, content) | ||||||
|     oldContent.splice(pos, 0, ...content) |     oldContent.splice(pos, 0, ...content) | ||||||
|     t.compareArrays(yarray.toArray(), oldContent) // we want to make sure that fastSearch markers insert at the correct position
 |     t.compareArrays(yarray.toArray(), oldContent) // we want to make sure that fastSearch markers insert at the correct position
 | ||||||
|  |     t.compare(yarray.toJSON(), yarray.toArray().map(x => x instanceof AbstractType ? x.toJSON() : x)) | ||||||
|   }, |   }, | ||||||
|   function insertTypeArray (user, gen) { |   function insertTypeArray (user, gen) { | ||||||
|     const yarray = user.getArray('array') |     const yarray = user.getArray('array') | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user