import Foundation import Combine class AppState: ObservableObject { @Published var documentText: String = "" { didSet { if documentText != oldValue { modified = true bridge.setText(currentNoteID, text: documentText) } } } @Published var evalResults: [Int: String] = [:] @Published var noteList: [NoteInfo] = [] @Published var currentNoteID: UUID @Published var modified: Bool = false private let bridge = RustBridge.shared init() { let id = bridge.newDocument() self.currentNoteID = id refreshNoteList() } func newNote() { saveCurrentIfNeeded() let id = bridge.newDocument() currentNoteID = id documentText = "" evalResults = [:] modified = false refreshNoteList() } func loadNote(_ id: UUID) { saveCurrentIfNeeded() if bridge.cacheLoad(id) { currentNoteID = id documentText = bridge.getText(id) modified = false evaluate() } } func saveNote() { bridge.setText(currentNoteID, text: documentText) let _ = bridge.cacheSave(currentNoteID) modified = false refreshNoteList() } func saveNoteToFile(_ url: URL) { let _ = bridge.saveNote(currentNoteID, path: url.path) modified = false } func loadNoteFromFile(_ url: URL) { if let (id, text) = bridge.loadNote(path: url.path) { currentNoteID = id documentText = text modified = false let _ = bridge.cacheSave(id) evaluate() refreshNoteList() } } func deleteNote(_ id: UUID) { bridge.deleteNote(id) if id == currentNoteID { newNote() } refreshNoteList() } func evaluate() { evalResults = bridge.evaluate(currentNoteID) } func refreshNoteList() { noteList = bridge.listNotes() } private func saveCurrentIfNeeded() { if modified { saveNote() } } }