Javascript Zipper Library
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
dist
dist_node
examples
lib
tests
.gitignore
.gitmodules
CHANGELOG.md
LICENSE
README.md
index.js
package.json
test.js

README.md

Neith - Javascript Zipper Library

About

Neith is a zipper library for Javascript. Zippers allow efficient manipulation of immutable, hierarchical data structures through a formalized interface.

Neith supports zippers for lazy, infinite data structures. The tree module supports zippers for variations of n-ary ordered trees with labeled edges.

Links

Overview

Example are written in Khepri but regular JS will work fine with Neith.

with
    import 'neith::zipper' zipper,
    import 'neith::tree' tree,
    import 'neith::walk' walk,
    
    import 'nu::stream' stream
in {

/// Define a new zipper type for json type objects.
var objZipper = tree.treeZipper @ (
    Object.keys \> stream.from,
    (.)
    \_ _ children -> children());

/// Create a new zipper
var o = {'a': 1, 'b': {'c': 2, 'd': 3}};
var z = objZipper o;

/// Move around and extract info
z
    |> zipper.down
    |> tree.node; // 1

z
    |> zipper.down
    |> zipper.right
    |> tree.node; // {'c': 2, 'd': 3}
    
z
    |> zipper.down
    |> zipper.right
    |> zipper.down
    |> tree.edge; // 'c'


/// Labeled movement for trees
z
    |> tree.child @ 'b'
    |> tree.child @ 'd'
    |> tree.node; // 3

/// Editing
// The original object is never modified.
// Neith zippers and operations are persistent.
z
    |> tree.child @ 'b'
    |> tree.child @ 'd'
    |> tree.modifyNode @ (+, 10)
    |> tree.sibling @ 'c'
    |> (tree.modifyEdge @ \e -> e + 'xyz')
    |> zipper.up
    |> tree.sibling @ 'a'
    |> zipper.remove
    |> zipper.root
    |> tree.node; // {'b': {'cxyz': 2, 'd': 13}}

/// Walk in DFS order
walk.preWalk(console.log, z);
/*
Output:
Pair(null, {'a': 1, 'b': {'c': 2, 'd': 3}});
Pair('a', 1)
Pair('b', {'c': 2, 'd': 3})
Pair('c', 2)
Pair('d', 3)
*/
}

Using Neith

With node

Library code is in dist_node directory.

$ npm install neith

var zipper = require('neith').zipper;
var listZipper = require('neith').list;

var z = listZipper.arrayZipper([1, 2, 3]);
zipper.extract(zipper.down(z)); // 1

With AMD

Library code is in dist directory. Include any AMD style module loader and load neith:

<!DOCTYPE html>
<html>
<head></head>
<body>
    <script type="application/javascript" src="require.js"></script>
    <script type="application/javascript">
        requirejs.config({
            paths: {
                'nu-stream': 'nu/dist',
                'neith': 'neith/dist'
            }
        });
        require(['neith/zipper'], function(zipper) {
            ...
        });
    </script>
</body>

Code

Neith is written in Javascript / Khepri. Khepri is a ECMAScript subset that, among other things, adds a shorted lambda function syntax. dist contains the generated Javascript files while lib contains the source Khepri files.