Skip to content

Instantly share code, notes, and snippets.

@3ZsForInsomnia
Created January 2, 2020 13:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 3ZsForInsomnia/be1117e8e12e092c295bdbb95c7a47eb to your computer and use it in GitHub Desktop.
Save 3ZsForInsomnia/be1117e8e12e092c295bdbb95c7a47eb to your computer and use it in GitHub Desktop.
Simple example of nice, clean lens composition in ramda using a helper
const nameLens = R.lensProp('name');
const user = {
name: 'Joe',
age: 34,
isLoggedIn: true,
address: {
number: 123,
street: 'best'
}
};
const lensCreator = lens => transform => user => ({
get: () => R.view(lens, user),
set: (newName) => R.set(lens, newName, user),
transform: () => R.over(lens, transform, user)
});
const transformAddress = input => `${input} street`;
const usersName = lensCreator(nameLens)(input => input.toLowerCase());
let currentUsersNameLens = usersName(user);
console.log('1: ' + currentUsersNameLens.get());
currentUsersNameLens = usersName(currentUsersNameLens.set('BoB'));
console.log('2: ' + currentUsersNameLens.get());
currentUsersNameLens = usersName(currentUsersNameLens.transform());
console.log('3: ' + currentUsersNameLens.get());
const addressLens = R.lensProp('address');
const streetLens = R.lensProp('street');
const usersStreetLens = R.compose(addressLens, streetLens);
const usersStreet = lensCreator(usersStreetLens)(transformAddress);
const newUsersStreet = usersStreet(user).transform();
console.log('addr: ', usersStreet(user).get());
console.log('new addr: ', usersStreet(newUsersStreet).get());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment