New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

immutable-lens

Package Overview
Dependencies
Maintainers
1
Versions
30
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

immutable-lens - npm Package Compare versions

Comparing version 0.0.1 to 0.0.2

lib/DefaultValueLens.d.ts

23

lib/Lens.d.ts

@@ -0,10 +1,15 @@

export interface NotAnArray {
reduceRight?: 'NotAnArray';
}
export interface ValueUpdater<V> {
(value: V): V;
}
export declare type FieldsUpdater<T> = object & {
[K in keyof T]?: T[K] | ValueUpdater<T[K]>;
export declare type FieldValues<T> = object & NotAnArray & {
[K in keyof T]?: T[K];
};
export declare type FieldUpdaters<T> = object & NotAnArray & {
[K in keyof T]?: ValueUpdater<T[K]>;
};
export interface Lens<T, Target> {
focusOn<TO extends T & object, K extends keyof Target>(this: Lens<TO, Target>, key: K): Lens<T, Target[K]>;
focusAt<NewTarget>(lens: Lens<Target, NewTarget>): Lens<T, NewTarget>;
focusOn<K extends keyof Target>(this: Lens<T, Target & NotAnArray>, key: K): Lens<T, Target[K]>;
focusIndex<Item>(this: Lens<T, Item[]>, index: number): Lens<T, Item | undefined>;

@@ -14,5 +19,9 @@ read(source: T): Target;

update(source: T, updater: ValueUpdater<Target>): T;
updateFields(this: Lens<T, Target & object>, source: T, fields: FieldsUpdater<Target>): T;
setFieldValues(this: Lens<T, Target & NotAnArray>, source: T, fields: FieldValues<Target>): T;
updateFields(this: Lens<T, Target & NotAnArray>, source: T, updaters: FieldUpdaters<Target>): T;
getPath(): string;
defaultTo<SafeTarget extends Target>(this: Lens<T, SafeTarget | undefined>, value: SafeTarget): Lens<T, SafeTarget>;
}
export declare type UnfocusedLens<T> = Lens<T, T>;
export declare function createLens<T extends object>(sample?: T): UnfocusedLens<T>;
export interface UnfocusedLens<T> extends Lens<T, T> {
}
export declare function createLens<T extends object>(instance?: T): UnfocusedLens<T>;
"use strict";
var __assign = (this && this.__assign) || Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
Object.defineProperty(exports, "__esModule", { value: true });
function createLens(sample) {
return {
focusOn: function (key) {
return focusLens(this, key);
},
read: function (source) {
return source;
},
setValue: function (source, newValue) {
return newValue;
},
update: function (source, updater) {
return updater(source);
},
updateFields: function (source, fields) {
return updateFields(source, fields);
}
};
var RootLens_1 = require("./RootLens");
function createLens(instance) {
return new RootLens_1.RootLens();
}
exports.createLens = createLens;
function focusLens(parentLens, key) {
return {
read: function (source) {
return parentLens.read(source)[key];
},
setValue: function (source, newValue) {
var fields = {};
fields[key] = newValue;
return parentLens.updateFields(source, fields);
},
update: function (source, updater) {
var fields = {};
fields[key] = updater;
return parentLens.updateFields(source, fields);
},
updateFields: function (source, fields) {
var updatedFields = updateFields(this.read(source), fields);
return this.setValue(source, updatedFields);
}
};
}
function updateFields(source, fields) {
if (typeof fields === 'function')
throw Error('Lens.updateFields() does NOT accept functions as argument');
var hasChanged = false;
var sourceObject = source;
var fieldsObject = fields;
if (Object.keys(fields).length === 0)
return source;
var copy = __assign({}, sourceObject);
for (var key in fields) {
var fieldSpec = fieldsObject[key];
if (typeof fieldSpec === 'function') {
var newValue = fieldSpec(sourceObject[key]);
if (newValue !== sourceObject[key]) {
hasChanged = true;
copy[key] = newValue;
}
}
else {
var newValue = fieldSpec;
if (newValue !== sourceObject[key]) {
copy[key] = fieldSpec;
hasChanged = true;
}
}
}
return hasChanged ? copy : source;
}
//# sourceMappingURL=Lens.js.map
{
"name": "immutable-lens",
"version": "0.0.1",
"version": "0.0.2",
"description": "Type-safe Lens API for immutable updates in complex data structures",

@@ -5,0 +5,0 @@ "keywords": [

@@ -1,3 +0,1 @@

# WIP - Implementing API
# immutable-lens

@@ -7,3 +5,3 @@

### Introduction
### Features
- No mutations

@@ -21,2 +19,13 @@ - Powerful API

```ts
import {createLens} from 'immutable-lens'
type State = {
user: {
name: string
}
}
const state: State = {user: {name: 'Bob'}}
const lens = createLens<State>() // OR
const lens = createLens(state)
```

@@ -26,6 +35,38 @@

```ts
const userLens = lens.focusOn('user')
const userNameLens = userLens.focusOn('name')
```
#### Update
#### Describe and apply updates
```ts
const upperCaseUserName: (state: State) => State =
// ALL EQUIVALENT
userNameLens.setValue('BOB')
userNameLens.update(name => name.toUpperCase())
userLens.setFieldValues({name: 'BOB'})
userLens.updateFields({name: (name) => name.toUpperCase()})
const updatedState = upperCaseUserName(state)
console.log(updatedState) // {user: {name: 'BOB'}}
```
#### Optional types
```ts
type State = {
loggedUser?: {
name: string
}
}
const state: State = { ... }
const lens = createLens<State>()
const loggedUserLens = lens.focusOn('loggedUser')
loggedUserLens.setValue(state, {name: 'Bob}) // OK
loggedUserLens.update(state, loggedUser => ({name: 'Bob'})) // OK (Runtime error if loggedUser udefined)
loggedUserLens.setFieldValues(state, { ... }) // ERROR:
loggedUserLens.defaultTo({ id: '', name: 'Default User' })
```

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