# List Type for [Yjs](https://github.com/y-js/yjs) Manage list-like data with this shareable list type. You can insert and delete arbitrary objects (also custom types for Yjs) in the list type. ## Use it! Retrieve this with bower or npm. ##### Bower ``` bower install y-list --save ``` and include the js library. ``` ``` ##### NPM ``` npm install y-list --save ``` and put it on the `Y` object. ``` Y.List = require("y-list"); ``` ### List Object ##### Reference * Create ``` var ylist = new Y.List() ``` * .insert(position, content) * Insert content at a position * .insertContents(position, contents) * Insert a set of content at a position. This expects that contents is an array of content. * .push(content) * Insert content at the end of the list * .delete(position, length) * Delete content. The *length* parameter is optional and defaults to 1 * .val() * Retrieve all content as an Array Object * .val(position) * Retrieve content from a position * .ref(position) * Retrieve a reference to the element on a *position*. * You can call `ref.getNext()` and `ref.getPrev()` to get the next/previous reference * You can call `ref.getNext(i)` and `ref.getPrev(i)` to get the i-th next/previous reference * You can call `ref.val()` to get the element, to which the reference points (`y.ref(1).val() === y.val(1)`) * .observe(f) * The observer is called whenever something on this list changed. (throws insert, and delete events) * .unobserve(f) * Delete an observer # A note on intention preservation If two users insert something at the same position concurrently, the content that was inserted by the user with the higher user-id will be to the right of the other content. In the OT world we often speak of *intention preservation*, which is very loosely defined in most cases. This type has the following notion of intention preservation: When a user inserts content *c* after a set of content *C_left*, and before a set of content *C_right*, then *C_left* will be always to the left of c, and *C_right* will be always to the right of *c*. This property will also hold when content is deleted or when a deletion is undone. # A note on time complexities * .insert(position, content) * O(position) * .insertContents(position, contents) * O(position + |contents|) * .push(content) * O(1) * .delete(position, length) * O(position) * .val() * O(|ylist|) * .val(position) * O(position|) * Apply a delete operation from another user * O(1) * Apply an insert operation from another user * Yjs does not transform against operations that do not conflict with each other. * An operation conflicts with another operation if it intends to be inserted at the same position. * Overall worst case complexety: O(|conflicts|!) # Issues * Support moving of objects * Create a polymer element ## License Yjs is licensed under the [MIT License](./LICENSE.txt).