├── .gitignore ├── .merlin ├── Makefile ├── README.md ├── bsconfig.json ├── package-lock.json ├── package.json └── src └── ppx_let_promise.ml /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | lib/ 3 | -------------------------------------------------------------------------------- /.merlin: -------------------------------------------------------------------------------- 1 | ####{BSB GENERATED: NO EDIT 2 | FLG -ppx /Users/andreypopp/Workspace/ppx_let_promise/node_modules/bs-platform/bin/bsppx.exe 3 | S /Users/andreypopp/Workspace/ppx_let_promise/node_modules/bs-platform/lib/ocaml 4 | B /Users/andreypopp/Workspace/ppx_let_promise/node_modules/bs-platform/lib/ocaml 5 | FLG -nostdlib -no-alias-deps -color always -w -40+6+7+27+32..39+44+45 6 | S src 7 | B lib/bs/src 8 | ####BSB GENERATED: NO EDIT} 9 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | BIN = ./node_modules/.bin 2 | 3 | build: 4 | $(BIN)/bsb -make-world 5 | 6 | watch: 7 | $(BIN)/bsb -make-world -w 8 | 9 | clean: 10 | rm -rf ./lib 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ppx_let bindings for BuckleScript's Js.Promise.t 2 | 3 | Like async/await syntax for Promises in JS but for OCaml. 4 | 5 | Install: 6 | 7 | npm install andreypopp/ppx_let andreypopp/ppx_let_promise 8 | 9 | Add to `bsconfig.json`: 10 | 11 | { 12 | ... 13 | "ppx-flags": [ 14 | "ppx_let/ppx" 15 | ], 16 | "bs-dependencies": [ 17 | "ppx_let_promise" 18 | ], 19 | ... 20 | } 21 | 22 | Use `ppx_let` with `Js.Promise.t`: 23 | ```ocaml 24 | (* module with a name Let_syntax provides promise related utilities for syntax *) 25 | module Let_syntax = Ppx_let_promise.Let_syntax 26 | 27 | let hello () = 28 | (* This line "waits" for promise to resolve and binds to its result value *) 29 | let%bind message = Js.Promise.resolve "Hello!" in 30 | print_endline message; 31 | Js.Promise.resolve ();; 32 | 33 | hello (); 34 | 35 | ``` 36 | -------------------------------------------------------------------------------- /bsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ppx_let_promise", 3 | "sources": [ 4 | { 5 | "dir": "src" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ppx_let_promise", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "bs-platform": { 7 | "version": "1.8.0", 8 | "resolved": "https://registry.npmjs.org/bs-platform/-/bs-platform-1.8.0.tgz", 9 | "integrity": "sha1-03b1+i6/4ERRkwYz8HM/guo5+94=", 10 | "dev": true 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ppx_let_promise", 3 | "version": "1.0.0", 4 | "description": "ppx_let bindings for BuckleScript's Js.Promise.t", 5 | "author": "Andrey Popp", 6 | "license": "MIT", 7 | "devDependencies": { 8 | "bs-platform": "^1.8.0" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/ppx_let_promise.ml: -------------------------------------------------------------------------------- 1 | let map promise f = 2 | Js.Promise.then_ (fun v -> Js.Promise.resolve (f v)) promise 3 | 4 | let bind promise f = 5 | Js.Promise.then_ f promise 6 | 7 | let both promise_a promise_b = 8 | Js.Promise.all2 (promise_a, promise_b) 9 | 10 | let return = 11 | Js.Promise.resolve 12 | 13 | module Let_syntax = struct 14 | let return = return 15 | let bind = bind 16 | let map = map 17 | let both = both 18 | 19 | module Open_in_body = struct 20 | let return = return 21 | end 22 | 23 | module Open_on_rhs = struct 24 | let return = return 25 | end 26 | end 27 | 28 | --------------------------------------------------------------------------------