How about Deferred - https://developer.apple.com/documentation/combine/deferred?
Deferred{Just(getFruit())} allows retry with just value and without need of extra map.
Deferred{Just(getFruit())}
.flatMap { value - AnyPublisherString, FruitError in
print("in flat map \(value)")
if value == "apple" {
fruit = "pineapple"
return Fail(error: FruitError.bad).eraseToAnyPublisher()
}
return Just("banana").setFailureType(to: FruitError.self).eraseToAnyPublisher()
}
.retry(1)
.sink(receiveCompletion: { print($0) }, receiveValue: {print($0)})
.store(in: &cancellables)