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 check that inserting character one after another always reuses ListIterators | ||||
|  */ | ||||
| export class ListIterator { | ||||
|   /** | ||||
| @ -214,6 +215,7 @@ export class ListIterator { | ||||
|    * @param {function(T, T): T} concat | ||||
|    */ | ||||
|   _slice (tr, len, value, slice, concat) { | ||||
|     this.index += len | ||||
|     while (len > 0 && !this.reachedEnd) { | ||||
|       while (this.nextItem && this.nextItem.countable && !this.reachedEnd && len > 0) { | ||||
|         if (!this.nextItem.deleted) { | ||||
| @ -240,6 +242,9 @@ export class ListIterator { | ||||
|         this.forward(tr, 0) | ||||
|       } | ||||
|     } | ||||
|     if (len < 0) { | ||||
|       this.index -= len | ||||
|     } | ||||
|     return value | ||||
|   } | ||||
| 
 | ||||
| @ -297,6 +302,7 @@ export class ListIterator { | ||||
|       this.nextItem = getItemCleanStart(tr, createID(itemid.client, itemid.clock + this.rel)) | ||||
|       this.rel = 0 | ||||
|     } | ||||
|     const sm = this.type._searchMarker | ||||
|     const parent = this.type | ||||
|     const store = tr.doc.store | ||||
|     const ownClientId = tr.doc.clientID | ||||
| @ -362,6 +368,10 @@ export class ListIterator { | ||||
|     } else { | ||||
|       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 | ||||
|       }, | ||||
|       next: () => { | ||||
|         if (this.reachedEnd) { | ||||
|           return { done: true } | ||||
|         } | ||||
|         const [value] = this.slice(tr, 1) | ||||
|         return { | ||||
|           done: value == null, | ||||
|           done: false, | ||||
|           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 t from 'lib0/testing' | ||||
| @ -473,6 +473,7 @@ const arrayTransactions = [ | ||||
|     yarray.insert(pos, 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.compare(yarray.toJSON(), yarray.toArray().map(x => x instanceof AbstractType ? x.toJSON() : x)) | ||||
|   }, | ||||
|   function insertTypeArray (user, gen) { | ||||
|     const yarray = user.getArray('array') | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user