diff --git a/src/main/js/PrimeMath.ts b/src/main/js/PrimeMath.ts
index bc239fa..adf41d9 100644
--- a/src/main/js/PrimeMath.ts
+++ b/src/main/js/PrimeMath.ts
@@ -1,17 +1,50 @@
+/**
+ * Exposes maths functions for prime numbers.
+ */
export interface PrimeMath {
+ /**
+ * Checks a number for primality.
+ *
+ * @param n the number to check for primality
+ * @return `true` if and only if `n` is prime
+ */
isPrime(n: number): boolean
+ /**
+ * Decomposes `n` into its prime factors.
+ *
+ * @param n the number to decompose
+ * @return the array of prime factors of `n`
+ */
decompose(n: number): number[]
}
+/**
+ * Simple implementation of `PrimeMath`.
+ */
export class SimplePrimeMath implements PrimeMath {
+ /**
+ * The singleton instance.
+ *
+ * @private
+ */
private static instance: SimplePrimeMath;
+ /**
+ * Constructs a new `SimplePrimeMath`.
+ *
+ * @private
+ */
private constructor() {
// Do nothing
}
+ /**
+ * Returns the singleton instance.
+ *
+ * @return the singleton instance
+ */
public static getInstance(): SimplePrimeMath {
if (!SimplePrimeMath.instance)
SimplePrimeMath.instance = new SimplePrimeMath();
@@ -52,18 +85,51 @@ export class SimplePrimeMath implements PrimeMath {
}
}
+/**
+ * Implements `PrimeMath` such that all queries are cached so that subsequent queries are faster.
+ */
export class CachedPrimeMath implements PrimeMath {
+ /**
+ * The singleton instance.
+ *
+ * @private
+ */
private static instance: CachedPrimeMath;
+ /**
+ * The underlying `SimplePrimeMath` instance of which the answers are cached.
+ *
+ * @private
+ */
private static simple: SimplePrimeMath = SimplePrimeMath.getInstance();
+ /**
+ * Cached outputs for `isPrime` invocations.
+ *
+ * @private
+ */
private isPrimeCache: Map = new Map();
+ /**
+ * Cached outputs for `decomposeCache` invocations.
+ *
+ * @private
+ */
private decomposeCache: Map = new Map();
+ /**
+ * Constructs a new instance.
+ *
+ * @private
+ */
private constructor() {
// Do nothing
}
+ /**
+ * Returns the singleton instance.
+ *
+ * @return the singleton instance
+ */
public static getInstance(): CachedPrimeMath {
if (!CachedPrimeMath.instance)
CachedPrimeMath.instance = new CachedPrimeMath();
@@ -81,6 +147,17 @@ export class CachedPrimeMath implements PrimeMath {
}
+ /**
+ * Invokes `fun` given `input`, and stores its output in `cache`.
+ *
+ * If `fun(input)` has previously been invoked, then the previous output is returned immediately.
+ *
+ * @param input the input to pass to `fun`
+ * @param fun the function to invoke with `input`
+ * @param cache the cache to store the output of `fun` in, and to read previous outputs from
+ * @return the output of `fun(input)`, or the previously stored output if there is one
+ * @private
+ */
private static invokeCached(input: IN, fun: (_: IN) => OUT, cache: Map): OUT {
if (cache.has(input))
return cache.get(input)!!;