Packages
lustre
5.2.1
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/equals.ffi.mjs
export const isReferenceEqual = (a, b) => a === b;
// This isEqual implementation has to support JSON literals, i.e. values that
// can be produced by using the gleam/json module.
// It is a highly specialised version of https://github.com/planttheidea/fast-equals.
export const isEqual = (a, b) => {
if (a === b) {
return true;
}
if (a == null || b == null) {
return false;
}
const type = typeof a;
if (type !== typeof b) {
return false;
}
// we do not support NaN, and both values being equal has already
// been handled above.
if (type !== 'object') {
return false;
}
const ctor = a.constructor;
if (ctor !== b.constructor) {
return false;
}
if (Array.isArray(a)) {
return areArraysEqual(a, b);
}
return areObjectsEqual(a, b);
};
const areArraysEqual = (a, b) => {
let index = a.length;
if (index !== b.length) {
return false;
}
while (index--) {
if (!isEqual(a[index], b[index])) {
return false;
}
}
return true;
}
const areObjectsEqual = (a, b) => {
const properties = Object.keys(a);
let index = properties.length;
if (Object.keys(b).length !== index) {
return false;
}
while (index--) {
const property = properties[index];
if (!Object.hasOwn(b, property)) {
return false;
}
if (!isEqual(a[property], b[property])) {
return false;
}
}
return true;
}