Implemented the calculation of reviews' top words for the FeedListViewController view controller in the Feed framework.

This commit is contained in:
Javier Cicchelli 2024-03-20 23:40:28 +01:00
parent eac34c61c1
commit 763b6ddefc

View File

@ -18,6 +18,9 @@ extension FeedListViewController {
// MARK: Constants
private let configuration: Configuration
private let filterWords: FilterWordsUseCase = .init()
private let topWords: TopWordsUseCase = .init()
// MARK: Properties
@Published var filter: FilterOption = .all
@ -26,9 +29,11 @@ extension FeedListViewController {
@Published var isLoading: Bool = false
var items: [Review] = []
var words: [WordCount] = []
private var reviewsAll: [Review] = []
private var reviewsFiltered: FilteredReviews = [:]
private var reviewsTopWords: TopWordsReviews = [:]
lazy private var iTunesService: iTunesService = {
.init(configuration: .init(session: configuration.session))
@ -56,6 +61,12 @@ extension FeedListViewController {
.reduce(into: FilteredReviews()) { partialResult, option in
partialResult[option] = reviewsAll.filter { $0.rating.stars == option.rawValue }
}
reviewsTopWords = reviewsFiltered
.mapValues { reviews in
reviews.map(\.comment)
.compactMap { try? filterWords($0) }
}
.mapValues { topWords($0) }
items = reviewsAll
isFilterEnabled = !items.isEmpty
@ -74,7 +85,8 @@ extension FeedListViewController {
items = option == .all
? reviewsAll
: reviewsFiltered[option] ?? []
words = reviewsTopWords[option] ?? []
filter = option
}
@ -86,5 +98,6 @@ private extension FeedListViewController.ViewModel {
// MARK: Type aliases
typealias FilteredReviews = [FilterOption: [Review]]
typealias TopWordsReviews = [FilterOption: [WordCount]]
}