…
- `[{id: "a"}, {id: "b"}] indexBy "id"` → `{a: {id: "a"}, b: {id: "b"}}`
- `{a: 1} map (p => p.key + p.value)` → `["a1"]`
+- `ids parFlatMap (i => http.json(url = "https://…/" + i))`: like `flatMap`, but the web calls run at once, at most 4 at a time (`parFlatMap 8 (…)` for up to 8, at most 32); results stay in the order of `ids`. `parMap` is the same for `map`. If one fails, the others finish first, then the error is raised. With nothing to wait for, they work exactly like `map` and `flatMap`.
- `[1, 2, 3] filter (x => x > 1) map (x => x * 10)` → `[20, 30]`
…
- `json.parse(text)`: JSON text to a value.
- `csv.parse(text)`: CSV with a header row to a list of rows; numeric cells become numbers.
-- `http.json(url, headers)`, `http.text(url, headers)`: fetch a web page (https, public sites, 10 s, 2 MB), in rules only.
+- `http.json(url, headers)`, `http.text(url, headers)`: fetch a web page (https, public sites, 10 s, 2 MB), in rules and flows only: the flow pauses while it waits, and the server carries on. In a computed field, a table or a query it's an error (`E_WAIT`): fetch in a rule and store the result.
In rules there are also the engine's own messages: `log(msg)`, `diesel.throw(code, msg)`, `dom.upsert(cls, entity)`, `dom.find(cls, key)`, `dom.list(cls)`, `dom.remove(cls, key)`.
…