bs-generators
v0.2.0
Published
BuckleScript bindings to JavaScripts Generator objects
Downloads
5
Maintainers
Readme
bs-generators
Source: https://github.com/mscharley/bs-generators
Author: Matthew Scharley
Contributors: See contributors on GitHub
Bugs/Support: Github Issues
Copyright: 2018
License: MIT license
Status: Active
Synopsis
This package provides bindings to use and create JavaScripts' Generator objects, aka function*() {}
.
Using this library you can consume JavaScript libraries that use function*
and you can create objects that operate like that JS syntax to send into JavaScript land as well.
A word of warning. This library should only really be considered for interoperation with existing JavaScript code that uses Generators. I do not recommend using these types on their own inside ReasonML/Ocaml codebases.
Installation
Depending on your package manager of choice,
npm install bs-generators
or
yarn add bs-generators
Usage
The best API documentation so far is the interface file.
Using a function* defined in JavaScript and provided to your Reason code
open JsGenerator;
/* Create a generator - pretend this comes from the outside */
let jsGen: JsGenerator.fnU(int) = [%raw "function *() { yield 1; yield 2; yield 3 }"];
let gen = jsGen();
/* Iterate over the generator and stop when doneGet returns true */
Js.log("Running the JavaScript generator:");
let i = ref(gen->next());
while (! (i^)->doneGet) {
Js.log((i^)->valueGet);
i := gen->next();
}
Creating a Generator to pass into JavaScript code
let reGen: JsGenerator.fn(int) = _ => JsGenerator.fromNext({
/* Create a mutable counter */
let i = ref(0);
() => {
if (i^ < 3) {
i := i^ + 1;
/* You can also return Some(None) to send an undefined value to JS without closing the Generator */
Some(Some(i^));
}
else {
/* Close the Generator */
None;
}
}
});
Js.log("Running the Reason generator:");
[%%raw "for (var x of reGen()) { console.log(x); }"];