bad-optics-derive | ||
examples | ||
src | ||
.gitignore | ||
Cargo.toml | ||
README.md |
bad optics
ergonomic lenses in rust
bad-optics
implements the haskell concept of lenses, prisms, and traversals in rust
it does not implement the operators, as it's not really a thing we can do in rust
you will need nightly for this library to work, as it uses a bunch of unstable features. they're technically not critical, but i think not having them reduces the ergonomics too much
does bringing lenses into rust actually make sense? probably not, but it was fun to implement so who can say
example
use bad_optics::{
lenses::{over, set},
prelude::*,
};
fn main() {
let a = ((1, 2), 3);
// use view to access inside the tuple
let res = view(_0, a);
assert_eq!(res, (1, 2));
let res = view(_1, a);
assert_eq!(res, 3);
// you can combine lenses
let lens = _0 + _1;
// use the view function to access
let res = view(lens, a);
assert_eq!(res, 2);
// you can also call the lens as a function
let res = lens(a);
assert_eq!(res, 2);
// call the over function to modify the value
let a = over(lens, a, |v| v + 1);
assert_eq!(a, ((1, 3), 3));
// call the set function to set the value
let a = set(lens, a, 5);
assert_eq!(a, ((1, 5), 3));
// you can also call the lens as a function to modify the value
let res = lens(a, |v| v + 1);
assert_eq!(res, ((1, 6), 3));
}
how to use
bad-optics provides some of the lenses, prisms, and traversals defined in lens
. i'm still trying to add more, so if there's one you need and it's missing from here, feel free to open a PR
if you don't know how lenses work, this is not really gonna be a tutorial, you should read this first instead. the general idea is that they are first-class getters and setters