import S from 'sanctuary'; import Identity from 'sanctuary-identity'; // lens :: (s -> a) -> (a -> s -> s) -> Lens s a const lens = getter => setter => f => s => ( S.map (v => setter (v) (s)) (f (getter (s))) ); // view :: Lens s a -> s -> a const view = l => x => (l (S.Left) (x)).value; // over :: Lens s a -> (a -> a) -> s -> s const over = l => f => x => S.extract (l (y => Identity (f (y))) (x)); // email :: Lens User String const email = lens (user => user.email) (email => user => ({...user, email})); // user :: User const user = {id: 1, email: 'dc@davidchambers.me'}; console.log (view (email) (user)); console.log (over (email) (S.toUpper) (user));