https://github.com/astrocoders/lenses-ppx
GADT lenses
https://github.com/astrocoders/lenses-ppx
ocaml ppx reasonml
Last synced: 6 months ago
JSON representation
GADT lenses
- Host: GitHub
- URL: https://github.com/astrocoders/lenses-ppx
- Owner: Astrocoders
- License: mit
- Created: 2018-12-25T19:53:33.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2021-10-16T17:05:25.000Z (about 4 years ago)
- Last Synced: 2025-06-14T13:02:31.059Z (6 months ago)
- Topics: ocaml, ppx, reasonml
- Language: Reason
- Homepage:
- Size: 227 KB
- Stars: 104
- Watchers: 7
- Forks: 8
- Open Issues: 8
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# What are GADTs?
[GADTs: A primer](https://sketch.sh/s/yH0MJiujNSiofDWOU85loX/)
# Why
Differently from normal lenses/optics the following approach allows for composing "lenses" into lists/arrays which is them useful for things like https://github.com/rescriptbr/reschema
# Install
Install the last stable version
For ReScript
```
npm install --save-dev lenses-ppx@latest
or
yarn add lenses-ppx@latest -D
```
For BuckleScript < 6
```
npm install --save-dev lenses-ppx@4.0.0
or
yarn add lenses-ppx@4.0.0 -D
```
# Build
```
npm run build
```
# Watch
```
npm run watch
```
In
```rescript
module StateLenses = %lenses(
type state = {
email: string,
age: int,
}
)
```
Out
```rescript
module StateLenses = {
type state = {
email: string,
age: int,
}
type rec field<_> =
| Email: field
| Age: field
let get:
type value. (state, field) => value =
(state, field) =>
switch field {
| Email => state.email
| Age => state.age
}
let set:
type value. (state, field, value) => state =
(state, field, value) =>
switch field {
| Email => {...state, email: value}
| Age => {...state, age: value}
}
}
```
Using
```rescript
open StateLenses
let state = {email: "fakenickels@gov.br", age: 969}
Js.log(state->get(Email))
Js.log(state->get(Age))
```
Alternatively you can also use it like
```rescript
@lenses @decco
type bartux = {
color: string,
top: int,
}
let bartux = {color: "red", top: 10}
Js.log(bartux->bartux_get(Color))
Js.log(bartux->bartux_set(Top, 20))
Js.log(bartux_encode(bartux))
```
Alternatives
- https://github.com/scoville/re-optic/blob/master/docs/lenses-ppx.md which is more strict and follows more closely Optics standards