// // Container.swift // NetNewsWire // // Created by Brent Simmons on 4/17/16. // Copyright © 2016 Ranchero Software, LLC. All rights reserved. // import Foundation import RSCore import Articles extension Notification.Name { public static let ChildrenDidChange = Notification.Name("ChildrenDidChange") } public protocol Container: class { var account: Account? { get } var topLevelFeeds: Set { get set } var folders: Set? { get set } func hasAtLeastOneFeed() -> Bool func objectIsChild(_ object: AnyObject) -> Bool func hasChildFolder(with: String) -> Bool func childFolder(with: String) -> Folder? func removeFeed(_ feed: Feed) func addFeed(_ feed: Feed) //Recursive — checks subfolders func flattenedFeeds() -> Set func has(_ feed: Feed) -> Bool func hasFeed(with feedID: String) -> Bool func hasFeed(withURL url: String) -> Bool func existingFeed(with feedID: String) -> Feed? func existingFeed(withURL url: String) -> Feed? func existingFolder(with name: String) -> Folder? func existingFolder(withID: Int) -> Folder? func postChildrenDidChangeNotification() } public extension Container { func hasAtLeastOneFeed() -> Bool { return topLevelFeeds.count > 0 } func hasChildFolder(with name: String) -> Bool { return childFolder(with: name) != nil } func childFolder(with name: String) -> Folder? { guard let folders = folders else { return nil } for folder in folders { if folder.name == name { return folder } } return nil } func objectIsChild(_ object: AnyObject) -> Bool { if let feed = object as? Feed { return topLevelFeeds.contains(feed) } if let folder = object as? Folder { return folders?.contains(folder) ?? false } return false } func flattenedFeeds() -> Set { var feeds = Set() feeds.formUnion(topLevelFeeds) if let folders = folders { for folder in folders { feeds.formUnion(folder.flattenedFeeds()) } } return feeds } func hasFeed(with feedID: String) -> Bool { return existingFeed(with: feedID) != nil } func hasFeed(withURL url: String) -> Bool { return existingFeed(withURL: url) != nil } func has(_ feed: Feed) -> Bool { return flattenedFeeds().contains(feed) } func existingFeed(with feedID: String) -> Feed? { for feed in flattenedFeeds() { if feed.feedID == feedID { return feed } } return nil } func existingFeed(withURL url: String) -> Feed? { for feed in flattenedFeeds() { if feed.url == url { return feed } } return nil } func existingFolder(with name: String) -> Folder? { guard let folders = folders else { return nil } for folder in folders { if folder.name == name { return folder } if let subFolder = folder.existingFolder(with: name) { return subFolder } } return nil } func existingFolder(withID folderID: Int) -> Folder? { guard let folders = folders else { return nil } for folder in folders { if folder.folderID == folderID { return folder } if let subFolder = folder.existingFolder(withID: folderID) { return subFolder } } return nil } func postChildrenDidChangeNotification() { NotificationCenter.default.post(name: .ChildrenDidChange, object: self) } }