immutable-lens
Advanced tools
Comparing version 0.0.1 to 0.0.2
@@ -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
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
29442
30
393
70
1