Comments (4)
So the question is wether it is possible to map over some list smartly building a lens per each child
@raveclassic not sure what you mean, could you post an example?
from monocle-ts.
Sure
type Item = {
value: boolean;
};
type Data = {
items: Item[];
};
const initial: Data = {
items: [
{
value: true,
},
{
value: false,
},
],
};
const itemsLens = Lens.fromProp<Data>()('items');
const itemAt = unsafeIndexArray<Item>();
const valueLens = Lens.fromProp<Item>()('value');
const List = () => {
const [data, update] = useState(initial);
return (
<div>
{data.items.map((item, i) => {
const lens = itemsLens.composeLens(itemAt.at(i)).composeLens(valueLens);
return (
<input
type="checkbox"
checked={lens.get(data)}
onChange={e => update(lens.set(e.target.checked)(data))}
/>
);
})}
</div>
);
};
The question - is there a prior optic for automating lens composition and including map
into that composition?
from monocle-ts.
Of course we can always automate the map
:
export const mapWithLens = <A, R>(list: A[], f: (item: A, index: number, lens: Lens<A[], A>) => R): R[] =>
list.map((listItem, listIndex) =>
f(
listItem,
listIndex,
new Lens(() => listItem, newListItem => () => unsafeUpdateAt(listIndex, newListItem, list)),
),
);
const AutomatedMap = () => {
const [data, update] = useState(initial);
return (
<div>
{mapWithLens(data.items, (item, i, l) => {
const lens = itemsLens.composeLens(l).composeLens(valueLens);
return (
<input
type="checkbox"
checked={lens.get(data)}
onChange={e => update(lens.set(e.target.checked)(data))}
/>
);
})}
</div>
);
};
But I wonder if there's a prior optic
from monocle-ts.
Hmm, I was looking for the same functionality, took this code at face value, and unless I'm misusing it, it does not seem to work, see console output of:
import { Lens } from 'monocle-ts'
import * as RA from 'fp-ts/lib/Array'
interface Data {
n : number
}
const data : Data[] = [{n : 10}, {n : 20}]
const mapWithLens = <A, R>(list: A[], f: (item: A, index: number, lens: Lens<A[], A>) => R): R[] =>
list.map((listItem, listIndex) =>
f(
listItem, listIndex,
new Lens(
() => listItem,
newListItem => () => RA.unsafeUpdateAt(listIndex, newListItem, list)
),
),
)
mapWithLens(
data,
(_item, _index, itemLens) => {
const lens: Lens<Data[], number> = itemLens.compose(Lens.fromProp<Data>()('n'))
const v = 42
console.log(`${v} = ${lens.get(lens.set(v)(data))}`)
},
)
from monocle-ts.
Related Issues (20)
- generating lots of paths with optional steps and sets of steps
- Release 2.3.8 seems to be broken HOT 3
- Is dissoc possible? HOT 2
- Are the experimental features safe to use in production HOT 1
- Lens props should not requires at least two argument HOT 1
- Lens set HOT 1
- iso.iso constructor is not equivalent to iso class constructor
- optional: prop for partial keys HOT 3
- Customize Monocle policy regarding missing interposed nodes?
- `Lens#composeAt` method?
- Tree structure HOT 1
- No fromProp method in docs. HOT 1
- fromTraversable(array) - array is deprecated
- How-to: select optional props from record. HOT 1
- learnings resources section
- insertAt & renameAt
- missing dependencies? HOT 1
- Lens.fromPath with array HOT 1
- Optic implemented using Kliesli Arrows HOT 1
- Question: lens to get the selected element form a dictionary HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from monocle-ts.