bad-optics/README.md

61 lines
1.8 KiB
Markdown
Raw Normal View History

2021-11-05 14:22:59 +00:00
# bad optics
2021-11-12 12:44:20 +00:00
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
2021-11-12 13:09:23 +00:00
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
2021-11-05 14:22:59 +00:00
## example
```rust
use bad_optics::{
2021-11-12 12:44:20 +00:00
lenses::{over, set},
prelude::*,
2021-11-05 14:22:59 +00:00
};
fn main() {
let a = ((1, 2), 3);
2021-11-05 15:28:34 +00:00
// 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
2021-11-05 14:22:59 +00:00
let lens = _0 + _1;
// use the view function to access
let res = view(lens, a);
assert_eq!(res, 2);
2021-11-05 15:28:34 +00:00
// you can also call the lens as a function
2021-11-05 14:22:59 +00:00
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));
2021-11-05 15:28:34 +00:00
// you can also call the lens as a function to modify the value
2021-11-05 14:22:59 +00:00
let res = lens(a, |v| v + 1);
2021-11-12 12:44:20 +00:00
assert_eq!(res, ((1, 6), 3));
2021-11-05 14:22:59 +00:00
}
```
2021-11-12 12:44:20 +00:00
## 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](https://hackage.haskell.org/package/lens-tutorial-1.0.3/docs/Control-Lens-Tutorial.html) first instead. the general idea is that they are first-class getters and setters