Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

fastener

Package Overview
Dependencies
Maintainers
1
Versions
11
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

fastener - npm Package Compare versions

Comparing version 0.2.1 to 0.2.2

.nyc_output/58366.json

14

lib/fastener.js

@@ -20,4 +20,2 @@ "use strict";

var empty = [];
var pass = function pass(x, f) {

@@ -95,7 +93,7 @@ return f(x);

if (isArray(focus)) {
return downIndex(focus, head ? 0 : focus.length - 1, { up: up });
} else if (isObject(focus)) {
if (isObject(focus)) {
var keys = R.keys(focus);
return downIndex(R.values(focus), head ? 0 : keys.length - 1, { keys: keys, up: up });
} else if (isArray(focus)) {
return downIndex(focus, head ? 0 : focus.length - 1, { up: up });
} else {

@@ -112,3 +110,3 @@ return undefined;

var shift = function shift(f, c, t, k) {
return f.length === 0 ? undefined : k(R.dropLast(1, f), R.last(f), R.append(c, t));
return f && f.length !== 0 ? k(R.dropLast(1, f), R.last(f), R.append(c, t)) : undefined;
};

@@ -152,3 +150,3 @@

var toZipper = exports.toZipper = function toZipper(focus) {
return { left: empty, right: empty, focus: focus };
return { focus: focus };
};

@@ -193,2 +191,2 @@

});
//# sourceMappingURL=data:application/json;base64,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ZCxDQUFyQyxDQUR1QjtBQUFBLEdBQUw7QUFBQSxDQUFwQjtBQUVPLElBQU0sa0NBQWEsRUFBRSxLQUFGLENBQVEsVUFBQyxDQUFELEVBQUksQ0FBSjtBQUFBLFNBQ2hDLE9BQU8sQ0FBUCxFQUFVLGNBQWMsUUFBZCxFQUF3QixZQUFZLENBQVosQ0FBeEIsRUFBd0MsQ0FBeEMsQ0FBVixDQURnQztBQUFBLENBQVIsQ0FBbkIiLCJmaWxlIjoiZmFzdGVuZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSIGZyb20gXCJyYW1kYVwiXG5cbmNvbnN0IGVtcHR5ID0gW11cblxuY29uc3QgcGFzcyA9ICh4LCBmKSA9PiBmKHgpXG5cbmNvbnN0IGlzT2JqZWN0ID0geCA9PiB4ICYmIHguY29uc3RydWN0b3IgPT09IE9iamVjdFxuY29uc3QgaXNBcnJheSA9IHggPT4geCAmJiB4LmNvbnN0cnVjdG9yID09PSBBcnJheVxuXG5leHBvcnQgY29uc3QgZ2V0ID0geiA9PiB6LmZvY3VzXG5leHBvcnQgY29uc3Qgc2V0ID0gUi5jdXJyeSgoZm9jdXMsIHopID0+ICh7Li4ueiwgZm9jdXN9KSlcbmV4cG9ydCBjb25zdCBtb2RpZnkgPSBSLmN1cnJ5KChmLCB6KSA9PiBzZXQoZihnZXQoeikpLCB6KSlcblxuZXhwb3J0IGNvbnN0IHVwID0gKHtsZWZ0LCBmb2N1cywgcmlnaHQsIGtleXMsIHVwfSkgPT4ge1xuICBpZiAoa2V5cykge1xuICAgIHJldHVybiB7Zm9jdXM6IFIuemlwT2JqKGtleXMsIFsuLi5sZWZ0LCBmb2N1cywgLi4uUi5yZXZlcnNlKHJpZ2h0KV0pLCAuLi51cH1cbiAgfSBlbHNlIGlmICh1cCkge1xuICAgIHJldHVybiB7Zm9jdXM6IFsuLi5sZWZ0LCBmb2N1cywgLi4uUi5yZXZlcnNlKHJpZ2h0KV0sIC4uLnVwfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxufVxuXG5jb25zdCBkb3duSW5kZXggPSAodmFsdWVzLCBpLCByZXN0KSA9PlxuICAwIDw9IGkgJiYgaSA8IHZhbHVlcy5sZW5ndGhcbiAgPyAoe2xlZnQ6IHZhbHVlcy5zbGljZSgwLCBpKSxcbiAgICAgIGZvY3VzOiB2YWx1ZXNbaV0sXG4gICAgICByaWdodDogdmFsdWVzLnNsaWNlKGkrMSkucmV2ZXJzZSgpLFxuICAgICAgLi4ucmVzdH0pXG4gIDogdW5kZWZpbmVkXG5cbmV4cG9ydCBjb25zdCBkb3duVG8gPSBSLmN1cnJ5KChrLCB7Zm9jdXMsIC4uLnVwfSkgPT4ge1xuICBpZiAoaXNPYmplY3QoZm9jdXMpKSB7XG4gICAgY29uc3Qga2V5cyA9IFIua2V5cyhmb2N1cylcbiAgICByZXR1cm4gZG93bkluZGV4KFIudmFsdWVzKGZvY3VzKSwga2V5cy5maW5kSW5kZXgoUi5lcXVhbHMoaykpLCB7a2V5cywgdXB9KVxuICB9IGVsc2UgaWYgKGlzQXJyYXkoZm9jdXMpKSB7XG4gICAgcmV0dXJuIGRvd25JbmRleChmb2N1cywgaywge3VwfSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn0pXG5cbmV4cG9ydCBjb25zdCBrZXlPZiA9ICh7bGVmdCwga2V5cywgdXB9KSA9PlxuICBrZXlzID8ga2V5c1tsZWZ0Lmxlbmd0aF0gOlxuICB1cCAgID8gbGVmdC5sZW5ndGggOlxuICB1bmRlZmluZWRcblxuY29uc3QgZG93bk1vc3QgPSBoZWFkID0+ICh7Zm9jdXMsIC4uLnVwfSkgPT4ge1xuICBpZiAoaXNBcnJheShmb2N1cykpIHtcbiAgICByZXR1cm4gZG93bkluZGV4KGZvY3VzLCBoZWFkID8gMCA6IGZvY3VzLmxlbmd0aC0xLCB7dXB9KVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGZvY3VzKSkge1xuICAgIGNvbnN0IGtleXMgPSBSLmtleXMoZm9jdXMpXG4gICAgcmV0dXJuIGRvd25JbmRleChSLnZhbHVlcyhmb2N1cyksIGhlYWQgPyAwIDoga2V5cy5sZW5ndGgtMSwge2tleXMsIHVwfSlcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGRvd25IZWFkID0gZG93bk1vc3QodHJ1ZSlcbmV4cG9ydCBjb25zdCBkb3duTGFzdCA9IGRvd25Nb3N0KGZhbHNlKVxuXG4vLyBGWUk6IFRoZSBsZWZ0IGFuZCByaWdodCBvcHMgYXJlIG5vdCBhY2NpZGVudGFsbHkgTyhuKS4gIEknbSBqdXN0IGxhenkuIDopXG5jb25zdCBzaGlmdCA9IChmLCBjLCB0LCBrKSA9PlxuICBmLmxlbmd0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IGsoUi5kcm9wTGFzdCgxLCBmKSwgUi5sYXN0KGYpLCBSLmFwcGVuZChjLCB0KSlcblxuZXhwb3J0IGNvbnN0IGxlZnQgPSAoe2xlZnQsIGZvY3VzLCByaWdodCwgLi4ucmVzdH0pID0+XG4gIHNoaWZ0KGxlZnQsIGZvY3VzLCByaWdodCwgKGwsIGYsIHIpID0+ICh7bGVmdDogbCwgZm9jdXM6IGYsIHJpZ2h0OiByLCAuLi5yZXN0fSkpXG5cbmV4cG9ydCBjb25zdCByaWdodCA9ICh7bGVmdCwgZm9jdXMsIHJpZ2h0LCAuLi5yZXN0fSkgPT5cbiAgc2hpZnQocmlnaHQsIGZvY3VzLCBsZWZ0LCAociwgZiwgbCkgPT4gKHtsZWZ0OiBsLCBmb2N1czogZiwgcmlnaHQ6IHIsIC4uLnJlc3R9KSlcblxuZXhwb3J0IGNvbnN0IGhlYWQgPSB6ID0+IHBhc3ModXAoeiksIHogPT4geiAmJiBkb3duSGVhZCh6KSlcbmV4cG9ydCBjb25zdCBsYXN0ID0geiA9PiBwYXNzKHVwKHopLCB6ID0+IHogJiYgZG93bkxhc3QoeikpXG5cbmV4cG9ydCBjb25zdCB0b1ppcHBlciA9IGZvY3VzID0+ICh7bGVmdDogZW1wdHksIHJpZ2h0OiBlbXB0eSwgZm9jdXN9KVxuXG5leHBvcnQgY29uc3QgZnJvbVppcHBlciA9IHogPT5cbiAgcGFzcyh1cCh6KSwgenogPT4genogPyBmcm9tWmlwcGVyKHp6KSA6IGdldCh6KSlcblxuZXhwb3J0IGNvbnN0IHF1ZXJ5TW92ZSA9IFIuY3VycnkoKG1vdmUsIGIsIGYsIHopID0+XG4gIHBhc3MobW92ZSh6KSwgeiA9PiB6ID8gZih6KSA6IGIpKVxuXG5jb25zdCBid2QgPSAobW92ZSwgeikgPT4ge1xuICBzd2l0Y2ggKG1vdmUpIHtcbiAgICBjYXNlIGxlZnQ6IHJldHVybiByaWdodFxuICAgIGNhc2UgcmlnaHQ6IHJldHVybiBsZWZ0XG4gICAgY2FzZSB1cDogcmV0dXJuIGRvd25UbyhrZXlPZih6KSlcbiAgICBkZWZhdWx0OiByZXR1cm4gdXBcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtTW92ZSA9IFIuY3VycnkoKG1vdmUsIGYsIHopID0+XG4gIHF1ZXJ5TW92ZShtb3ZlLCB6LCBSLnBpcGUoZiwgcXVlcnlNb3ZlKGJ3ZChtb3ZlLCB6KSwgeiwgUi5pZGVudGl0eSkpLCB6KSlcblxuY29uc3QgZXZlcnl3aGVyZUcgPSBmID0+IHogPT5cbiAgdHJhbnNmb3JtTW92ZShyaWdodCwgZXZlcnl3aGVyZUcoZiksIGV2ZXJ5d2hlcmUoZiwgeikpXG5leHBvcnQgY29uc3QgZXZlcnl3aGVyZSA9IFIuY3VycnkoKGYsIHopID0+XG4gIG1vZGlmeShmLCB0cmFuc2Zvcm1Nb3ZlKGRvd25IZWFkLCBldmVyeXdoZXJlRyhmKSwgeikpKVxuIl19
//# sourceMappingURL=data:application/json;base64,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QWEsRUFBRSxLQUFGLENBQVEsVUFBQyxDQUFELEVBQUksQ0FBSjtBQUFBLFNBQ2hDLE9BQU8sQ0FBUCxFQUFVLGNBQWMsUUFBZCxFQUF3QixZQUFZLENBQVosQ0FBeEIsRUFBd0MsQ0FBeEMsQ0FBVixDQURnQztBQUFBLENBQVIsQ0FBbkIiLCJmaWxlIjoiZmFzdGVuZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSIGZyb20gXCJyYW1kYVwiXG5cbmNvbnN0IHBhc3MgPSAoeCwgZikgPT4gZih4KVxuXG5jb25zdCBpc09iamVjdCA9IHggPT4geCAmJiB4LmNvbnN0cnVjdG9yID09PSBPYmplY3RcbmNvbnN0IGlzQXJyYXkgPSB4ID0+IHggJiYgeC5jb25zdHJ1Y3RvciA9PT0gQXJyYXlcblxuZXhwb3J0IGNvbnN0IGdldCA9IHogPT4gei5mb2N1c1xuZXhwb3J0IGNvbnN0IHNldCA9IFIuY3VycnkoKGZvY3VzLCB6KSA9PiAoey4uLnosIGZvY3VzfSkpXG5leHBvcnQgY29uc3QgbW9kaWZ5ID0gUi5jdXJyeSgoZiwgeikgPT4gc2V0KGYoZ2V0KHopKSwgeikpXG5cbmV4cG9ydCBjb25zdCB1cCA9ICh7bGVmdCwgZm9jdXMsIHJpZ2h0LCBrZXlzLCB1cH0pID0+IHtcbiAgaWYgKGtleXMpIHtcbiAgICByZXR1cm4ge2ZvY3VzOiBSLnppcE9iaihrZXlzLCBbLi4ubGVmdCwgZm9jdXMsIC4uLlIucmV2ZXJzZShyaWdodCldKSwgLi4udXB9XG4gIH0gZWxzZSBpZiAodXApIHtcbiAgICByZXR1cm4ge2ZvY3VzOiBbLi4ubGVmdCwgZm9jdXMsIC4uLlIucmV2ZXJzZShyaWdodCldLCAuLi51cH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbn1cblxuY29uc3QgZG93bkluZGV4ID0gKHZhbHVlcywgaSwgcmVzdCkgPT5cbiAgMCA8PSBpICYmIGkgPCB2YWx1ZXMubGVuZ3RoXG4gID8gKHtsZWZ0OiB2YWx1ZXMuc2xpY2UoMCwgaSksXG4gICAgICBmb2N1czogdmFsdWVzW2ldLFxuICAgICAgcmlnaHQ6IHZhbHVlcy5zbGljZShpKzEpLnJldmVyc2UoKSxcbiAgICAgIC4uLnJlc3R9KVxuICA6IHVuZGVmaW5lZFxuXG5leHBvcnQgY29uc3QgZG93blRvID0gUi5jdXJyeSgoaywge2ZvY3VzLCAuLi51cH0pID0+IHtcbiAgaWYgKGlzT2JqZWN0KGZvY3VzKSkge1xuICAgIGNvbnN0IGtleXMgPSBSLmtleXMoZm9jdXMpXG4gICAgcmV0dXJuIGRvd25JbmRleChSLnZhbHVlcyhmb2N1cyksIGtleXMuZmluZEluZGV4KFIuZXF1YWxzKGspKSwge2tleXMsIHVwfSlcbiAgfSBlbHNlIGlmIChpc0FycmF5KGZvY3VzKSkge1xuICAgIHJldHVybiBkb3duSW5kZXgoZm9jdXMsIGssIHt1cH0pXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG59KVxuXG5leHBvcnQgY29uc3Qga2V5T2YgPSAoe2xlZnQsIGtleXMsIHVwfSkgPT5cbiAga2V5cyA/IGtleXNbbGVmdC5sZW5ndGhdIDpcbiAgdXAgICA/IGxlZnQubGVuZ3RoIDpcbiAgdW5kZWZpbmVkXG5cbmNvbnN0IGRvd25Nb3N0ID0gaGVhZCA9PiAoe2ZvY3VzLCAuLi51cH0pID0+IHtcbiAgaWYgKGlzT2JqZWN0KGZvY3VzKSkge1xuICAgIGNvbnN0IGtleXMgPSBSLmtleXMoZm9jdXMpXG4gICAgcmV0dXJuIGRvd25JbmRleChSLnZhbHVlcyhmb2N1cyksIGhlYWQgPyAwIDoga2V5cy5sZW5ndGgtMSwge2tleXMsIHVwfSlcbiAgfSBlbHNlIGlmIChpc0FycmF5KGZvY3VzKSkge1xuICAgIHJldHVybiBkb3duSW5kZXgoZm9jdXMsIGhlYWQgPyAwIDogZm9jdXMubGVuZ3RoLTEsIHt1cH0pXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZFxuICB9XG59XG5cbmV4cG9ydCBjb25zdCBkb3duSGVhZCA9IGRvd25Nb3N0KHRydWUpXG5leHBvcnQgY29uc3QgZG93bkxhc3QgPSBkb3duTW9zdChmYWxzZSlcblxuLy8gRllJOiBUaGUgbGVmdCBhbmQgcmlnaHQgb3BzIGFyZSBub3QgYWNjaWRlbnRhbGx5IE8obikuICBJJ20ganVzdCBsYXp5LiA6KVxuY29uc3Qgc2hpZnQgPSAoZiwgYywgdCwgaykgPT5cbiAgZiAmJiBmLmxlbmd0aCAhPT0gMCA/IGsoUi5kcm9wTGFzdCgxLCBmKSwgUi5sYXN0KGYpLCBSLmFwcGVuZChjLCB0KSkgOiB1bmRlZmluZWRcblxuZXhwb3J0IGNvbnN0IGxlZnQgPSAoe2xlZnQsIGZvY3VzLCByaWdodCwgLi4ucmVzdH0pID0+XG4gIHNoaWZ0KGxlZnQsIGZvY3VzLCByaWdodCwgKGwsIGYsIHIpID0+ICh7bGVmdDogbCwgZm9jdXM6IGYsIHJpZ2h0OiByLCAuLi5yZXN0fSkpXG5cbmV4cG9ydCBjb25zdCByaWdodCA9ICh7bGVmdCwgZm9jdXMsIHJpZ2h0LCAuLi5yZXN0fSkgPT5cbiAgc2hpZnQocmlnaHQsIGZvY3VzLCBsZWZ0LCAociwgZiwgbCkgPT4gKHtsZWZ0OiBsLCBmb2N1czogZiwgcmlnaHQ6IHIsIC4uLnJlc3R9KSlcblxuZXhwb3J0IGNvbnN0IGhlYWQgPSB6ID0+IHBhc3ModXAoeiksIHogPT4geiAmJiBkb3duSGVhZCh6KSlcbmV4cG9ydCBjb25zdCBsYXN0ID0geiA9PiBwYXNzKHVwKHopLCB6ID0+IHogJiYgZG93bkxhc3QoeikpXG5cbmV4cG9ydCBjb25zdCB0b1ppcHBlciA9IGZvY3VzID0+ICh7Zm9jdXN9KVxuXG5leHBvcnQgY29uc3QgZnJvbVppcHBlciA9IHogPT5cbiAgcGFzcyh1cCh6KSwgenogPT4genogPyBmcm9tWmlwcGVyKHp6KSA6IGdldCh6KSlcblxuZXhwb3J0IGNvbnN0IHF1ZXJ5TW92ZSA9IFIuY3VycnkoKG1vdmUsIGIsIGYsIHopID0+XG4gIHBhc3MobW92ZSh6KSwgeiA9PiB6ID8gZih6KSA6IGIpKVxuXG5jb25zdCBid2QgPSAobW92ZSwgeikgPT4ge1xuICBzd2l0Y2ggKG1vdmUpIHtcbiAgICBjYXNlIGxlZnQ6IHJldHVybiByaWdodFxuICAgIGNhc2UgcmlnaHQ6IHJldHVybiBsZWZ0XG4gICAgY2FzZSB1cDogcmV0dXJuIGRvd25UbyhrZXlPZih6KSlcbiAgICBkZWZhdWx0OiByZXR1cm4gdXBcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtTW92ZSA9IFIuY3VycnkoKG1vdmUsIGYsIHopID0+XG4gIHF1ZXJ5TW92ZShtb3ZlLCB6LCBSLnBpcGUoZiwgcXVlcnlNb3ZlKGJ3ZChtb3ZlLCB6KSwgeiwgUi5pZGVudGl0eSkpLCB6KSlcblxuY29uc3QgZXZlcnl3aGVyZUcgPSBmID0+IHogPT5cbiAgdHJhbnNmb3JtTW92ZShyaWdodCwgZXZlcnl3aGVyZUcoZiksIGV2ZXJ5d2hlcmUoZiwgeikpXG5leHBvcnQgY29uc3QgZXZlcnl3aGVyZSA9IFIuY3VycnkoKGYsIHopID0+XG4gIG1vZGlmeShmLCB0cmFuc2Zvcm1Nb3ZlKGRvd25IZWFkLCBldmVyeXdoZXJlRyhmKSwgeikpKVxuIl19
{
"name": "fastener",
"version": "0.2.1",
"version": "0.2.2",
"description": "Zipper for manipulating JSON",
"main": "lib/fastener.js",
"scripts": {
"bench": "node bench/bench.js",
"dist": "babel src --source-maps inline --out-dir lib",

@@ -18,4 +17,9 @@ "lint": "eslint src test",

"keywords": [
"zipper",
"json"
"cursor",
"functional",
"immutable",
"json",
"query",
"transform",
"zipper"
],

@@ -36,3 +40,2 @@ "license": "MIT",

"babel-preset-stage-2": "^6.5.0",
"benchmark": "^2.1.0",
"eslint": "^2.8.0",

@@ -39,0 +42,0 @@ "mocha": "^2.4.5",

@@ -13,2 +13,211 @@ [ [Tutorial](#tutorial) | [Reference](#reference) | [Related Work](#related-work) ]

Playing with zippers in a REPL can be very instructive. First we require the
libraries and define a little helper using
[`reduce`](http://ramdajs.com/0.21.0/docs/#reduce) to perform a sequence of
operations on a value:
```js
const R = require("ramda")
const F = require("fastener")
const seq = (x, ...fs) => R.reduce((x, f) => f(x), x, fs)
```
Let's work with the following simple JSON object:
```js
const data = { contents: [ { language: "en", text: "Title" },
{ language: "sv", text: "Rubrik" } ] }
```
First we just create a zipper using [`F.toZipper`](#toZipper):
```js
seq(F.toZipper(data))
// { focus: { contents: [ [Object], [Object] ] } }
```
As can be seen, the zipper is just a simple JSON object and the `focus` is the
`data` object that we gave to [`F.toZipper`](#toZipper). However, you should
use the zipper combinators to operate on zippers rather than rely on their exact
format.
Let's then move into the `contents` property of the object using
[`F.downTo`](#downTo):
```js
seq(F.toZipper(data),
F.downTo('contents'))
// { left: [],
// focus:
// [ { language: 'en', text: 'Title' },
// { language: 'sv', text: 'Rubrik' } ],
// right: [],
// keys: [ 'contents' ],
// up: {} }
```
As seen above, the `focus` now has the `contents` array. We can use
[`F.get`](#get) to extract the value under focus:
```js
seq(F.toZipper(data),
F.downTo('contents'),
F.get)
// [ { language: 'en', text: 'Title' },
// { language: 'sv', text: 'Rubrik' } ]
```
Then we move into the first item of `contents` using [`F.downHead`](#downHead):
```js
seq(F.toZipper(data),
F.downTo('contents'),
F.downHead)
// { left: [],
// focus: { language: 'en', text: 'Title' },
// right: [ { language: 'sv', text: 'Rubrik' } ],
// up: { left: [], right: [], keys: [ 'contents' ], up: {} } }
```
And continue into the first item of that which happens to the `language`:
```js
seq(F.toZipper(data),
F.downTo('contents'),
F.downHead,
F.downHead)
// { left: [],
// focus: 'en',
// right: [ 'Title' ],
// keys: [ 'language', 'text' ],
// up:
// { left: [],
// right: [ [Object] ],
// up: { left: [], right: [], keys: [Object], up: {} } } }
```
And to the next item, `title`, using [`F.right`](#right):
```js
seq(F.toZipper(data),
F.downTo('contents'),
F.downHead,
F.downHead,
F.right)
// { left: [ 'en' ],
// focus: 'Title',
// right: [],
// keys: [ 'language', 'text' ],
// up:
// { left: [],
// right: [ [Object] ],
// up: { left: [], right: [], keys: [Object], up: {} } } }
```
Let's then use [`F.modify`](#modify) to modify the `title`:
```js
seq(F.toZipper(data),
F.downTo('contents'),
F.downHead,
F.downHead,
F.right,
F.modify(t => "The " + t))
// { left: [ 'en' ],
// focus: 'The Title',
// right: [],
// keys: [ 'language', 'text' ],
// up:
// { left: [],
// right: [ [Object] ],
// up: { left: [], right: [], keys: [Object], up: {} } } }
```
When we now move outwards using [`F.up`](#up) we can see the changed title
become part of the data:
```js
seq(F.toZipper(data),
F.downTo('contents'),
F.downHead,
F.downHead,
F.right,
F.modify(t => "The " + t),
F.up)
// { focus: { language: 'en', text: 'The Title' },
// left: [],
// right: [ { language: 'sv', text: 'Rubrik' } ],
// up: { left: [], right: [], keys: [ 'contents' ], up: {} } }
```
We can also just move back to the root and get the updated data structure using
[`F.fromZipper`](#fromZipper):
```js
seq(F.toZipper(data),
F.downTo('contents'),
F.downHead,
F.downHead,
F.right,
F.modify(t => "The " + t),
F.fromZipper)
// { contents:
// [ { language: 'en', text: 'The Title' },
// { language: 'sv', text: 'Rubrik' } ] }
```
The above hopefully helped to understand how zippers work. However, it is
important to realize that one typically does not use zipper combinators to
create such a specific sequence of operations. One rather uses the zipper
combinators to create new combinators that perform more complex operations
directly.
Let's first define a zipper combinator that, given a zipper focused on an array,
tries to focus on an element inside the array that satisfies a given predicate:
```js
const find = R.curry((p, z) =>
F.downTo(R.findIndex(p, F.get(z)), z))
```
Like all the basic zipper movement combinators, [`F.downTo`](#downTo) is a
*partial function* that returns `undefined` in case the index is out of bounds.
Let's define a simple function to compose partial functions:
```js
const pipeU = (...fs) => z => {
let r = z
for (let i=0; r !== undefined && i<fs.length; ++i)
r = fs[i](r)
return r
}
```
We can now compose a zipper combinator that, given a zipper focused on an object
like `data`, tries to focus on the `text` element of an object with the given
`language` inside the `contents`:
```js
const textIn = language =>
pipeU(F.downTo('contents'),
find(r => r.language === language),
F.downTo('text'))
```
Now we can say:
```js
pipeU(F.toZipper, textIn("en"), F.modify(x => 'The ' + x), F.fromZipper)(data)
// { contents:
// [ { language: 'en', text: 'The Title' },
// { language: 'sv', text: 'Rubrik' } ] }
```
Of course, this just scratches the surface. Zippers are powerful enough to
implement arbitrary transforms on data structures. This can also make them more
difficult to compose and reason about than more limited approaches such as
[lenses](https://github.com/calmm-js/partial.lenses).
## Reference

@@ -15,0 +224,0 @@

import * as R from "ramda"
const empty = []
const pass = (x, f) => f(x)

@@ -49,7 +47,7 @@

const downMost = head => ({focus, ...up}) => {
if (isArray(focus)) {
return downIndex(focus, head ? 0 : focus.length-1, {up})
} else if (isObject(focus)) {
if (isObject(focus)) {
const keys = R.keys(focus)
return downIndex(R.values(focus), head ? 0 : keys.length-1, {keys, up})
} else if (isArray(focus)) {
return downIndex(focus, head ? 0 : focus.length-1, {up})
} else {

@@ -65,3 +63,3 @@ return undefined

const shift = (f, c, t, k) =>
f.length === 0 ? undefined : k(R.dropLast(1, f), R.last(f), R.append(c, t))
f && f.length !== 0 ? k(R.dropLast(1, f), R.last(f), R.append(c, t)) : undefined

@@ -77,3 +75,3 @@ export const left = ({left, focus, right, ...rest}) =>

export const toZipper = focus => ({left: empty, right: empty, focus})
export const toZipper = focus => ({focus})

@@ -80,0 +78,0 @@ export const fromZipper = z =>

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc