# Firestruct

## Install:
```shell
npm install firestruct
```

## Usage:
```
import Firestruct from "firestruct";

const count = c => c.value();
const increment = c => c.update(i => i + 1);

const fs = new Firestruct("https://test.firebaseio.com/clickcount");

fs.on("swap", (newCursor, oldCursor, path) => {
    const clicksCursor = newCursor.cursor("clicks");

    React.render(
        <ClickCount
            count={ count(clicksCursor) }
            onClick={ event => increment(clicksCursor) } />,
        document.body
    );
);

```


## API:


### Structure

#### `on(eventName, callback)`
Event handler. Provides callback with 3 arguments:
* newCursor
* oldCursor
* changePath *TODO*

Events:
* `"swap"`: data change

#### `structure._fb`
Deprecated. Reference to raw Firebase object.

Please make note of any use; it should be unnecessary for all but Auth.


### Cursor
Cursors are immutable references to the current structure.

#### `cursor.cursor(path)`
Returns a new cursor.

`path` is an array/string pointing to a child location.

#### `cursor.value()`
Returns the value of the current cursor

#### `cursor.update(callback)`
Replaces the value of the current cursor with the return value of `callback`. *TODO: Returns the new cursor.*

`callback` is provided with the current value of the cursor as the first argument.

* New branches may be created by selecting a non-existant path, then calling `update` with some data.

* Old branches may be deleted by selecting a path, then setting it as `undefined`.

#### `cursor.cursors()`
Convenience function. Returns an array of child `[key, cursor]` pairs.

#### `cursor._fb`
Deprecated. Reference to raw Firebase snapshot.

Please make note of any use; it should be unnecessary.
Tree-climbing and current node keys will never be supported.
