public extension Profile.Content { struct Elements: Hashable { /// The rants that the user has created. public let rants: [Rant] /// The rants that the user has upvoted. public let upvotedRants: [Rant] /// The comments that the user has created. public let comments: [Comment] /// The rants that the user has marked as favorite. public let favorites: [Rant] /// If the profile is from the logged in user, then this list contains rants that user has viewed in the past. public let viewed: [Rant] public init(rants: [Rant], upvotedRants: [Rant], comments: [Comment], favorites: [Rant], viewed: [Rant]) { self.rants = rants self.upvotedRants = upvotedRants self.comments = comments self.favorites = favorites self.viewed = viewed } } } extension Profile.Content.Elements { struct CodingData: Codable { let rants: [Rant.CodingData] let upvoted: [Rant.CodingData] let comments: [Comment.CodingData] let favorites: [Rant.CodingData]? let viewed: [Rant.CodingData]? } } extension Profile.Content.Elements.CodingData { var decoded: Profile.Content.Elements { .init( rants: rants.map(\.decoded), upvotedRants: upvoted.map(\.decoded), comments: comments.map(\.decoded), favorites: favorites?.map(\.decoded) ?? [], viewed: viewed?.map(\.decoded) ?? [] ) } }