Research
Security News
Malicious npm Packages Inject SSH Backdoors via Typosquatted Libraries
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
@thi.ng/zipper
Advanced tools
@thi.ng/zipper is a TypeScript library for creating and manipulating zipper data structures. Zippers are a functional programming technique for traversing and updating immutable data structures efficiently. This package provides utilities to work with tree-like structures, allowing for easy navigation, updates, and transformations.
Creating a Zipper
This feature allows you to create a zipper from a tree structure. The `fromTree` function takes a tree and a function to access the children of a node. The resulting zipper allows for efficient traversal and updates.
const { fromTree } = require('@thi.ng/zipper');
const tree = { value: 1, children: [{ value: 2 }, { value: 3 }] };
const zipper = fromTree(tree, x => x.children);
console.log(zipper.node); // { value: 1, children: [ { value: 2 }, { value: 3 } ] }
Navigating a Zipper
This feature allows you to navigate through the tree structure using the zipper. The `down` function moves to the first child, and the `right` function moves to the next sibling.
const { down, right } = require('@thi.ng/zipper');
const tree = { value: 1, children: [{ value: 2 }, { value: 3 }] };
const zipper = fromTree(tree, x => x.children);
const childZipper = down(zipper);
console.log(childZipper.node); // { value: 2 }
const siblingZipper = right(childZipper);
console.log(siblingZipper.node); // { value: 3 }
Updating a Zipper
This feature allows you to update the current node in the zipper. The `edit` function takes a zipper and a function to update the node, returning a new zipper with the updated node.
const { edit } = require('@thi.ng/zipper');
const tree = { value: 1, children: [{ value: 2 }, { value: 3 }] };
const zipper = fromTree(tree, x => x.children);
const updatedZipper = edit(zipper, node => ({ ...node, value: 42 }));
console.log(updatedZipper.node); // { value: 42, children: [ { value: 2 }, { value: 3 } ] }
The `immutable` package provides persistent immutable data structures for JavaScript, including List, Map, and Set. While it does not specifically focus on zippers, it offers efficient updates and traversals for immutable data structures, similar to the functionality provided by @thi.ng/zipper.
Mori is a library that brings ClojureScript's persistent data structures and supporting API to JavaScript. It includes various data structures like List, Vector, and Map, and provides efficient updates and traversals. Like @thi.ng/zipper, it focuses on immutability and functional programming techniques.
Seamless-immutable is a small library for creating deeply immutable data structures in JavaScript. It provides utilities for working with immutable objects and arrays, offering efficient updates and traversals. While it does not specifically implement zippers, it shares the goal of immutability and efficient data manipulation with @thi.ng/zipper.
[!NOTE] This is one of 199 standalone projects, maintained as part of the @thi.ng/umbrella monorepo and anti-framework.
🚀 Please help me to work full-time on these projects by sponsoring me on GitHub. Thank you! ❤️
Functional tree editing, manipulation & navigation.
Immutable, semi-functional, structural tree editing, manipulation & navigation, based on my fork and optimizations to fast-zip, which in turn is based on clojure.zip and which itself is based on the original data structure invented by Gérard Huet in 1997.
Reference: https://en.wikipedia.org/wiki/Zipper_(data_structure)
STABLE - used in production
Search or submit any issues for this package
yarn add @thi.ng/zipper
ESM import:
import * as zip from "@thi.ng/zipper";
Browser ESM import:
<script type="module" src="https://esm.run/@thi.ng/zipper"></script>
For Node.js REPL:
const zip = await import("@thi.ng/zipper");
Package sizes (brotli'd, pre-treeshake): ESM: 1.02 KB
Note: @thi.ng/api is in most cases a type-only import (not used at runtime)
import { arrayZipper } from "@thi.ng/zipper";
const x = [1, [5, 4, 3, 2], 6];
// create zipper for given array
const a = arrayZipper(x);
// .next navigates to logically next location (depth-first)
// .node retrieves a location's value
a.next.node
// 1
a.next.next.node
// [5, 4, 3, 2]
// all navigation verbs:
// prev, left, right, up, down, leftmost, rightmost
a.next.next.down.rightmost.node
// 2
// navigate to value `3`, remove it
// then append `7` at top level
// and apply changes by requesting root value
// (the latter is the actual zip operation)
a.next.next.down.rightmost.left.remove().up.up.appendChild(7).root
// [ 1, [ 5, 4, 2 ], 6, 7 ]
// the same edits in different order
a.appendChild(7).next.next.down.rightmost.left.remove().root
// [ 1, [ 5, 4, 2 ], 6, 7 ]
// insert child at the front
a.next.next.insertChild(10).root
// [ 1, [ 10, 5, 4, 3, 2 ], 6 ]
// replace the nested array
a.next.next.replace(10).root
// [1, 10, 6]
// all editing is immutable, original is untouched...
x
// [ 1, [ 5, 4, 3, 2 ], 6 ]
For better comparison, the included benchmarks are also ported from the fast-zip package and measure traversal & editing of a tree of 10 x 10 x 10 values.
Measurements for MBP 2015 2.8GHz, 16GB, node v12.10.0:
$ node bench/index.js
walk:
warmup... 2562ms
warmup... 2469ms
warmup... 2460ms
total: 2476ms, mean: 0.2476ms, runs: 10000
edit:
warmup... 4660ms
warmup... 4573ms
warmup... 4566ms
total: 4616ms, mean: 0.4616ms, runs: 10000
If this project contributes to an academic publication, please cite it as:
@misc{thing-zipper,
title = "@thi.ng/zipper",
author = "Karsten Schmidt",
note = "https://thi.ng/zipper",
year = 2015
}
© 2015 - 2024 Karsten Schmidt // Apache License 2.0
FAQs
Functional tree editing, manipulation & navigation
We found that @thi.ng/zipper demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.