Functional Weave
Code in Python

todo.summary@1.0.0

impl/typescript.ts

1,100 bytes · the TypeScript implementation · view raw

Imports name this capability’s declared dependencies, which fune builds next to it in your project; each one links to its page.

import { dayOfWeek } from "./dates_day_of_week.ts";  ← from dates.day-of-week ^1.0.0 · built alongside by fune
import { roundDiv } from "./math_round_div.ts";  ← from math.round-div ^1.0.0 · built alongside by fune
import { dueStatus } from "./todo_due_status.ts";  ← from todo.due-status ^1.0.0 · built alongside by fune
import { type Todo } from "./todo_item.ts";  ← from todo.item ^1.0.0 · built alongside by fune
import { type TodoSummary } from "./todo_summary_types.ts";

/**
 * Counts for a todo list. percentDone rounds down so 100 means everything is
 * done; overdue and dueToday agree with dueStatus and todo.group-by-due.
 */
export function summariseTodos(todos: readonly Todo[], today: string): TodoSummary {
  dayOfWeek(today); // a bad today is an error even for an empty list
  let done = 0;
  let overdue = 0;
  let dueToday = 0;
  for (const todo of todos) {
    const status = dueStatus(todo, today);
    if (todo.done) done += 1;
    if (status === "overdue") overdue += 1;
    if (status === "today") dueToday += 1;
  }
  const total = todos.length;
  const active = total - done;
  return {
    total,
    active,
    done,
    overdue,
    dueToday,
    percentDone: total === 0 ? 0 : roundDiv(done * 100, total, "down"),
    itemsLeft: active === 1 ? "1 item left" : `${active} items left`,
  };
}