166 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # hoopy
 | |
| 
 | |
| [](https://gitlab.com/philbooth/hoopy/pipelines)
 | |
| [](https://www.npmjs.com/package/hoopy)
 | |
| [](https://www.npmjs.com/package/hoopy)
 | |
| [](https://opensource.org/licenses/MIT)
 | |
| 
 | |
| 
 | |
| Like an array, but rounder.
 | |
| 
 | |
| * [Huh?](#huh)
 | |
| * [What's it useful for?](#whats-it-useful-for)
 | |
| * [How do I install it?](#how-do-i-install-it)
 | |
| * [How do I use it?](#how-do-i-use-it)
 | |
|   * [Loading the library](#loading-the-library)
 | |
|   * [Creating arrays](#creating-arrays)
 | |
|   * [Accessing array items](#accessing-array-items)
 | |
|   * [Growing the array](#growing-the-array)
 | |
| * [Is there a change log?](#is-there-a-change-log)
 | |
| * [How do I set up the dev environment?](#how-do-i-set-up-the-dev-environment)
 | |
| * [What license is it released under?](#what-license-is-it-released-under)
 | |
| 
 | |
| ## Huh?
 | |
| 
 | |
| Hoopy is a circular array
 | |
| data type.
 | |
| It extends `Array`
 | |
| so that out-of-bounds indices
 | |
| wrap back round
 | |
| to the start of the array
 | |
| (or if they're negative indices,
 | |
| they wrap back round
 | |
| to the end of the array).
 | |
| 
 | |
| ## What's it useful for?
 | |
| 
 | |
| If you want a fixed-length buffer
 | |
| for streamed I/O,
 | |
| Hoopy can do that for you.
 | |
| 
 | |
| ## How do I install it?
 | |
| 
 | |
| Via `npm`:
 | |
| 
 | |
| ```
 | |
| npm i hoopy --save
 | |
| ```
 | |
| 
 | |
| Or if you just want the git repo:
 | |
| 
 | |
| ```
 | |
| git clone git@gitlab.com:philbooth/hoopy.git
 | |
| ```
 | |
| 
 | |
| ## How do I use it?
 | |
| 
 | |
| ### Loading the library
 | |
| 
 | |
| ```js
 | |
| const Hoopy = require('hoopy');
 | |
| ```
 | |
| 
 | |
| ### Creating arrays
 | |
| 
 | |
| ```js
 | |
| const hoopy = new Hoopy(10);
 | |
| assert(Array.isArray(hoopy));
 | |
| ```
 | |
| 
 | |
| You must pass
 | |
| a `size` argument
 | |
| to the `Hoopy` constructor,
 | |
| otherwise it will throw.
 | |
| 
 | |
| ### Accessing array items
 | |
| 
 | |
| ```js
 | |
| for (let i = 0; i < hoopy.length; ++i) {
 | |
|   hoopy[i] = i;
 | |
|   console.log(hoopy[i]);
 | |
| }
 | |
| ```
 | |
| 
 | |
| You can read and write array items
 | |
| using square brackets for indexing
 | |
| as you would with a normal array.
 | |
| However, if you write to
 | |
| an out-of-bounds index,
 | |
| it will not increase
 | |
| the length of the array.
 | |
| Instead the index is applied
 | |
| modulo the array length,
 | |
| wrapping back round to the start.
 | |
| Negative indices work in reverse,
 | |
| wrapping back round to the end
 | |
| of the array.
 | |
| 
 | |
| The methods
 | |
| `push`, `pop`, `shift` and `unshift`
 | |
| will throw if called.
 | |
| Future versions of the library
 | |
| may implement sane behaviour
 | |
| for them.
 | |
| All of the other `Array` methods
 | |
| work normally.
 | |
| 
 | |
| ### Growing the array
 | |
| 
 | |
| ```js
 | |
| hoopy.grow(50);
 | |
| ```
 | |
| 
 | |
| The `grow` method
 | |
| adds items to the array.
 | |
| It takes one argument,
 | |
| which is the number
 | |
| of items to grow the array by.
 | |
| The new length of the array
 | |
| will be the old length
 | |
| plus the number you pass to `grow`.
 | |
| 
 | |
| If the current state of the array
 | |
| includes overflowed indices,
 | |
| `grow` will take care
 | |
| to move those items
 | |
| in to the freshly-created
 | |
| available space,
 | |
| so that the correct order is maintained
 | |
| for your data.
 | |
| 
 | |
| The caller is responsible
 | |
| for ensuring they don't overwrite
 | |
| unprocessed items.
 | |
| If you need to increase
 | |
| the size of the array,
 | |
| you must call `grow`.
 | |
| 
 | |
| ## Is there a change log?
 | |
| 
 | |
| [Yes](CHANGELOG.md).
 | |
| 
 | |
| ## How do I set up the dev environment?
 | |
| 
 | |
| To install the dependencies:
 | |
| 
 | |
| ```
 | |
| npm i
 | |
| ```
 | |
| 
 | |
| To run the tests:
 | |
| 
 | |
| ```
 | |
| npm t
 | |
| ```
 | |
| 
 | |
| To lint the code:
 | |
| 
 | |
| ```
 | |
| npm run lint
 | |
| ```
 | |
| 
 | |
| ## What license is it released under?
 | |
| 
 | |
| [MIT](LICENSE).
 | |
| 
 | 
