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),
   );
 }