Packages
lustre
5.7.0
5.7.1
5.7.0
5.6.0
5.5.2
5.5.1
5.5.0
5.4.0
5.3.5
5.3.4
5.3.3
5.3.2
5.3.1
5.3.0
5.2.1
5.2.0
5.1.1
5.1.0
5.0.3
5.0.2
5.0.1
5.0.0
4.6.4
4.6.3
4.6.2
4.6.1
4.6.0
4.5.1
4.5.0
4.4.4
4.4.3
4.4.1
4.4.0
4.3.6
4.3.5
4.3.4
4.3.3
4.3.2
4.3.1
4.3.0
4.2.6
4.2.5
4.2.4
4.2.3
4.2.2
4.2.1
4.2.0
4.1.8
4.1.7
4.1.6
4.1.5
4.1.4
4.1.3
4.1.2
4.1.1
4.1.0
4.0.0
4.0.0-rc1
4.0.0-rc.2
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.12
3.0.11
3.0.10
3.0.9
3.0.8
3.0.7
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
3.0.0-rc.8
3.0.0-rc.7
3.0.0-rc.6
3.0.0-rc.5
3.0.0-rc.4
3.0.0-rc.3
3.0.0-rc.2
3.0.0-rc.1
2.0.1
2.0.0
1.3.0
1.2.0
1.1.0
1.0.0
Create HTML templates, single page applications, Web Components, and real-time server components in Gleam!
Current section
Files
Jump to
Current section
Files
src/lustre/internals/list.ffi.mjs
import {
List$NonEmpty,
List$NonEmpty$rest,
List$NonEmpty$first,
} from "../../gleam.mjs";
import { empty_list } from "./constants.mjs";
import { append as $list_append } from "../../../gleam_stdlib/gleam/list.mjs";
export const toList = (arr) =>
arr.reduceRight((xs, x) => List$NonEmpty(x, xs), empty_list);
/** Our reconciler is written in such a way that it can work without modification
* both in typical client-side Lustre apps like SPAs and client components, but
* also in the server component runtime.
*
* This is notable because the typical client runtimes are working directly with
* Gleam values, but the server component runtime is working with deserialised
* JSON.
*
* The most immediate discrepancy is that Gleam uses linked lists but of course
* these are serialised as arrays in JSON. This function lets us iterate over
* both kinds of collection without dropping into Gleam's slow list iterator.
*
*/
export const iterate = (list, callback) => {
if (Array.isArray(list)) {
for (let i = 0; i < list.length; i++) {
callback(list[i]);
}
} else if (list) {
for (list; List$NonEmpty$rest(list); list = List$NonEmpty$rest(list)) {
callback(List$NonEmpty$first(list));
}
}
};
export const append = (a, b) => {
if (!List$NonEmpty$rest(a)) {
return b;
} else if (!List$NonEmpty$rest(b)) {
return a;
} else {
return $list_append(a, b);
}
};