| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- //
- // RotateController.swift
- // Todos
- //
- // Created by Sam Jaffe on 3/13/26.
- //
- import Foundation
- final class RotateController {
- static func ymd(_ date: Date) -> String { RotateController().ymd(date) }
- func ymd(_ date: Date) -> String {
- date.formatted(.iso8601.year().month().day())
- }
- func saveAndRotate(_ items: [Project], _ date: inout Date,
- _ tracking: inout RotateTracking) {
- SaveController().save(items, onDate: ymd(date))
- tracking.summary = summarize(items)
- rotate(items, &tracking)
- date = Date()
- }
-
- func summarize(_ items: [Project]) -> String? {
- var summary = ""
- for item in items {
- item.tasks.filter(isComplete).map(\.name).forEach { name in
- summary += "- \(item.name) > \(name)\n"
- }
- for task in item.tasks {
- task.subtasks.filter(isComplete).map(\.name).forEach { name in
- summary += "- \(item.name) > \(task.name) > \(name)\n"
- }
- }
- }
- return summary.isEmpty ? nil : summary
- }
- private func rotate(_ items: [Project], _ tracking: inout RotateTracking) {
- for item in items {
- cleanStatuses(&item.tasks)
- for task in item.tasks {
- cleanStatuses(&task.subtasks)
- }
- }
- }
- private func isComplete<T : Filterable>(_ arg: T) -> Bool {
- arg.status == .complete
- }
- private func cleanStatuses<T : Filterable>(_ items: inout [T]) {
- items.removeAll(where: isComplete)
- for var item in items {
- if item.status == .inProgress {
- item.status = .todo
- }
- }
- }
- }
|