2017-11-02 04:45:38 +01:00
|
|
|
//
|
|
|
|
// ArticleArray.swift
|
|
|
|
// Evergreen
|
|
|
|
//
|
|
|
|
// Created by Brent Simmons on 11/1/17.
|
|
|
|
// Copyright © 2017 Ranchero Software. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
import Foundation
|
|
|
|
import Data
|
|
|
|
|
2017-11-02 06:40:28 +01:00
|
|
|
typealias ArticleArray = [Article]
|
|
|
|
|
2017-11-02 04:45:38 +01:00
|
|
|
extension Array where Element == Article {
|
|
|
|
|
|
|
|
func articleAtRow(_ row: Int) -> Article? {
|
|
|
|
|
|
|
|
if row < 0 || row == NSNotFound || row > count - 1 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return self[row]
|
|
|
|
}
|
|
|
|
|
2017-11-02 06:40:28 +01:00
|
|
|
func rowOfNextUnreadArticle(_ selectedRow: Int) -> Int? {
|
|
|
|
|
|
|
|
if isEmpty {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
var rowIndex = selectedRow
|
|
|
|
while(true) {
|
|
|
|
|
|
|
|
rowIndex = rowIndex + 1
|
|
|
|
if rowIndex >= count {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
let article = articleAtRow(rowIndex)!
|
|
|
|
if !article.status.read {
|
|
|
|
return rowIndex
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func articlesForIndexes(_ indexes: IndexSet) -> Set<Article> {
|
|
|
|
|
2018-01-28 03:50:48 +01:00
|
|
|
return Set(indexes.compactMap{ (oneIndex) -> Article? in
|
2017-11-02 06:40:28 +01:00
|
|
|
return articleAtRow(oneIndex)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func indexesForArticleIDs(_ articleIDs: Set<String>) -> IndexSet {
|
|
|
|
|
|
|
|
var indexes = IndexSet()
|
|
|
|
|
|
|
|
articleIDs.forEach { (articleID) in
|
|
|
|
let oneIndex = rowForArticleID(articleID)
|
|
|
|
if oneIndex != NSNotFound {
|
|
|
|
indexes.insert(oneIndex)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return indexes
|
|
|
|
}
|
|
|
|
|
2018-01-28 20:33:04 +01:00
|
|
|
func sortedByDate(_ sortDirection: ComparisonResult) -> ArticleArray {
|
2017-11-02 06:40:28 +01:00
|
|
|
|
2018-01-28 20:33:04 +01:00
|
|
|
let articles = sorted { (article1, article2) -> Bool in
|
|
|
|
if sortDirection == .orderedDescending {
|
|
|
|
return article1.logicalDatePublished > article2.logicalDatePublished
|
|
|
|
}
|
|
|
|
return article1.logicalDatePublished < article2.logicalDatePublished
|
|
|
|
}
|
|
|
|
|
|
|
|
return articles
|
2017-11-02 06:40:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
func canMarkAllAsRead() -> Bool {
|
|
|
|
|
2018-02-10 08:16:12 +01:00
|
|
|
return anyArticleIsUnread()
|
|
|
|
}
|
|
|
|
|
|
|
|
func anyArticlePassesTest(_ test: ((Article) -> Bool)) -> Bool {
|
|
|
|
|
2017-11-02 06:40:28 +01:00
|
|
|
for article in self {
|
2018-02-10 08:16:12 +01:00
|
|
|
if test(article) {
|
2017-11-02 06:40:28 +01:00
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
2018-02-10 08:16:12 +01:00
|
|
|
|
|
|
|
func anyArticleIsRead() -> Bool {
|
|
|
|
|
|
|
|
return anyArticlePassesTest { $0.status.read }
|
|
|
|
}
|
|
|
|
|
|
|
|
func anyArticleIsUnread() -> Bool {
|
|
|
|
|
|
|
|
return anyArticlePassesTest { !$0.status.read }
|
|
|
|
}
|
|
|
|
|
|
|
|
func anyArticleIsStarred() -> Bool {
|
|
|
|
|
|
|
|
return anyArticlePassesTest { $0.status.starred }
|
|
|
|
}
|
|
|
|
|
|
|
|
func anyArticleIsUnstarred() -> Bool {
|
|
|
|
|
|
|
|
return anyArticlePassesTest { !$0.status.starred }
|
|
|
|
}
|
2018-02-19 06:49:46 +01:00
|
|
|
|
|
|
|
func unreadArticles() -> [Article]? {
|
|
|
|
|
|
|
|
let articles = self.filter{ !$0.status.read }
|
|
|
|
return articles.isEmpty ? nil : articles
|
|
|
|
}
|
2017-11-02 06:40:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
private extension Array where Element == Article {
|
|
|
|
|
|
|
|
func rowForArticleID(_ articleID: String) -> Int {
|
|
|
|
|
|
|
|
if let index = index(where: { $0.articleID == articleID }) {
|
|
|
|
return index
|
|
|
|
}
|
|
|
|
|
|
|
|
return NSNotFound
|
|
|
|
}
|
|
|
|
|
|
|
|
func rowForArticle(_ article: Article) -> Int {
|
|
|
|
|
|
|
|
return rowForArticleID(article.articleID)
|
|
|
|
}
|
2017-11-02 04:45:38 +01:00
|
|
|
}
|