1.6.6 • Published 9 years ago

neith v1.6.6

Weekly downloads
5
License
MIT
Repository
github
Last release
9 years ago

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.

1.6.6

9 years ago

1.6.5

10 years ago

1.6.4

10 years ago

1.6.3

10 years ago

1.6.2

10 years ago

1.6.1

10 years ago

1.6.0

10 years ago

1.5.1

10 years ago

1.5.0

10 years ago

1.4.2

10 years ago

1.4.1

10 years ago

1.4.0

10 years ago

1.3.0

10 years ago

1.2.0

10 years ago

1.1.0

10 years ago