From e2799cb092359038374cde25eb691d667b309383 Mon Sep 17 00:00:00 2001
From: sanine <sanine.not@pm.me>
Date: Wed, 25 May 2022 22:22:41 -0500
Subject: add Util.js

---
 modules/Util.js      | 13 +++++++++++++
 modules/Util.test.js | 23 +++++++++++++++++++++++
 2 files changed, 36 insertions(+)
 create mode 100644 modules/Util.js
 create mode 100644 modules/Util.test.js

diff --git a/modules/Util.js b/modules/Util.js
new file mode 100644
index 0000000..cbe466d
--- /dev/null
+++ b/modules/Util.js
@@ -0,0 +1,13 @@
+function useAverage() {
+	var avg = 0;
+	let weight = 0;
+	const append = value => {
+		avg = (weight * avg) + value;
+		weight += 1;
+		avg = avg/weight;
+	}
+
+	return [() => avg, append];
+}
+
+export { useAverage };
diff --git a/modules/Util.test.js b/modules/Util.test.js
new file mode 100644
index 0000000..000d54e
--- /dev/null
+++ b/modules/Util.test.js
@@ -0,0 +1,23 @@
+import { test, assert} from './test-assert.js';
+import { useAverage } from './Util.js';
+
+
+test('Average correctly accumulates an average', () => {
+	let [avg, avg_append] = useAverage();
+	let data = [];
+	for (let i=0; i<5000; i++) {
+		let d = Math.random();
+		data.push(d);
+		avg_append(d);
+	}
+
+	let manual_average = 0;
+	for (let d of data) manual_average += d;
+	manual_average /= data.length;
+
+	const precision = (decimalPlaces, num) => {
+		const theta = 10**decimalPlaces;
+		return Math.floor(num * theta) / theta;
+	};
+	assert.equal(precision(5, avg()), precision(5, manual_average));
+});
-- 
cgit v1.2.1