diff --git a/WordAX.xcodeproj/xcshareddata/xcschemes/WordAX.xcscheme b/WordAX.xcodeproj/xcshareddata/xcschemes/WordAX.xcscheme new file mode 100644 index 0000000..8ec4807 --- /dev/null +++ b/WordAX.xcodeproj/xcshareddata/xcschemes/WordAX.xcscheme @@ -0,0 +1,77 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WordAX.xcodeproj/xcuserdata/oliverhnat.xcuserdatad/xcschemes/xcschememanagement.plist b/WordAX.xcodeproj/xcuserdata/oliverhnat.xcuserdatad/xcschemes/xcschememanagement.plist index 6f9e193..b73851d 100644 --- a/WordAX.xcodeproj/xcuserdata/oliverhnat.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/WordAX.xcodeproj/xcuserdata/oliverhnat.xcuserdatad/xcschemes/xcschememanagement.plist @@ -10,5 +10,13 @@ 0 + SuppressBuildableAutocreation + + 6CF4394D2B83541D004C3543 + + primary + + + diff --git a/WordAX/WordAX.swift b/WordAX/WordAX.swift index 1637ea0..a768be2 100644 --- a/WordAX/WordAX.swift +++ b/WordAX/WordAX.swift @@ -6,3 +6,62 @@ // import Foundation + +struct WordAX { + struct Word: Identifiable { + var id: Int + var name: String + var description: String + var shown: Bool + var nextSpacedRepetitionMilestone: SpacedRepetitionMilestoneEnum? + var displayOn: Date? + } + enum FrequencyEnum: Int { + case Daily = 1 + case Weekly = 7 + case BiWeekly = 14 + case Monthly = 30 + } + + enum SpacedRepetitionMilestoneEnum: Int, CaseIterable { + case OneDay = 1 + case OneWeek = 7 + case TwoWeeks = 14 + case OneMonth = 30 + case TwoMonths = 60 + case FiveMonths = 150 + case OneYear = 365 + + static var allCasesSorted: [SpacedRepetitionMilestoneEnum] { + allCases.sorted {$0.rawValue < $1.rawValue } + } + } + + struct Settings { + var frequency: FrequencyEnum = .Daily + var lastShownNew: Date? + } + + private mutating func setNextSpacedRepetitionMilestone(word: Word) { + if word.nextSpacedRepetitionMilestone != nil { + let current = SpacedRepetitionMilestoneEnum.allCasesSorted.firstIndex(of: word.nextSpacedRepetitionMilestone!) ?? SpacedRepetitionMilestoneEnum.allCases.count + let index = words.firstIndex(where:{$0.id == word.id}) ?? nil + if current + 1 < SpacedRepetitionMilestoneEnum.allCases.count && index != nil { + words[index!].nextSpacedRepetitionMilestone = SpacedRepetitionMilestoneEnum.allCasesSorted[current + 1] + } else if index != nil { + words[index!].nextSpacedRepetitionMilestone = nil + } + } + } + + var words: [Word] = [] + var settings: Settings + + init() { + self.words = [] + self.settings = Settings() + self.words.append(Word(id: 0, name: "Magnificent", description: "When something is awesome", shown: false)) + self.words.append(Word(id: 1, name: "Mesmerising", description: "When something is beautiful", shown: false)) + } + +} diff --git a/WordAX/WordAXModelView.swift b/WordAX/WordAXModelView.swift index ebb0ca9..8851a00 100644 --- a/WordAX/WordAXModelView.swift +++ b/WordAX/WordAXModelView.swift @@ -8,7 +8,62 @@ import Foundation class WordAXModelView: ObservableObject { + @Published private var model: WordAX + typealias Word = WordAX.Word init() { + model = WordAX() + } + + public func getWordToDisplay() -> Word? { + let words = model.words + if words.count > 0 { + // if today is the date they're supposed to be shown + let displayToday = words.filter({ $0.displayOn != nil && $0.displayOn!.isToday()}) + if displayToday.count > 0 { + return displayToday.first! + } + + // first word ever shown + let shownWords = words.filter({ $0.shown }) + if shownWords.count == 0 { + return words.first! + } + // if today is the day to show a new word + let settings = model.settings + if shownWords.count == 0 || + settings.lastShownNew == nil || + settings.lastShownNew!.addingTimeInterval(TimeInterval(settings.frequency.rawValue * 24 * 60 * 60)).isAfterToday() { + return words.first! + } + } + // otherwise show nothing + return nil + } +} + + +extension Date { + private func getOnlyDate(date: Date) -> DateComponents { + Calendar.current.dateComponents([.day, .month, .year], from: date) + } + func isSameAs(_ date: Date) -> Bool { + let selfDate = getOnlyDate(date: self) + let paramDate = getOnlyDate(date: date) + return selfDate.day == paramDate.day && selfDate.month == paramDate.month && selfDate.year == paramDate.year + } + + func isToday() -> Bool { + self.isSameAs(Date()) + } + + func isAfter(_ date: Date) -> Bool { + let selfDate = getOnlyDate(date: self) + let paramDate = getOnlyDate(date: date) + return selfDate.year! > paramDate.year! || selfDate.month! > paramDate.month! || selfDate.day! > paramDate.day! + } + + func isAfterToday() -> Bool { + self.isAfter(Date()) } }