You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					64 lines
				
				2.0 KiB
			
		
		
			
		
	
	
					64 lines
				
				2.0 KiB
			| 
											3 years ago
										 | # rope-sequence
 | ||
|  | 
 | ||
|  | This module implements a single data type, `RopeSequence`, which is a | ||
|  | persistent sequence type implemented as a loosely-balanced | ||
|  | [rope](https://www.cs.rit.edu/usr/local/pub/jeh/courses/QUARTERS/FP/Labs/CedarRope/rope-paper.pdf). | ||
|  | It supports appending, prepending, and slicing without doing a full | ||
|  | copy. Random access is somewhat more expensive than in an array | ||
|  | (logarithmic, with some overhead), but should still be relatively | ||
|  | fast. | ||
|  | 
 | ||
|  | Licensed under the MIT license. | ||
|  | 
 | ||
|  | ## class `RopeSequence<T>`
 | ||
|  | 
 | ||
|  | `static `**`from`**`(?union<[T], RopeSequence<T>>) → RopeSequence<T>` | ||
|  | 
 | ||
|  | Create a rope representing the given array, or return the rope itself | ||
|  | if a rope was given. | ||
|  | 
 | ||
|  | `static `**`empty`**`: RopeSequence<T>` | ||
|  | 
 | ||
|  | The empty rope. | ||
|  | 
 | ||
|  | **`length`**`: number` | ||
|  | 
 | ||
|  | The length of the rope. | ||
|  | 
 | ||
|  | **`append`**`(union<[T], RopeSequence<T>>) → RopeSequence<T>` | ||
|  | 
 | ||
|  | Append an array or other rope to this one, returning a new rope. | ||
|  | 
 | ||
|  | **`prepend`**`(union<[T], RopeSequence<T>>) → RopeSequence<T>` | ||
|  | 
 | ||
|  | Prepend an array or other rope to this one, returning a new rope. | ||
|  | 
 | ||
|  | **`slice`**`(from: ?number = 0, to: ?number = this.length) → RopeSequence<T>` | ||
|  | 
 | ||
|  | Create a rope repesenting a sub-sequence of this rope. | ||
|  | 
 | ||
|  | **`get`**`(index: number) → T` | ||
|  | 
 | ||
|  | Retrieve the element at the given position from this rope. | ||
|  | 
 | ||
|  | **`forEach`**`(f: fn(element: T, index: number) → ?bool, from: ?number, to: ?number)` | ||
|  | 
 | ||
|  | Call the given function for each element between the given indices. | ||
|  | This tends to be more efficient than looping over the indices and | ||
|  | calling `get`, because it doesn't have to descend the tree for every | ||
|  | element. | ||
|  | 
 | ||
|  | `to` may be less then `from`, in which case the iteration will happen | ||
|  | in reverse (starting at index `from - 1`, down to index `to`. | ||
|  | 
 | ||
|  | The iteration function may return `false` to abort iteration early. | ||
|  | 
 | ||
|  | **`map`**`(f: fn(element: T, index: number) → U, from: ?number, to: ?number) → [U]` | ||
|  | 
 | ||
|  | Map the given functions over the elements of the rope, producing a | ||
|  | flat array. | ||
|  | 
 | ||
|  | **`flatten`**`() → [T]` | ||
|  | 
 | ||
|  | Return the content of this rope as an array. |