Skip to content

Instantly share code, notes, and snippets.

@innocarpe
Last active September 10, 2020 09:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save innocarpe/6c1edab5a9bfac953c7c303121bf67b4 to your computer and use it in GitHub Desktop.
Save innocarpe/6c1edab5a9bfac953c7c303121bf67b4 to your computer and use it in GitHub Desktop.
LazySequenceTest
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