NetNewsWire/Shared/Timeline/ArticleArray.swift

122 lines
2.3 KiB
Swift
Raw Normal View History

2017-11-02 04:45:38 +01:00
//
// ArticleArray.swift
2018-08-29 07:18:24 +02:00
// NetNewsWire
2017-11-02 04:45:38 +01:00
//
// Created by Brent Simmons on 11/1/17.
// Copyright © 2017 Ranchero Software. All rights reserved.
//
import Foundation
import Articles
2017-11-02 04:45:38 +01:00
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> {
return Set(indexes.compactMap{ (oneIndex) -> Article? in
2017-11-02 06:40:28 +01:00
return articleAtRow(oneIndex)
})
}
func sortedByDate(_ sortDirection: ComparisonResult) -> ArticleArray {
2017-11-02 06:40:28 +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 }
}
func unreadArticles() -> [Article]? {
let articles = self.filter{ !$0.status.read }
return articles.isEmpty ? nil : articles
}
func representSameArticlesInSameOrder(as otherArticles: [Article]) -> Bool {
if self.count != otherArticles.count {
return false
}
var i = 0
for article in self {
let otherArticle = otherArticles[i]
if article.account != otherArticle.account || article.articleID != otherArticle.articleID {
return false
}
i += 1
}
return true
}
2017-11-02 06:40:28 +01:00
}