import Combine extension Effect { /// Creates an effect from a Combine publisher. /// /// - Parameter createPublisher: The closure to execute when the effect is performed. /// - Returns: An effect wrapping a Combine publisher. public static func publisher(_ createPublisher: () -> some Publisher) -> Self { Self(operation: .publisher(createPublisher().eraseToAnyPublisher())) } } public struct _EffectPublisher: Publisher { public typealias Output = Action public typealias Failure = Never let effect: Effect public init(_ effect: Effect) { self.effect = effect } public func receive(subscriber: some Combine.Subscriber) { publisher.subscribe(subscriber) } private var publisher: AnyPublisher { switch effect.operation { case .none: return Empty().eraseToAnyPublisher() case let .publisher(publisher): return publisher case let .run(priority, operation): return .create { subscriber in let task = Task(priority: priority) { @MainActor in defer { subscriber.send(completion: .finished) } await operation(Send { subscriber.send($0) }) } return AnyCancellable { task.cancel() } } } } }