![Oracle Drags Its Feet in the JavaScript Trademark Dispute](https://cdn.sanity.io/images/cgdhsj6q/production/919c3b22c24f93884c548d60cbb338e819ff2435-1024x1024.webp?w=400&fit=max&auto=format)
Security News
Oracle Drags Its Feet in the JavaScript Trademark Dispute
Oracle seeks to dismiss fraud claims in the JavaScript trademark dispute, delaying the case and avoiding questions about its right to the name.
FxJS is a functional Javascript library based on Iterable / Iterator, Generator, and Promise in ECMAScript 6.
<script src="https://unpkg.com/fxjs/dist/fx.js"></script>
<script src="https://unpkg.com/fxjs/dist/fx.es5.js"></script>
<script>
const { L, C } = window._;
_.go(
[1, 2, 3],
L.map(a => a * a),
L.map(_.delay(300)),
C.takeAll,
_.reduce(_.add),
console.log
);
// '14' output after about 300 ms
</script>
Note: When the browser loads the fx.js
script file, _
is used as a global variable.FxJS is a Dual Module Package that supports both CommonJS and ES6 Module.
Among the two module types of the fxjs package, commonjs support node.js v6
or higher, and ESM is available from node.js v12
or higher.
npm install fxjs
CommonJS (>= node v6)
const FxJS = require("fxjs");
const _ = require("fxjs/Strict");
const L = require("fxjs/Lazy");
const C = require("fxjs/Concurrency");
// The module object that exported as default has all the functions in fxjs, including Lazy and Concurrency.
const { reduce, mapL, takeAllC } = FxJS;
// You can also import the functions individually.
const rangeL = require("fxjs/Lazy/rangeL");
_.go(
rangeL(1, 4),
L.map(a => a * a),
L.map(_.delay(300)),
C.takeAll,
_.reduce(_.add),
console.log
);
ES6 Module (>= node v12)
import { add, delay, go, reduce, rangeL } from "fxjs";
import * as L from "fxjs/Lazy";
import * as C from "fxjs/Concurrency";
go(
rangeL(1, 4),
L.map(a => a * a),
L.map(delay(300)),
C.takeAll,
reduce(add),
console.log
);
FxJS adopted the Isolate state approach in two ways to support the Dual Module Package, which was introduced in the official Node.js document. Therefore, when using both CommonJS and ES modules, care must be taken to compare the equivalence of modules or function objects as shown below. For more information, see Node.js Document.
import { createRequire } from "module";
import * as fxjs_mjs from "fxjs";
import go_mjs from "fxjs/Strict/go.js";
const require = createRequire(import.meta.url);
const fxjs_cjs = require('fxjs');
const go_cjs = require('fxjs/Strict/go');
console.log(fxjs_mjs === fxjs_cjs); // false
console.log(go_mjs === go_cjs); // false
console.log(fxjs_cjs.go === go_cjs); // true
console.log(fxjs_mjs.go === go_mjs); // true
You can evaluate the iterator as a function of FxJS.
function* fibonacci() {
let a = 0,
b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
const f = pipe(
fibonacci,
L.filter((n) => n % 2 == 0),
L.takeWhile((n) => n < 10)
);
const iterator = f();
console.log(iterator.next()); // { value: 0, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 8, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
reduce((a, b) => a + b, f());
// 10
Any value can be used with FxJS if it has a [Symbol.iterator]()
method.
const res = go(
[1, 2, 3, 4, 5],
filter((a) => a % 2),
reduce(add)
);
log(res); // 9
You can do 'lazy evaluation' as a function of the L
namespace.
const res = go(
L.range(Infinity),
L.filter((a) => a % 2),
L.take(3),
reduce(add)
);
log(res); // 9
Functional reactive programming style.
go(
L.range(Infinity),
L.map(delay(1000)),
L.map((a) => a + 10),
L.take(3),
each(log)
);
// After 1 second 10
// After 2 seconds 11
// After 3 seconds 12
Asynchronous control is easy.
// L.interval = time => L.map(delay(time), L.range(Infinity));
await go(
L.interval(1000),
L.map((a) => a + 30),
L.takeUntil((a) => a == 33),
each(log)
);
// After 1 second 30
// After 2 seconds 31
// After 3 seconds 32
// After 4 seconds 33
const res = await go(
L.interval(1000),
L.map((a) => a + 20),
L.takeWhile((a) => a < 23),
L.map(tap(log)),
reduce(add)
);
// After 5 seconds 20
// After 6 seconds 21
// After 7 seconds 22
log(res);
// 63
C
functions can be evaluated concurrency.
await map(getPage, range(1, 5));
// After 4 seconds
// [page1, page2, page3, page4]
const pages = await C.map(getPage, range(1, 5));
// After 1 second
// [page1, page2, page3, page4]
Like Clojure Reducers, you can handle concurrency.
go(
range(1, 5),
map(getPage),
filter((page) => page.line > 50),
map(getWords),
flat,
countBy(identity),
log
);
// After 4 seconds
// { html: 78, css: 36, is: 192 ... }
go(
L.range(1, 5),
L.map(getPage),
L.filter((page) => page.line > 50),
L.map(getWords),
C.takeAll, // All requests same time.
flat,
countBy(identity),
log
);
// After 1 second
// { html: 78, css: 36, is: 192 ... }
go(
L.range(1, 5),
L.map(getPage),
L.filter((page) => page.line > 50),
L.map(getWords),
C.takeAll(2), // 2 requests same time.
flat,
countBy(identity),
log
);
// After 2 second
// { html: 78, css: 36, is: 192 ... }
You can use JavaScript standard error handling.
const b = go(
0,
(a) => a + 1,
(a) => a + 10,
(a) => a + 100
);
console.log(b);
// 111
try {
const b = go(
0,
(a) => {
throw { hi: "ho" };
},
(a) => a + 10,
(a) => a + 100
);
console.log(b);
} catch (c) {
console.log(c);
}
// { hi: 'ho' }
You can use async/await and try/catch to handle asynchronous error handling.
const b = await go(
0,
(a) => Promise.resolve(a + 1),
(a) => a + 10,
(a) => a + 100
);
console.log(b);
// 111
try {
const b = await go(
0,
(a) => Promise.resolve(a + 1),
(a) => Promise.reject({ hi: "ho" }),
(a) => a + 100
);
console.log(b);
} catch (c) {
console.log(c);
}
// { hi: 'ho' }
The above libraries are based on FxJS. FxSQL and FxDOM are libraries that can handle SQL and DOM through functional APIs,respectively.
FAQs
Functional Extensions for modern Javascript
The npm package fxjs receives a total of 1,011 weekly downloads. As such, fxjs popularity was classified as popular.
We found that fxjs demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 3 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Oracle seeks to dismiss fraud claims in the JavaScript trademark dispute, delaying the case and avoiding questions about its right to the name.
Security News
The Linux Foundation is warning open source developers that compliance with global sanctions is mandatory, highlighting legal risks and restrictions on contributions.
Security News
Maven Central now validates Sigstore signatures, making it easier for developers to verify the provenance of Java packages.