import Foundation struct WebSearchSelectionState: Equatable { let selectedIds: Set static func ==(lhs: WebSearchSelectionState, rhs: WebSearchSelectionState) -> Bool { return lhs.selectedIds == rhs.selectedIds } init(selectedIds: Set) { self.selectedIds = selectedIds } } enum WebSearchMode: Int32 { case images case gifs } struct WebSearchInterfaceInnerState: Equatable { let mode: WebSearchMode let selectionState: WebSearchSelectionState } struct WebSearchInterfaceState: Equatable { let state: WebSearchInterfaceInnerState? let presentationData: PresentationData init (presentationData: PresentationData) { self.state = nil self.presentationData = presentationData } init(state: WebSearchInterfaceInnerState?, presentationData: PresentationData) { self.state = state self.presentationData = presentationData } func withUpdatedMode(_ mode: WebSearchMode) -> WebSearchInterfaceState { return WebSearchInterfaceState(state: WebSearchInterfaceInnerState(mode: mode, selectionState: self.state?.selectionState ?? WebSearchSelectionState(selectedIds: [])), presentationData: self.presentationData) } func withUpdatedSelectionState(_ selectionState: WebSearchSelectionState) -> WebSearchInterfaceState { return WebSearchInterfaceState(state: WebSearchInterfaceInnerState(mode: self.state?.mode ?? .images, selectionState: selectionState), presentationData: self.presentationData) } func withToggledSelectedMessages(_ ids: [String], value: Bool) -> WebSearchInterfaceState { var selectedIds = Set() if let selectionState = self.state?.selectionState { selectedIds.formUnion(selectionState.selectedIds) } for id in ids { if value { selectedIds.insert(id) } else { selectedIds.remove(id) } } return WebSearchInterfaceState(state: WebSearchInterfaceInnerState(mode: self.state?.mode ?? .images, selectionState: WebSearchSelectionState(selectedIds: selectedIds)), presentationData: self.presentationData) } func withUpdatedPresentationData(_ presentationData: PresentationData) -> WebSearchInterfaceState { return WebSearchInterfaceState(state: self.state, presentationData: presentationData) } }