diff --git a/monoid-implementation/src/ditto.js b/monoid-implementation/src/ditto.js index bcdb94cb311794d3553ad99e0088dabced926b37..f1a86978c25fb6af6eba049d5f5249d83e5e5ddf 100644 --- a/monoid-implementation/src/ditto.js +++ b/monoid-implementation/src/ditto.js @@ -1,25 +1,41 @@ export const DITTO = 'DITTO'; export function countTruesWithDittos(entries) { - return 0; // TODO + let lastBoolean = undefined; + let count = 0; + for (const entry of entries) { + if (entry !== DITTO) { + lastBoolean = entry; + } + if (lastBoolean === true) { + ++count; + } + } + return count; } class MonoidElement { - constructor(/* TODO */) { - // TODO + constructor(lastBoolean, count, leadingDittoCount) { + this.lastBoolean = lastBoolean; + this.count = count; + this.leadingDittoCount = leadingDittoCount; } } -export const IDENTITY_ELEMENT = new MonoidElement(/* TODO */); +export const IDENTITY_ELEMENT = new MonoidElement(undefined, 0, 0); export function encodeAsMonoidElement(entry) { return new MonoidElement( - /* TODO */ + entry === DITTO ? undefined : entry, + entry === true ? 1 : 0, + entry === DITTO ? 1 : 0, ); } export function combineMonoidElements(left, right) { return new MonoidElement( - /* TODO */ + right.lastBoolean === undefined ? left.lastBoolean : right.lastBoolean, + left.count + right.count + (left.lastBoolean === true ? right.leadingDittoCount : 0), + left.leadingDittoCount + (left.lastBoolean === undefined ? right.leadingDittoCount : 0), ); }