| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- //
- // 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 where item.status == .inProgress {
- item.status = .todo
- }
- }
- }
|