Last active
September 10, 2020 09:07
-
-
Save innocarpe/6c1edab5a9bfac953c7c303121bf67b4 to your computer and use it in GitHub Desktop.
LazySequenceTest
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
struct NewHashtagFeed { | |
let components: [Component] | |
init(components: [Component]) { | |
self.components = components | |
} | |
} | |
extension NewHashtagFeed { | |
enum Component { | |
case threeGrid(HashtagFeedThreeGridComponent) | |
} | |
} | |
extension NewHashtagFeed.Component { | |
func asThreeGrid() -> HashtagFeedThreeGridComponent? { | |
switch self { | |
case let .threeGrid(grid): | |
return grid | |
} | |
} | |
} | |
struct Style: Hashable { | |
let id: Int | |
init(id: Int) { | |
self.id = id | |
} | |
} | |
struct NewHashtagFeedViewSection: Equatable { | |
enum Identity: Hashable { | |
case activityIndicator | |
case content | |
} | |
var identity: Identity | |
var items: [Item] | |
} | |
extension NewHashtagFeedViewSection { | |
enum Item: Hashable { | |
case styleTile(Style) | |
} | |
} | |
struct HashtagFeedThreeGridComponent { | |
var row: Int | |
var items: [Item] | |
init(row: Int, items: [HashtagFeedThreeGridComponent.Item]) { | |
self.row = row | |
self.items = items | |
} | |
enum Item { | |
case threeGridStyleCard(Style) | |
} | |
} | |
extension HashtagFeedThreeGridComponent.Item { | |
public func asStyle() -> Style? { | |
switch self { | |
case let .threeGridStyleCard(style): | |
return style | |
} | |
} | |
} | |
private func lazyStyleTileSectionItems(feed: NewHashtagFeed) -> [NewHashtagFeedViewSection.Item] { | |
return feed.components | |
.lazy | |
.compactMap { feedComponent -> HashtagFeedThreeGridComponent? in | |
print("feedComponent.asThreeGrid()") | |
return feedComponent.asThreeGrid() | |
} | |
.flatMap { threeGridComponent -> [HashtagFeedThreeGridComponent.Item] in | |
print("threeGridComponent.row: \(threeGridComponent.row)") | |
return threeGridComponent.items | |
} | |
.compactMap { item -> Style? in | |
print("item.asStyle(\(String(describing: item.asStyle()?.id)))") | |
return item.asStyle() | |
} | |
.map { style -> NewHashtagFeedViewSection.Item in | |
print(".styleTile(\(style.id))") | |
return .styleTile(style) | |
} | |
} | |
private func styleTileSectionItems(feed: NewHashtagFeed) -> [NewHashtagFeedViewSection.Item] { | |
return feed.components | |
.compactMap { feedComponent -> HashtagFeedThreeGridComponent? in | |
print("feedComponent.asThreeGrid()") | |
return feedComponent.asThreeGrid() | |
} | |
.flatMap { threeGridComponent -> [HashtagFeedThreeGridComponent.Item] in | |
print("threeGridComponent.row: \(threeGridComponent.row)") | |
return threeGridComponent.items | |
} | |
.compactMap { item -> Style? in | |
print("item.asStyle(\(String(describing: item.asStyle()?.id)))") | |
return item.asStyle() | |
} | |
.map { style -> NewHashtagFeedViewSection.Item in | |
print(".styleTile(\(style.id))") | |
return .styleTile(style) | |
} | |
} | |
private func optimizedStyleTileSectionItems(feed: NewHashtagFeed) -> [NewHashtagFeedViewSection.Item] { | |
return feed.components | |
.flatMap { feedComponent -> [NewHashtagFeedViewSection.Item] in | |
let threeGridComponent = feedComponent.asThreeGrid() | |
print("threeGridComponent.row: \(String(describing: threeGridComponent?.row))") | |
let styles = threeGridComponent?.items.compactMap { item -> Style? in | |
print("item.asStyle(\(String(describing: item.asStyle()?.id)))") | |
return item.asStyle() | |
} | |
let sectionItems = styles?.compactMap { style -> NewHashtagFeedViewSection.Item in | |
print(".styleTile(\(style.id))") | |
return NewHashtagFeedViewSection.Item.styleTile(style) | |
} | |
return sectionItems ?? [] | |
} | |
} | |
private func optimized2StyleTileSectionItems(feed: NewHashtagFeed) -> [NewHashtagFeedViewSection.Item] { | |
var sectionItems: [NewHashtagFeedViewSection.Item] = [] | |
for component in feed.components { | |
guard let threeGridComponent = component.asThreeGrid() else { continue } | |
let flattedComponentItems = threeGridComponent.items.compactMap { $0 } | |
let styles = flattedComponentItems.compactMap { $0.asStyle() } | |
styles.forEach { sectionItems.append(NewHashtagFeedViewSection.Item.styleTile($0)) } | |
} | |
return sectionItems | |
} | |
let feed = NewHashtagFeed(components: [ | |
NewHashtagFeed.Component.threeGrid(HashtagFeedThreeGridComponent(row: 0, items: [ | |
.threeGridStyleCard(Style(id: 1)), | |
.threeGridStyleCard(Style(id: 2)), | |
.threeGridStyleCard(Style(id: 3)), | |
])), | |
NewHashtagFeed.Component.threeGrid(HashtagFeedThreeGridComponent(row: 1, items: [ | |
.threeGridStyleCard(Style(id: 4)), | |
.threeGridStyleCard(Style(id: 5)), | |
.threeGridStyleCard(Style(id: 6)), | |
])), | |
NewHashtagFeed.Component.threeGrid(HashtagFeedThreeGridComponent(row: 2, items: [ | |
.threeGridStyleCard(Style(id: 7)), | |
.threeGridStyleCard(Style(id: 8)), | |
.threeGridStyleCard(Style(id: 9)), | |
])), | |
]) | |
let lazySectionItems = lazyStyleTileSectionItems(feed: feed) | |
let optimizedSectionItems = optimizedStyleTileSectionItems(feed: feed) | |
let optimized2SectionItems = optimized2StyleTileSectionItems(feed: feed) | |
let sectionItems = styleTileSectionItems(feed: feed) | |
print(lazySectionItems) | |
print(optimizedSectionItems) | |
print(optimized2SectionItems) | |
print(sectionItems) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment