Update macOS app to use KMPNativeCoroutinesCombine

This commit is contained in:
Rick Clephas 2021-11-06 13:24:11 +01:00
parent 3b5c8026e2
commit 7765f2526b
40 changed files with 1689 additions and 137 deletions

View file

@ -1,76 +1,41 @@
import Foundation
import Combine
import common
import KMPNativeCoroutinesCombine
class PeopleInSpaceViewModel: ObservableObject {
@Published var people = [Assignment]()
@Published var issPosition = IssPosition(latitude: 0.0, longitude: 0.0)
private var subscription: AnyCancellable?
private var positionCancellable: AnyCancellable?
private var peopleCancellable: AnyCancellable?
private let repository: PeopleInSpaceRepository
init(repository: PeopleInSpaceRepository) {
self.repository = repository
subscription = IssPositionPublisher(repository: repository)
.assign(to: \.issPosition, on: self)
positionCancellable = createPublisher(for: repository.pollISSPositionNative())
.receive(on: DispatchQueue.main)
.sink(receiveCompletion: { completion in
debugPrint(completion)
}, receiveValue: { [weak self] value in
self?.issPosition = value
})
}
func startObservingPeopleUpdates() {
repository.startObservingPeopleUpdates(success: { data in
self.people = data
})
peopleCancellable = createPublisher(for: repository.fetchPeopleAsFlowNative())
.receive(on: DispatchQueue.main)
.sink(receiveCompletion: { completion in
debugPrint(completion)
}, receiveValue: { [weak self] value in
self?.people = value
})
}
func stopObservingPeopleUpdates() {
repository.stopObservingPeopleUpdates()
peopleCancellable?.cancel()
}
}
public struct IssPositionPublisher: Publisher {
public typealias Output = IssPosition
public typealias Failure = Never
private let repository: PeopleInSpaceRepository
public init(repository: PeopleInSpaceRepository) {
self.repository = repository
}
public func receive<S: Subscriber>(subscriber: S) where S.Input == IssPosition, S.Failure == Failure {
let subscription = IssPositionSubscription(repository: repository, subscriber: subscriber)
subscriber.receive(subscription: subscription)
}
final class IssPositionSubscription<S: Subscriber>: Subscription where S.Input == IssPosition, S.Failure == Failure {
private var subscriber: S?
private var job: Kotlinx_coroutines_coreJob? = nil
private let repository: PeopleInSpaceRepository
init(repository: PeopleInSpaceRepository, subscriber: S) {
self.repository = repository
self.subscriber = subscriber
job = repository.iosPollISSPosition().subscribe(
scope: repository.iosScope,
onEach: { position in
subscriber.receive(position!)
},
onComplete: { subscriber.receive(completion: .finished) },
onThrow: { error in debugPrint(error) }
)
}
func cancel() {
subscriber = nil
job?.cancel(cause: nil)
}
func request(_ demand: Subscribers.Demand) {}
}
}

View file

@ -1,5 +1,6 @@
target 'PeopleInSpace' do
pod 'common', :path => '../../common'
pod 'KMPNativeCoroutinesCombine', '0.8.0'
end

View file

@ -1,8 +1,17 @@
PODS:
- common (1.0)
- KMPNativeCoroutinesCombine (0.8.0):
- KMPNativeCoroutinesCore (= 0.8.0)
- KMPNativeCoroutinesCore (0.8.0)
DEPENDENCIES:
- common (from `../../common`)
- KMPNativeCoroutinesCombine (= 0.8.0)
SPEC REPOS:
trunk:
- KMPNativeCoroutinesCombine
- KMPNativeCoroutinesCore
EXTERNAL SOURCES:
common:
@ -10,7 +19,9 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
common: ed5a58383c5a02f46882243487c7aac341a3064f
KMPNativeCoroutinesCombine: cdb11619dbe26c69c27f1bdc50b0291d8fdbff8e
KMPNativeCoroutinesCore: a833472b2d8aa40333dc3ff3ebeeeb7180423602
PODFILE CHECKSUM: 4a9ed74f1dcfe79bd3d28fe2f8ba019437e5cc29
PODFILE CHECKSUM: 4c3532a0227a42a4cdf63df73c96962c3c9bfc06
COCOAPODS: 1.9.3
COCOAPODS: 1.10.1

View file

@ -0,0 +1 @@
../../../Target Support Files/KMPNativeCoroutinesCombine/KMPNativeCoroutinesCombine-umbrella.h

View file

@ -0,0 +1 @@
../../../Target Support Files/KMPNativeCoroutinesCombine/KMPNativeCoroutinesCombine.modulemap

View file

@ -0,0 +1 @@
../../../Target Support Files/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore-umbrella.h

View file

@ -0,0 +1 @@
../../../Target Support Files/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore.modulemap

View file

@ -0,0 +1,60 @@
//
// Future.swift
// KMPNativeCoroutinesCombine
//
// Created by Rick Clephas on 06/06/2021.
//
import Combine
import KMPNativeCoroutinesCore
/// Creates an `AnyPublisher` for the provided `NativeSuspend`.
/// - Parameter nativeSuspend: The native suspend function to await.
/// - Returns: A publisher that either finishes with a single value or fails with an error.
public func createFuture<Result, Failure: Error, Unit>(
for nativeSuspend: @escaping NativeSuspend<Result, Failure, Unit>
) -> AnyPublisher<Result, Failure> {
return NativeSuspendFuture(nativeSuspend: nativeSuspend)
.eraseToAnyPublisher()
}
internal struct NativeSuspendFuture<Result, Failure: Error, Unit>: Publisher {
typealias Output = Result
typealias Failure = Failure
let nativeSuspend: NativeSuspend<Result, Failure, Unit>
func receive<S>(subscriber: S) where S : Subscriber, Failure == S.Failure, Result == S.Input {
let subscription = NativeSuspendSubscription(nativeSuspend: nativeSuspend, subscriber: subscriber)
subscriber.receive(subscription: subscription)
}
}
internal class NativeSuspendSubscription<Result, Failure, Unit, S: Subscriber>: Subscription where S.Input == Result, S.Failure == Failure {
private var nativeCancellable: NativeCancellable<Unit>? = nil
private var subscriber: S?
init(nativeSuspend: NativeSuspend<Result, Failure, Unit>, subscriber: S) {
self.subscriber = subscriber
nativeCancellable = nativeSuspend({ output, unit in
if let subscriber = self.subscriber {
_ = subscriber.receive(output)
subscriber.receive(completion: .finished)
}
return unit
}, { error, unit in
self.subscriber?.receive(completion: .failure(error))
return unit
})
}
func request(_ demand: Subscribers.Demand) { }
func cancel() {
subscriber = nil
_ = nativeCancellable?()
nativeCancellable = nil
}
}

View file

@ -0,0 +1,20 @@
//
// FuturePublisher.swift
// KMPNativeCoroutinesCombine
//
// Created by Rick Clephas on 28/06/2021.
//
import Combine
import KMPNativeCoroutinesCore
/// Creates an `AnyPublisher` for the provided `NativeSuspend` that returns a `NativeFlow`.
/// - Parameter nativeSuspend: The native suspend function to await.
/// - Returns: A publisher that publishes the collected values.
public func createPublisher<Output, Failure: Error, Unit>(
for nativeSuspend: @escaping NativeSuspend<NativeFlow<Output, Failure, Unit>, Failure, Unit>
) -> AnyPublisher<Output, Failure> {
return createFuture(for: nativeSuspend)
.flatMap { createPublisher(for: $0) }
.eraseToAnyPublisher()
}

View file

@ -0,0 +1,61 @@
//
// Publisher.swift
// KMPNativeCoroutinesCombine
//
// Created by Rick Clephas on 06/06/2021.
//
import Combine
import KMPNativeCoroutinesCore
/// Creates an `AnyPublisher` for the provided `NativeFlow`.
/// - Parameter nativeFlow: The native flow to collect.
/// - Returns: A publisher that publishes the collected values.
public func createPublisher<Output, Failure: Error, Unit>(
for nativeFlow: @escaping NativeFlow<Output, Failure, Unit>
) -> AnyPublisher<Output, Failure> {
return NativeFlowPublisher(nativeFlow: nativeFlow)
.eraseToAnyPublisher()
}
internal struct NativeFlowPublisher<Output, Failure: Error, Unit>: Publisher {
typealias Output = Output
typealias Failure = Failure
let nativeFlow: NativeFlow<Output, Failure, Unit>
func receive<S>(subscriber: S) where S : Subscriber, Failure == S.Failure, Output == S.Input {
let subscription = NativeFlowSubscription(nativeFlow: nativeFlow, subscriber: subscriber)
subscriber.receive(subscription: subscription)
}
}
internal class NativeFlowSubscription<Output, Failure, Unit, S: Subscriber>: Subscription where S.Input == Output, S.Failure == Failure {
private var nativeCancellable: NativeCancellable<Unit>? = nil
private var subscriber: S?
init(nativeFlow: NativeFlow<Output, Failure, Unit>, subscriber: S) {
self.subscriber = subscriber
nativeCancellable = nativeFlow({ item, unit in
_ = self.subscriber?.receive(item)
return unit
}, { error, unit in
if let error = error {
self.subscriber?.receive(completion: .failure(error))
} else {
self.subscriber?.receive(completion: .finished)
}
return unit
})
}
func request(_ demand: Subscribers.Demand) { }
func cancel() {
subscriber = nil
_ = nativeCancellable?()
nativeCancellable = nil
}
}

View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021 Rick Clephas
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -0,0 +1,318 @@
# KMP-NativeCoroutines
A library to use Kotlin Coroutines from Swift code in KMP apps.
## Why this library?
Both KMP and Kotlin Coroutines are amazing but together they have some limitations.
The most important limitation is cancellation support.
Kotlin suspend functions are exposed to Swift as functions with a completion handler.
This allows you to easily use them from your Swift code, but it doesn't support cancellation.
> While Swift 5.5 brings async functions to Swift, it doesn't solve this issue.
> For interoperability with ObjC all function with a completion handler can be called like an async function.
> This means starting with Swift 5.5 your Kotlin suspend functions will look like Swift async functions.
> But that's just syntactic sugar, so there's still no cancellation support.
Besides cancellation support, ObjC doesn't support generics on protocols.
So all the `Flow` interfaces lose their generic value type which make them hard to use.
This library solves both of these limitations :smile: .
## Compatibility
As of version `0.6.0` the library uses Kotlin version `1.5.30`.
Compatibility versions for older Kotlin versions are also available:
|Version|Version suffix|Kotlin|Coroutines|
|---|---|:---:|:---:|
|_latest_|_no suffix_|1.5.30|1.5.2-native-mt|
|_latest_|-kotlin-1.5.20|1.5.20|1.5.0-native-mt|
|0.4.3|-kotlin-1.5.10|1.5.10|1.5.0-native-mt|
You can choose from a couple of Swift implementations.
Depending on the implementation you can support as low as iOS 9, macOS 10.9, tvOS 9 and watchOS 3:
|Implementation|Swift|iOS|macOS|tvOS|watchOS|
|---|:---:|:---:|:---:|:---:|:---:|
|RxSwift|5.0|9.0|10.9|9.0|3.0|
|Combine|5.0|13.0|10.15|13.0|6.0|
|Async :construction:|5.5|13.0|10.15|13.0|6.0|
> :construction: : the Async implementation requires Xcode 13.2 which is currently in beta!
## Installation
The library consists of a Kotlin and Swift part which you'll need to add to your project.
The Kotlin part is available on Maven Central and the Swift part can be installed via CocoaPods
or the Swift Package Manager.
Make sure to always use the same versions for all the libraries!
[![latest release](https://img.shields.io/github/v/release/rickclephas/KMP-NativeCoroutines?label=latest%20release&sort=semver)](https://github.com/rickclephas/KMP-NativeCoroutines/releases)
### Kotlin
For Kotlin just add the plugin to your `build.gradle.kts`:
```kotlin
plugins {
id("com.rickclephas.kmp.nativecoroutines") version "<version>"
}
```
### Swift (CocoaPods)
Now for Swift you can choose from a couple of implementations.
Add one or more of the following libraries to your `Podfile`:
```ruby
pod 'KMPNativeCoroutinesCombine' # Combine implementation
pod 'KMPNativeCoroutinesRxSwift' # RxSwift implementation
pod 'KMPNativeCoroutinesAsync' # Swift 5.5 Async/Await implementation
```
### Swift (Swift Package Manager)
All Swift implementations are also available via the Swift Package Manager.
> **NOTE:** `KMPNativeCoroutinesAsync` requires Xcode 13.2 which is currently in beta.
> To add the async implementation you should add the `-swift-async-await` suffix to the version.
Just add it to your `Package.swift` file:
```swift
dependencies: [
.package(url: "git@github.com:rickclephas/KMP-NativeCoroutines.git", from: "<version>")
]
```
Or add it in Xcode by going to `File` > `Add Packages...` and providing the URL:
`git@github.com:rickclephas/KMP-NativeCoroutines.git`.
## Usage
Using your Kotlin Coroutines code from Swift is almost as easy as calling the Kotlin code.
Just use the wrapper functions in Swift to get Observables, Publishers, AsyncStreams or async functions.
### Kotlin
The plugin will automagically generate the necessary code for you! :crystal_ball:
Your `Flow` properties/functions get a `Native` version:
```kotlin
class Clock {
// Somewhere in your Kotlin code you define a Flow property
val time: StateFlow<Long> // This can be any kind of Flow
// The plugin will generate this native property for you
val timeNative
get() = time.asNativeFlow()
}
```
In case of a `StateFlow` or `SharedFlow` property you also get a `NativeValue` or `NativeReplayCache` property:
```kotlin
// For the StateFlow defined above the plugin will generate this native value property
val timeNativeValue
get() = time.value
// In case of a SharedFlow the plugin would generate this native replay cache property
val timeNativeReplayCache
get() = time.replayCache
```
The plugin also generates `Native` versions for all your suspend functions:
```kotlin
class RandomLettersGenerator {
// Somewhere in your Kotlin code you define a suspend function
suspend fun getRandomLetters(): String {
// Code to generate some random letters
}
// The plugin will generate this native function for you
fun getRandomLettersNative() =
nativeSuspend { getRandomLetters() }
}
```
#### Global properties and functions
The plugin is currently unable to generate native versions for global properties and functions.
In such cases you have to manually create the native versions in your Kotlin native code.
#### Custom suffix
If you don't like the naming of these generated properties/functions, you can easily change the suffix.
For example add the following to your `build.gradle.kts` to use the suffix `Apple`:
```kotlin
nativeCoroutines {
suffix = "Apple"
}
```
#### Custom CoroutineScope
For more control you can provide a custom `CoroutineScope` with the `NativeCoroutineScope` annotation:
```kotlin
class Clock {
@NativeCoroutineScope
internal val coroutineScope = CoroutineScope(job + Dispatchers.Default)
}
```
If you don't provide a `CoroutineScope` the default scope will be used which is defined as:
```kotlin
@SharedImmutable
internal val defaultCoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
```
#### Ignoring declarations
Use the `NativeCoroutinesIgnore` annotation to tell the plugin to ignore a property or function:
```kotlin
@NativeCoroutinesIgnore
val ignoredFlowProperty: Flow<Int>
@NativeCoroutinesIgnore
suspend fun ignoredSuspendFunction() { }
```
### RxSwift
The RxSwift implementation provides a couple functions to get an `Observable` or `Single` for your Coroutines code.
For your `Flow`s use the `createObservable(for:)` function:
```swift
// Create an observable for your flow
let observable = createObservable(for: clock.timeNative)
// Now use this observable as you would any other
let disposable = observable.subscribe(onNext: { value in
print("Received value: \(value)")
}, onError: { error in
print("Received error: \(error)")
}, onCompleted: {
print("Observable completed")
}, onDisposed: {
print("Observable disposed")
})
// To cancel the flow (collection) just dispose the subscription
disposable.dispose()
```
For the suspend functions you should use the `createSingle(for:)` function:
```swift
// Create a single for the suspend function
let single = createSingle(for: randomLettersGenerator.getRandomLettersNative())
// Now use this single as you would any other
let disposable = single.subscribe(onSuccess: { value in
print("Received value: \(value)")
}, onFailure: { error in
print("Received error: \(error)")
}, onDisposed: {
print("Single disposed")
})
// To cancel the suspend function just dispose the subscription
disposable.dispose()
```
You can also use the `createObservable(for:)` function for suspend functions that return a `Flow`:
```swift
let observable = createObservable(for: randomLettersGenerator.getRandomLettersFlowNative())
```
**Note:** these functions create deferred `Observable`s and `Single`s.
Meaning every subscription will trigger the collection of the `Flow` or execution of the suspend function.
### Combine
The Combine implementation provides a couple functions to get an `AnyPublisher` for your Coroutines code.
For your `Flow`s use the `createPublisher(for:)` function:
```swift
// Create an AnyPublisher for your flow
let publisher = createPublisher(for: clock.timeNative)
// Now use this publisher as you would any other
let cancellable = publisher.sink { completion in
print("Received completion: \(completion)")
} receiveValue: { value in
print("Received value: \(value)")
}
// To cancel the flow (collection) just cancel the publisher
cancellable.cancel()
```
For the suspend functions you should use the `createFuture(for:)` function:
```swift
// Create a Future/AnyPublisher for the suspend function
let future = createFuture(for: randomLettersGenerator.getRandomLettersNative())
// Now use this future as you would any other
let cancellable = future.sink { completion in
print("Received completion: \(completion)")
} receiveValue: { value in
print("Received value: \(value)")
}
// To cancel the suspend function just cancel the future
cancellable.cancel()
```
You can also use the `createPublisher(for:)` function for suspend functions that return a `Flow`:
```swift
let publisher = createPublisher(for: randomLettersGenerator.getRandomLettersFlowNative())
```
**Note:** these functions create deferred `AnyPublisher`s.
Meaning every subscription will trigger the collection of the `Flow` or execution of the suspend function.
### Swift 5.5 Async/Await
> :construction: : the Async implementation requires Xcode 13.2 which is currently in beta!
The Async implementation provides some functions to get async Swift functions and `AsyncStream`s.
Use the `asyncFunction(for:)` function to get an async function that can be awaited:
```swift
let handle = Task {
do {
let letters = try await asyncFunction(for: randomLettersGenerator.getRandomLettersNative())
print("Got random letters: \(letters)")
} catch {
print("Failed with error: \(error)")
}
}
// To cancel the suspend function just cancel the async task
handle.cancel()
```
or if you don't like these do-catches you can use the `asyncResult(for:)` function:
```swift
let result = await asyncResult(for: randomLettersGenerator.getRandomLettersNative())
if case let .success(letters) = result {
print("Got random letters: \(letters)")
}
```
For `Flow`s there is the `asyncStream(for:)` function to get an `AsyncStream`:
```swift
let handle = Task {
do {
let stream = asyncStream(for: randomLettersGenerator.getRandomLettersFlowNative())
for try await letters in stream {
print("Got random letters: \(letters)")
}
} catch {
print("Failed with error: \(error)")
}
}
// To cancel the flow (collection) just cancel the async task
handle.cancel()
```

View file

@ -0,0 +1,12 @@
//
// NativeCallback.swift
// KMPNativeCoroutinesCore
//
// Created by Rick Clephas on 06/06/2021.
//
/// A callback with a single argument.
///
/// The return value is provided as the second argument.
/// This way Swift doesn't known what it is/how to get it.
public typealias NativeCallback<T, Unit> = (T, Unit) -> Unit

View file

@ -0,0 +1,9 @@
//
// NativeCancellable.swift
// KMPNativeCoroutinesCore
//
// Created by Rick Clephas on 06/06/2021.
//
/// A function that cancels the coroutines job.
public typealias NativeCancellable<Unit> = () -> Unit

View file

@ -0,0 +1,15 @@
//
// NativeFlow.swift
// KMPNativeCoroutinesCore
//
// Created by Rick Clephas on 06/06/2021.
//
/// A function that collects a Kotlin coroutines Flow via callbacks.
///
/// The function takes an `onItem` and `onComplete` callback
/// and returns a cancellable that can be used to cancel the collection.
public typealias NativeFlow<Output, Failure: Error, Unit> = (
_ onItem: @escaping NativeCallback<Output, Unit>,
_ onComplete: @escaping NativeCallback<Failure?, Unit>
) -> NativeCancellable<Unit>

View file

@ -0,0 +1,15 @@
//
// NativeSuspend.swift
// KMPNativeCoroutinesCore
//
// Created by Rick Clephas on 06/06/2021.
//
/// A function that awaits a suspend function via callbacks.
///
/// The function takes an `onResult` and `onError` callback
/// and returns a cancellable that can be used to cancel the suspend function.
public typealias NativeSuspend<Result, Failure: Error, Unit> = (
_ onResult: @escaping NativeCallback<Result, Unit>,
_ onError: @escaping NativeCallback<Failure, Unit>
) -> NativeCancellable<Unit>

View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2021 Rick Clephas
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View file

@ -0,0 +1,318 @@
# KMP-NativeCoroutines
A library to use Kotlin Coroutines from Swift code in KMP apps.
## Why this library?
Both KMP and Kotlin Coroutines are amazing but together they have some limitations.
The most important limitation is cancellation support.
Kotlin suspend functions are exposed to Swift as functions with a completion handler.
This allows you to easily use them from your Swift code, but it doesn't support cancellation.
> While Swift 5.5 brings async functions to Swift, it doesn't solve this issue.
> For interoperability with ObjC all function with a completion handler can be called like an async function.
> This means starting with Swift 5.5 your Kotlin suspend functions will look like Swift async functions.
> But that's just syntactic sugar, so there's still no cancellation support.
Besides cancellation support, ObjC doesn't support generics on protocols.
So all the `Flow` interfaces lose their generic value type which make them hard to use.
This library solves both of these limitations :smile: .
## Compatibility
As of version `0.6.0` the library uses Kotlin version `1.5.30`.
Compatibility versions for older Kotlin versions are also available:
|Version|Version suffix|Kotlin|Coroutines|
|---|---|:---:|:---:|
|_latest_|_no suffix_|1.5.30|1.5.2-native-mt|
|_latest_|-kotlin-1.5.20|1.5.20|1.5.0-native-mt|
|0.4.3|-kotlin-1.5.10|1.5.10|1.5.0-native-mt|
You can choose from a couple of Swift implementations.
Depending on the implementation you can support as low as iOS 9, macOS 10.9, tvOS 9 and watchOS 3:
|Implementation|Swift|iOS|macOS|tvOS|watchOS|
|---|:---:|:---:|:---:|:---:|:---:|
|RxSwift|5.0|9.0|10.9|9.0|3.0|
|Combine|5.0|13.0|10.15|13.0|6.0|
|Async :construction:|5.5|13.0|10.15|13.0|6.0|
> :construction: : the Async implementation requires Xcode 13.2 which is currently in beta!
## Installation
The library consists of a Kotlin and Swift part which you'll need to add to your project.
The Kotlin part is available on Maven Central and the Swift part can be installed via CocoaPods
or the Swift Package Manager.
Make sure to always use the same versions for all the libraries!
[![latest release](https://img.shields.io/github/v/release/rickclephas/KMP-NativeCoroutines?label=latest%20release&sort=semver)](https://github.com/rickclephas/KMP-NativeCoroutines/releases)
### Kotlin
For Kotlin just add the plugin to your `build.gradle.kts`:
```kotlin
plugins {
id("com.rickclephas.kmp.nativecoroutines") version "<version>"
}
```
### Swift (CocoaPods)
Now for Swift you can choose from a couple of implementations.
Add one or more of the following libraries to your `Podfile`:
```ruby
pod 'KMPNativeCoroutinesCombine' # Combine implementation
pod 'KMPNativeCoroutinesRxSwift' # RxSwift implementation
pod 'KMPNativeCoroutinesAsync' # Swift 5.5 Async/Await implementation
```
### Swift (Swift Package Manager)
All Swift implementations are also available via the Swift Package Manager.
> **NOTE:** `KMPNativeCoroutinesAsync` requires Xcode 13.2 which is currently in beta.
> To add the async implementation you should add the `-swift-async-await` suffix to the version.
Just add it to your `Package.swift` file:
```swift
dependencies: [
.package(url: "git@github.com:rickclephas/KMP-NativeCoroutines.git", from: "<version>")
]
```
Or add it in Xcode by going to `File` > `Add Packages...` and providing the URL:
`git@github.com:rickclephas/KMP-NativeCoroutines.git`.
## Usage
Using your Kotlin Coroutines code from Swift is almost as easy as calling the Kotlin code.
Just use the wrapper functions in Swift to get Observables, Publishers, AsyncStreams or async functions.
### Kotlin
The plugin will automagically generate the necessary code for you! :crystal_ball:
Your `Flow` properties/functions get a `Native` version:
```kotlin
class Clock {
// Somewhere in your Kotlin code you define a Flow property
val time: StateFlow<Long> // This can be any kind of Flow
// The plugin will generate this native property for you
val timeNative
get() = time.asNativeFlow()
}
```
In case of a `StateFlow` or `SharedFlow` property you also get a `NativeValue` or `NativeReplayCache` property:
```kotlin
// For the StateFlow defined above the plugin will generate this native value property
val timeNativeValue
get() = time.value
// In case of a SharedFlow the plugin would generate this native replay cache property
val timeNativeReplayCache
get() = time.replayCache
```
The plugin also generates `Native` versions for all your suspend functions:
```kotlin
class RandomLettersGenerator {
// Somewhere in your Kotlin code you define a suspend function
suspend fun getRandomLetters(): String {
// Code to generate some random letters
}
// The plugin will generate this native function for you
fun getRandomLettersNative() =
nativeSuspend { getRandomLetters() }
}
```
#### Global properties and functions
The plugin is currently unable to generate native versions for global properties and functions.
In such cases you have to manually create the native versions in your Kotlin native code.
#### Custom suffix
If you don't like the naming of these generated properties/functions, you can easily change the suffix.
For example add the following to your `build.gradle.kts` to use the suffix `Apple`:
```kotlin
nativeCoroutines {
suffix = "Apple"
}
```
#### Custom CoroutineScope
For more control you can provide a custom `CoroutineScope` with the `NativeCoroutineScope` annotation:
```kotlin
class Clock {
@NativeCoroutineScope
internal val coroutineScope = CoroutineScope(job + Dispatchers.Default)
}
```
If you don't provide a `CoroutineScope` the default scope will be used which is defined as:
```kotlin
@SharedImmutable
internal val defaultCoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Default)
```
#### Ignoring declarations
Use the `NativeCoroutinesIgnore` annotation to tell the plugin to ignore a property or function:
```kotlin
@NativeCoroutinesIgnore
val ignoredFlowProperty: Flow<Int>
@NativeCoroutinesIgnore
suspend fun ignoredSuspendFunction() { }
```
### RxSwift
The RxSwift implementation provides a couple functions to get an `Observable` or `Single` for your Coroutines code.
For your `Flow`s use the `createObservable(for:)` function:
```swift
// Create an observable for your flow
let observable = createObservable(for: clock.timeNative)
// Now use this observable as you would any other
let disposable = observable.subscribe(onNext: { value in
print("Received value: \(value)")
}, onError: { error in
print("Received error: \(error)")
}, onCompleted: {
print("Observable completed")
}, onDisposed: {
print("Observable disposed")
})
// To cancel the flow (collection) just dispose the subscription
disposable.dispose()
```
For the suspend functions you should use the `createSingle(for:)` function:
```swift
// Create a single for the suspend function
let single = createSingle(for: randomLettersGenerator.getRandomLettersNative())
// Now use this single as you would any other
let disposable = single.subscribe(onSuccess: { value in
print("Received value: \(value)")
}, onFailure: { error in
print("Received error: \(error)")
}, onDisposed: {
print("Single disposed")
})
// To cancel the suspend function just dispose the subscription
disposable.dispose()
```
You can also use the `createObservable(for:)` function for suspend functions that return a `Flow`:
```swift
let observable = createObservable(for: randomLettersGenerator.getRandomLettersFlowNative())
```
**Note:** these functions create deferred `Observable`s and `Single`s.
Meaning every subscription will trigger the collection of the `Flow` or execution of the suspend function.
### Combine
The Combine implementation provides a couple functions to get an `AnyPublisher` for your Coroutines code.
For your `Flow`s use the `createPublisher(for:)` function:
```swift
// Create an AnyPublisher for your flow
let publisher = createPublisher(for: clock.timeNative)
// Now use this publisher as you would any other
let cancellable = publisher.sink { completion in
print("Received completion: \(completion)")
} receiveValue: { value in
print("Received value: \(value)")
}
// To cancel the flow (collection) just cancel the publisher
cancellable.cancel()
```
For the suspend functions you should use the `createFuture(for:)` function:
```swift
// Create a Future/AnyPublisher for the suspend function
let future = createFuture(for: randomLettersGenerator.getRandomLettersNative())
// Now use this future as you would any other
let cancellable = future.sink { completion in
print("Received completion: \(completion)")
} receiveValue: { value in
print("Received value: \(value)")
}
// To cancel the suspend function just cancel the future
cancellable.cancel()
```
You can also use the `createPublisher(for:)` function for suspend functions that return a `Flow`:
```swift
let publisher = createPublisher(for: randomLettersGenerator.getRandomLettersFlowNative())
```
**Note:** these functions create deferred `AnyPublisher`s.
Meaning every subscription will trigger the collection of the `Flow` or execution of the suspend function.
### Swift 5.5 Async/Await
> :construction: : the Async implementation requires Xcode 13.2 which is currently in beta!
The Async implementation provides some functions to get async Swift functions and `AsyncStream`s.
Use the `asyncFunction(for:)` function to get an async function that can be awaited:
```swift
let handle = Task {
do {
let letters = try await asyncFunction(for: randomLettersGenerator.getRandomLettersNative())
print("Got random letters: \(letters)")
} catch {
print("Failed with error: \(error)")
}
}
// To cancel the suspend function just cancel the async task
handle.cancel()
```
or if you don't like these do-catches you can use the `asyncResult(for:)` function:
```swift
let result = await asyncResult(for: randomLettersGenerator.getRandomLettersNative())
if case let .success(letters) = result {
print("Got random letters: \(letters)")
}
```
For `Flow`s there is the `asyncStream(for:)` function to get an `AsyncStream`:
```swift
let handle = Task {
do {
let stream = asyncStream(for: randomLettersGenerator.getRandomLettersFlowNative())
for try await letters in stream {
print("Got random letters: \(letters)")
}
} catch {
print("Failed with error: \(error)")
}
}
// To cancel the flow (collection) just cancel the async task
handle.cancel()
```

View file

@ -1,8 +1,17 @@
PODS:
- common (1.0)
- KMPNativeCoroutinesCombine (0.8.0):
- KMPNativeCoroutinesCore (= 0.8.0)
- KMPNativeCoroutinesCore (0.8.0)
DEPENDENCIES:
- common (from `../../common`)
- KMPNativeCoroutinesCombine (= 0.8.0)
SPEC REPOS:
trunk:
- KMPNativeCoroutinesCombine
- KMPNativeCoroutinesCore
EXTERNAL SOURCES:
common:
@ -10,7 +19,9 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
common: ed5a58383c5a02f46882243487c7aac341a3064f
KMPNativeCoroutinesCombine: cdb11619dbe26c69c27f1bdc50b0291d8fdbff8e
KMPNativeCoroutinesCore: a833472b2d8aa40333dc3ff3ebeeeb7180423602
PODFILE CHECKSUM: 4a9ed74f1dcfe79bd3d28fe2f8ba019437e5cc29
PODFILE CHECKSUM: 4c3532a0227a42a4cdf63df73c96962c3c9bfc06
COCOAPODS: 1.9.3
COCOAPODS: 1.10.1

View file

@ -20,35 +20,105 @@
/* End PBXAggregateTarget section */
/* Begin PBXBuildFile section */
7EE04E32660FEA2555A49E1495986AF0 /* Pods-PeopleInSpace-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = B940C188B389195C78FD350311951B45 /* Pods-PeopleInSpace-dummy.m */; };
043C42C08203AD7285BDB21C47D33249 /* Pods-PeopleInSpace-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CF68B67E775C58C4C4F3EDCBCA259CCF /* Pods-PeopleInSpace-dummy.m */; };
3736EF6166F11F146BF0224EF85DCD33 /* Publisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73149DE97EFF466A1568E5444D7CD0D8 /* Publisher.swift */; };
410E20CC9003F5209E289FC65A2DD68B /* Pods-PeopleInSpace-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0053595AACBFEC654010ADCF2653DC81 /* Pods-PeopleInSpace-umbrella.h */; settings = {ATTRIBUTES = (Project, ); }; };
4D058353F02CB5ADCD8D002099B1DF7A /* KMPNativeCoroutinesCore-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A0C62779E9F25B9D466FEC7CC23B1D67 /* KMPNativeCoroutinesCore-dummy.m */; };
4DC8F1E3DC92D51E273BCEBF689FBE81 /* NativeFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BE05ED93C5134B9D56393B182882436A /* NativeFlow.swift */; };
67CD9BF971445F04D19C8A3F0E694D03 /* NativeSuspend.swift in Sources */ = {isa = PBXBuildFile; fileRef = 611593A13CAA4F1FA1570FF3916625D0 /* NativeSuspend.swift */; };
7E6C22677B35403CD19CD97CF5C9C55B /* NativeCancellable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 75183D40F3E75DC5F1D0B0B070D5B04F /* NativeCancellable.swift */; };
81017431C9331986689A0A08AFA75E2B /* FuturePublisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = F860A0723C9C947E65E02533615A6529 /* FuturePublisher.swift */; };
8AD216478639C6A89F4A5681F0167FC2 /* NativeCallback.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44756A68E369D299A81D14A655157263 /* NativeCallback.swift */; };
AD6E8E9276C772339C578AF8B668AA82 /* KMPNativeCoroutinesCore-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B276657920D376EF3A9EBCE35D0D8F1E /* KMPNativeCoroutinesCore-umbrella.h */; settings = {ATTRIBUTES = (Project, ); }; };
BA5CB03EB636E2CAB97BF33EC29BE249 /* KMPNativeCoroutinesCombine-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 56730A2BB8C6B21DC3C1DE2D1D464E68 /* KMPNativeCoroutinesCombine-umbrella.h */; settings = {ATTRIBUTES = (Project, ); }; };
D449674759C5FEEC3D6CC8EB235862CA /* KMPNativeCoroutinesCombine-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 36CC12E1AB4CF26105A57551B45F158C /* KMPNativeCoroutinesCombine-dummy.m */; };
F665CC033BA40B1DD8175B0419E51CAF /* Future.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2ACDC0A0AEEA49523A259A9D243C3EF5 /* Future.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
8231E61C22B0B0267D6B822E259A45F3 /* PBXContainerItemProxy */ = {
47DB3C25400C1F423D29F65D8870E9CB /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 3F9FD9D97D14F53EE028871E5A26555A;
remoteInfo = KMPNativeCoroutinesCombine;
};
78AA26295B54DF9A6A1F5180093F3E80 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = FFFB6783B79B68DA14E36A00A348B0B3;
remoteInfo = KMPNativeCoroutinesCore;
};
9BBF0F64698ABF7695026003A2064F3C /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 8217FBB9D1218C346C0781D0B8F2BBE8;
remoteInfo = common;
};
A0A09942BB536170555BACB2BE6D6FD1 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */;
proxyType = 1;
remoteGlobalIDString = FFFB6783B79B68DA14E36A00A348B0B3;
remoteInfo = KMPNativeCoroutinesCore;
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
0053595AACBFEC654010ADCF2653DC81 /* Pods-PeopleInSpace-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-PeopleInSpace-umbrella.h"; sourceTree = "<group>"; };
00E9CDC40C89F2C4236A1FCF1C2C333D /* KMPNativeCoroutinesCombine.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = KMPNativeCoroutinesCombine.debug.xcconfig; sourceTree = "<group>"; };
092A4CE06CEC277508371925DC20C57F /* common.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = common.release.xcconfig; sourceTree = "<group>"; };
2574321D10AA6E9E090925AD61FC5281 /* Pods-PeopleInSpace.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PeopleInSpace.release.xcconfig"; sourceTree = "<group>"; };
4085E4F5221F23B6ACC7AD5F5DD5311C /* Pods-PeopleInSpace-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PeopleInSpace-acknowledgements.plist"; sourceTree = "<group>"; };
1BC4A026DBC6C2982B828355463B2569 /* libKMPNativeCoroutinesCombine.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libKMPNativeCoroutinesCombine.a; path = libKMPNativeCoroutinesCombine.a; sourceTree = BUILT_PRODUCTS_DIR; };
23785D2EF87CC7217936C2A2C05400F6 /* KMPNativeCoroutinesCombine.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = KMPNativeCoroutinesCombine.modulemap; sourceTree = "<group>"; };
2436EB57A89CB0131F220CB06E4D318F /* Pods-PeopleInSpace-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PeopleInSpace-acknowledgements.plist"; sourceTree = "<group>"; };
2ACDC0A0AEEA49523A259A9D243C3EF5 /* Future.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Future.swift; path = KMPNativeCoroutinesCombine/Future.swift; sourceTree = "<group>"; };
2CB824F75C95F744CD060A677ADEF508 /* KMPNativeCoroutinesCombine.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = KMPNativeCoroutinesCombine.release.xcconfig; sourceTree = "<group>"; };
36CC12E1AB4CF26105A57551B45F158C /* KMPNativeCoroutinesCombine-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "KMPNativeCoroutinesCombine-dummy.m"; sourceTree = "<group>"; };
441594932398928E8B523A7C8A149DDE /* KMPNativeCoroutinesCore.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = KMPNativeCoroutinesCore.debug.xcconfig; sourceTree = "<group>"; };
44756A68E369D299A81D14A655157263 /* NativeCallback.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeCallback.swift; path = KMPNativeCoroutinesCore/NativeCallback.swift; sourceTree = "<group>"; };
56081C4E77068795768A5CF0E879AE38 /* KMPNativeCoroutinesCombine-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KMPNativeCoroutinesCombine-prefix.pch"; sourceTree = "<group>"; };
56730A2BB8C6B21DC3C1DE2D1D464E68 /* KMPNativeCoroutinesCombine-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KMPNativeCoroutinesCombine-umbrella.h"; sourceTree = "<group>"; };
611593A13CAA4F1FA1570FF3916625D0 /* NativeSuspend.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeSuspend.swift; path = KMPNativeCoroutinesCore/NativeSuspend.swift; sourceTree = "<group>"; };
702E8C690C894B05B2B335B3222E38BE /* KMPNativeCoroutinesCore.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = KMPNativeCoroutinesCore.release.xcconfig; sourceTree = "<group>"; };
73149DE97EFF466A1568E5444D7CD0D8 /* Publisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Publisher.swift; path = KMPNativeCoroutinesCombine/Publisher.swift; sourceTree = "<group>"; };
75183D40F3E75DC5F1D0B0B070D5B04F /* NativeCancellable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeCancellable.swift; path = KMPNativeCoroutinesCore/NativeCancellable.swift; sourceTree = "<group>"; };
77A6C896A2C42904FB007F52F8CEFAB8 /* Pods-PeopleInSpace.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PeopleInSpace.debug.xcconfig"; sourceTree = "<group>"; };
793C7F500A5E2FF09F28299CA517AC3F /* libPods-PeopleInSpace.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = "libPods-PeopleInSpace.a"; path = "libPods-PeopleInSpace.a"; sourceTree = BUILT_PRODUCTS_DIR; };
94E5CDD5D764030A85FEEB8A2E3D7F10 /* Pods-PeopleInSpace.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PeopleInSpace.debug.xcconfig"; sourceTree = "<group>"; };
8467F04D2D129DA89380F1ED04CEF090 /* KMPNativeCoroutinesCore-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KMPNativeCoroutinesCore-prefix.pch"; sourceTree = "<group>"; };
935FFB47BC518C20191CB08A3C39EBD9 /* KMPNativeCoroutinesCore.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = KMPNativeCoroutinesCore.modulemap; sourceTree = "<group>"; };
9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
B940C188B389195C78FD350311951B45 /* Pods-PeopleInSpace-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-PeopleInSpace-dummy.m"; sourceTree = "<group>"; };
C4B5AB0FF97F3A1FE65541C1328FB85C /* Pods-PeopleInSpace-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-PeopleInSpace-acknowledgements.markdown"; sourceTree = "<group>"; };
A0C62779E9F25B9D466FEC7CC23B1D67 /* KMPNativeCoroutinesCore-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "KMPNativeCoroutinesCore-dummy.m"; sourceTree = "<group>"; };
AD61EC1E173CDE25748A37C965465600 /* Pods-PeopleInSpace.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-PeopleInSpace.modulemap"; sourceTree = "<group>"; };
B276657920D376EF3A9EBCE35D0D8F1E /* KMPNativeCoroutinesCore-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "KMPNativeCoroutinesCore-umbrella.h"; sourceTree = "<group>"; };
BE05ED93C5134B9D56393B182882436A /* NativeFlow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NativeFlow.swift; path = KMPNativeCoroutinesCore/NativeFlow.swift; sourceTree = "<group>"; };
CF68B67E775C58C4C4F3EDCBCA259CCF /* Pods-PeopleInSpace-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-PeopleInSpace-dummy.m"; sourceTree = "<group>"; };
DA2E698EFAE75544A6E4F612819CCB8B /* common.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = common.framework; path = build/cocoapods/framework/common.framework; sourceTree = "<group>"; };
E32954243B605448566BC0C0B0BCF70D /* libKMPNativeCoroutinesCore.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; name = libKMPNativeCoroutinesCore.a; path = libKMPNativeCoroutinesCore.a; sourceTree = BUILT_PRODUCTS_DIR; };
EB3F91873EE86E12ADFA4BF9F5D786D8 /* common.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = common.debug.xcconfig; sourceTree = "<group>"; };
EEEC7F6E823C77314E6D7F04F0B659C2 /* Pods-PeopleInSpace.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PeopleInSpace.release.xcconfig"; sourceTree = "<group>"; };
F860A0723C9C947E65E02533615A6529 /* FuturePublisher.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FuturePublisher.swift; path = KMPNativeCoroutinesCombine/FuturePublisher.swift; sourceTree = "<group>"; };
FA445701BEFB74B91B7F7202B33193BD /* Pods-PeopleInSpace-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-PeopleInSpace-acknowledgements.markdown"; sourceTree = "<group>"; };
FAA6D45CC6E2EA32EC08EB9FB08994D2 /* common.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = common.podspec; sourceTree = "<group>"; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
E4E62A015C1A66A0F419698716F724CE /* Frameworks */ = {
9267A726B52622ED0E999F5C5BEDC1B1 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
F6A23041D604F1E204DEC95A52D6A66E /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
FFD7C6DF3A4A8D1CF620C630992D63A1 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
@ -69,6 +139,52 @@
path = ../../../common;
sourceTree = "<group>";
};
14FBC9D6FC7ED711FC3A3AFCD36A010B /* Products */ = {
isa = PBXGroup;
children = (
1BC4A026DBC6C2982B828355463B2569 /* libKMPNativeCoroutinesCombine.a */,
E32954243B605448566BC0C0B0BCF70D /* libKMPNativeCoroutinesCore.a */,
793C7F500A5E2FF09F28299CA517AC3F /* libPods-PeopleInSpace.a */,
);
name = Products;
sourceTree = "<group>";
};
3771862DC0EABC5A0E74A521F0266C03 /* KMPNativeCoroutinesCombine */ = {
isa = PBXGroup;
children = (
2ACDC0A0AEEA49523A259A9D243C3EF5 /* Future.swift */,
F860A0723C9C947E65E02533615A6529 /* FuturePublisher.swift */,
73149DE97EFF466A1568E5444D7CD0D8 /* Publisher.swift */,
5FDACE6DF4ACC2F870346DC9CCB58B8A /* Support Files */,
);
name = KMPNativeCoroutinesCombine;
path = KMPNativeCoroutinesCombine;
sourceTree = "<group>";
};
42C631582119F1E69C50DA48CD0F397F /* Pods */ = {
isa = PBXGroup;
children = (
3771862DC0EABC5A0E74A521F0266C03 /* KMPNativeCoroutinesCombine */,
79C13BC4ACA87457CAE6DDBD85FA1B5D /* KMPNativeCoroutinesCore */,
);
name = Pods;
sourceTree = "<group>";
};
45FE54D9A7CB692C4A82AC6A2AF342EF /* Pods-PeopleInSpace */ = {
isa = PBXGroup;
children = (
AD61EC1E173CDE25748A37C965465600 /* Pods-PeopleInSpace.modulemap */,
FA445701BEFB74B91B7F7202B33193BD /* Pods-PeopleInSpace-acknowledgements.markdown */,
2436EB57A89CB0131F220CB06E4D318F /* Pods-PeopleInSpace-acknowledgements.plist */,
CF68B67E775C58C4C4F3EDCBCA259CCF /* Pods-PeopleInSpace-dummy.m */,
0053595AACBFEC654010ADCF2653DC81 /* Pods-PeopleInSpace-umbrella.h */,
77A6C896A2C42904FB007F52F8CEFAB8 /* Pods-PeopleInSpace.debug.xcconfig */,
EEEC7F6E823C77314E6D7F04F0B659C2 /* Pods-PeopleInSpace.release.xcconfig */,
);
name = "Pods-PeopleInSpace";
path = "Target Support Files/Pods-PeopleInSpace";
sourceTree = "<group>";
};
4A33BB545106CE2199669A404AA652FC /* Frameworks */ = {
isa = PBXGroup;
children = (
@ -77,12 +193,31 @@
name = Frameworks;
sourceTree = "<group>";
};
7E33595295125D9ADC3DD69A856B53D6 /* Products */ = {
5FDACE6DF4ACC2F870346DC9CCB58B8A /* Support Files */ = {
isa = PBXGroup;
children = (
793C7F500A5E2FF09F28299CA517AC3F /* libPods-PeopleInSpace.a */,
23785D2EF87CC7217936C2A2C05400F6 /* KMPNativeCoroutinesCombine.modulemap */,
36CC12E1AB4CF26105A57551B45F158C /* KMPNativeCoroutinesCombine-dummy.m */,
56081C4E77068795768A5CF0E879AE38 /* KMPNativeCoroutinesCombine-prefix.pch */,
56730A2BB8C6B21DC3C1DE2D1D464E68 /* KMPNativeCoroutinesCombine-umbrella.h */,
00E9CDC40C89F2C4236A1FCF1C2C333D /* KMPNativeCoroutinesCombine.debug.xcconfig */,
2CB824F75C95F744CD060A677ADEF508 /* KMPNativeCoroutinesCombine.release.xcconfig */,
);
name = Products;
name = "Support Files";
path = "../Target Support Files/KMPNativeCoroutinesCombine";
sourceTree = "<group>";
};
79C13BC4ACA87457CAE6DDBD85FA1B5D /* KMPNativeCoroutinesCore */ = {
isa = PBXGroup;
children = (
44756A68E369D299A81D14A655157263 /* NativeCallback.swift */,
75183D40F3E75DC5F1D0B0B070D5B04F /* NativeCancellable.swift */,
BE05ED93C5134B9D56393B182882436A /* NativeFlow.swift */,
611593A13CAA4F1FA1570FF3916625D0 /* NativeSuspend.swift */,
CC43999398E46B9480F21D63C0373047 /* Support Files */,
);
name = KMPNativeCoroutinesCore;
path = KMPNativeCoroutinesCore;
sourceTree = "<group>";
};
8911087DF480A62FEBFB1D31E5F595A4 /* Pod */ = {
@ -103,17 +238,26 @@
path = "../macOS/PeopleInSpace/Pods/Target Support Files/common";
sourceTree = "<group>";
};
A7BA680F75ECFA065C7E839926F3E718 /* Pods-PeopleInSpace */ = {
B31E03038FAE969EF9A6693F405940EA /* Targets Support Files */ = {
isa = PBXGroup;
children = (
C4B5AB0FF97F3A1FE65541C1328FB85C /* Pods-PeopleInSpace-acknowledgements.markdown */,
4085E4F5221F23B6ACC7AD5F5DD5311C /* Pods-PeopleInSpace-acknowledgements.plist */,
B940C188B389195C78FD350311951B45 /* Pods-PeopleInSpace-dummy.m */,
94E5CDD5D764030A85FEEB8A2E3D7F10 /* Pods-PeopleInSpace.debug.xcconfig */,
2574321D10AA6E9E090925AD61FC5281 /* Pods-PeopleInSpace.release.xcconfig */,
45FE54D9A7CB692C4A82AC6A2AF342EF /* Pods-PeopleInSpace */,
);
name = "Pods-PeopleInSpace";
path = "Target Support Files/Pods-PeopleInSpace";
name = "Targets Support Files";
sourceTree = "<group>";
};
CC43999398E46B9480F21D63C0373047 /* Support Files */ = {
isa = PBXGroup;
children = (
935FFB47BC518C20191CB08A3C39EBD9 /* KMPNativeCoroutinesCore.modulemap */,
A0C62779E9F25B9D466FEC7CC23B1D67 /* KMPNativeCoroutinesCore-dummy.m */,
8467F04D2D129DA89380F1ED04CEF090 /* KMPNativeCoroutinesCore-prefix.pch */,
B276657920D376EF3A9EBCE35D0D8F1E /* KMPNativeCoroutinesCore-umbrella.h */,
441594932398928E8B523A7C8A149DDE /* KMPNativeCoroutinesCore.debug.xcconfig */,
702E8C690C894B05B2B335B3222E38BE /* KMPNativeCoroutinesCore.release.xcconfig */,
);
name = "Support Files";
path = "../Target Support Files/KMPNativeCoroutinesCore";
sourceTree = "<group>";
};
CF1408CF629C7361332E53B88F7BD30C = {
@ -122,8 +266,9 @@
9D940727FF8FB9C785EB98E56350EF41 /* Podfile */,
E363132CB4A8517D710D319A73DD8CB9 /* Development Pods */,
D89477F20FB1DE18A04690586D7808C4 /* Frameworks */,
7E33595295125D9ADC3DD69A856B53D6 /* Products */,
E31BFE6621534631A9AB8E33B5D052A7 /* Targets Support Files */,
42C631582119F1E69C50DA48CD0F397F /* Pods */,
14FBC9D6FC7ED711FC3A3AFCD36A010B /* Products */,
B31E03038FAE969EF9A6693F405940EA /* Targets Support Files */,
);
sourceTree = "<group>";
};
@ -134,14 +279,6 @@
name = Frameworks;
sourceTree = "<group>";
};
E31BFE6621534631A9AB8E33B5D052A7 /* Targets Support Files */ = {
isa = PBXGroup;
children = (
A7BA680F75ECFA065C7E839926F3E718 /* Pods-PeopleInSpace */,
);
name = "Targets Support Files";
sourceTree = "<group>";
};
E363132CB4A8517D710D319A73DD8CB9 /* Development Pods */ = {
isa = PBXGroup;
children = (
@ -153,34 +290,90 @@
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
D2F76021650D1455345732B70977A3FC /* Headers */ = {
5F9C687B032D88BC5138FDD0F0294935 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
410E20CC9003F5209E289FC65A2DD68B /* Pods-PeopleInSpace-umbrella.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
8D98F7FBA7911C76B4490172AD63D3E5 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
BA5CB03EB636E2CAB97BF33EC29BE249 /* KMPNativeCoroutinesCombine-umbrella.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
F45FED5EF8C697E2C7261D7234E7876B /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
AD6E8E9276C772339C578AF8B668AA82 /* KMPNativeCoroutinesCore-umbrella.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
C17638F5D623F54F5BC5696E85FCF8A3 /* Pods-PeopleInSpace */ = {
3F9FD9D97D14F53EE028871E5A26555A /* KMPNativeCoroutinesCombine */ = {
isa = PBXNativeTarget;
buildConfigurationList = BEE7419E71C054760BD15B7423CFF907 /* Build configuration list for PBXNativeTarget "Pods-PeopleInSpace" */;
buildConfigurationList = 2ED9FB6D099CCE4F4978F62F7663ED7C /* Build configuration list for PBXNativeTarget "KMPNativeCoroutinesCombine" */;
buildPhases = (
D2F76021650D1455345732B70977A3FC /* Headers */,
D305D7457D6577A950CFE60B3043D652 /* Sources */,
E4E62A015C1A66A0F419698716F724CE /* Frameworks */,
8D98F7FBA7911C76B4490172AD63D3E5 /* Headers */,
9CEA02A290EF1B802DB096A30846A9F5 /* Sources */,
9267A726B52622ED0E999F5C5BEDC1B1 /* Frameworks */,
5F73E2D3BBEE7795EBFEEB65642B871D /* Copy generated compatibility header */,
);
buildRules = (
);
dependencies = (
57232FE50E2497447CFACBE2757A8222 /* PBXTargetDependency */,
DE102CF6445EDDB7EAA484EE0352D047 /* PBXTargetDependency */,
);
name = KMPNativeCoroutinesCombine;
productName = KMPNativeCoroutinesCombine;
productReference = 1BC4A026DBC6C2982B828355463B2569 /* libKMPNativeCoroutinesCombine.a */;
productType = "com.apple.product-type.library.static";
};
C17638F5D623F54F5BC5696E85FCF8A3 /* Pods-PeopleInSpace */ = {
isa = PBXNativeTarget;
buildConfigurationList = E0B01867EA2B9108E49B01132E5D2B37 /* Build configuration list for PBXNativeTarget "Pods-PeopleInSpace" */;
buildPhases = (
5F9C687B032D88BC5138FDD0F0294935 /* Headers */,
DA57476879C9AF7FEE9745D963C6B187 /* Sources */,
FFD7C6DF3A4A8D1CF620C630992D63A1 /* Frameworks */,
);
buildRules = (
);
dependencies = (
CA65EF2D19634B520AE4B11C70E822D9 /* PBXTargetDependency */,
D35DFA056BF6EBA699088C91A0049D19 /* PBXTargetDependency */,
70DC7965A62EDDBF458AFDBD3571CFFE /* PBXTargetDependency */,
);
name = "Pods-PeopleInSpace";
productName = "Pods-PeopleInSpace";
productReference = 793C7F500A5E2FF09F28299CA517AC3F /* libPods-PeopleInSpace.a */;
productType = "com.apple.product-type.library.static";
};
FFFB6783B79B68DA14E36A00A348B0B3 /* KMPNativeCoroutinesCore */ = {
isa = PBXNativeTarget;
buildConfigurationList = 2B4D7B0804DDDDD535EBCDB2916D5BCB /* Build configuration list for PBXNativeTarget "KMPNativeCoroutinesCore" */;
buildPhases = (
F45FED5EF8C697E2C7261D7234E7876B /* Headers */,
18779BCA9D1123CA855810C0AAE5A6D0 /* Sources */,
F6A23041D604F1E204DEC95A52D6A66E /* Frameworks */,
7E593ECA3A8E68EB509565C728C28237 /* Copy generated compatibility header */,
);
buildRules = (
);
dependencies = (
);
name = KMPNativeCoroutinesCore;
productName = KMPNativeCoroutinesCore;
productReference = E32954243B605448566BC0C0B0BCF70D /* libKMPNativeCoroutinesCore.a */;
productType = "com.apple.product-type.library.static";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
@ -199,11 +392,13 @@
Base,
);
mainGroup = CF1408CF629C7361332E53B88F7BD30C;
productRefGroup = 7E33595295125D9ADC3DD69A856B53D6 /* Products */;
productRefGroup = 14FBC9D6FC7ED711FC3A3AFCD36A010B /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
8217FBB9D1218C346C0781D0B8F2BBE8 /* common */,
3F9FD9D97D14F53EE028871E5A26555A /* KMPNativeCoroutinesCombine */,
FFFB6783B79B68DA14E36A00A348B0B3 /* KMPNativeCoroutinesCore */,
C17638F5D623F54F5BC5696E85FCF8A3 /* Pods-PeopleInSpace */,
);
};
@ -220,33 +415,123 @@
shellPath = /bin/sh;
shellScript = " if [ \"YES\" = \"$COCOAPODS_SKIP_KOTLIN_BUILD\" ]; then\n echo \"Skipping Gradle build task invocation due to COCOAPODS_SKIP_KOTLIN_BUILD environment variable set to \"YES\"\"\n exit 0\n fi\n set -ev\n REPO_ROOT=\"$PODS_TARGET_SRCROOT\"\n \"$REPO_ROOT/../gradlew\" -p \"$REPO_ROOT\" $KOTLIN_PROJECT_PATH:syncFramework -Pkotlin.native.cocoapods.platform=$PLATFORM_NAME -Pkotlin.native.cocoapods.archs=\"$ARCHS\" -Pkotlin.native.cocoapods.configuration=$CONFIGURATION -Pkotlin.native.cocoapods.cflags=\"$OTHER_CFLAGS\" -Pkotlin.native.cocoapods.paths.headers=\"$HEADER_SEARCH_PATHS\" -Pkotlin.native.cocoapods.paths.frameworks=\"$FRAMEWORK_SEARCH_PATHS\"\n";
};
5F73E2D3BBEE7795EBFEEB65642B871D /* Copy generated compatibility header */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${DERIVED_SOURCES_DIR}/${PRODUCT_MODULE_NAME}-Swift.h",
"${PODS_ROOT}/Headers/Public/KMPNativeCoroutinesCombine/KMPNativeCoroutinesCombine.modulemap",
"${PODS_ROOT}/Headers/Public/KMPNativeCoroutinesCombine/KMPNativeCoroutinesCombine-umbrella.h",
);
name = "Copy generated compatibility header";
outputFileListPaths = (
);
outputPaths = (
"${BUILT_PRODUCTS_DIR}/${PRODUCT_MODULE_NAME}.modulemap",
"${BUILT_PRODUCTS_DIR}/KMPNativeCoroutinesCombine-umbrella.h",
"${BUILT_PRODUCTS_DIR}/Swift Compatibility Header/${PRODUCT_MODULE_NAME}-Swift.h",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "COMPATIBILITY_HEADER_PATH=\"${BUILT_PRODUCTS_DIR}/Swift Compatibility Header/${PRODUCT_MODULE_NAME}-Swift.h\"\nMODULE_MAP_PATH=\"${BUILT_PRODUCTS_DIR}/${PRODUCT_MODULE_NAME}.modulemap\"\n\nditto \"${DERIVED_SOURCES_DIR}/${PRODUCT_MODULE_NAME}-Swift.h\" \"${COMPATIBILITY_HEADER_PATH}\"\nditto \"${PODS_ROOT}/Headers/Public/KMPNativeCoroutinesCombine/KMPNativeCoroutinesCombine.modulemap\" \"${MODULE_MAP_PATH}\"\nditto \"${PODS_ROOT}/Headers/Public/KMPNativeCoroutinesCombine/KMPNativeCoroutinesCombine-umbrella.h\" \"${BUILT_PRODUCTS_DIR}\"\nprintf \"\\n\\nmodule ${PRODUCT_MODULE_NAME}.Swift {\\n header \\\"${COMPATIBILITY_HEADER_PATH}\\\"\\n requires objc\\n}\\n\" >> \"${MODULE_MAP_PATH}\"\n";
};
7E593ECA3A8E68EB509565C728C28237 /* Copy generated compatibility header */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${DERIVED_SOURCES_DIR}/${PRODUCT_MODULE_NAME}-Swift.h",
"${PODS_ROOT}/Headers/Public/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore.modulemap",
"${PODS_ROOT}/Headers/Public/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore-umbrella.h",
);
name = "Copy generated compatibility header";
outputFileListPaths = (
);
outputPaths = (
"${BUILT_PRODUCTS_DIR}/${PRODUCT_MODULE_NAME}.modulemap",
"${BUILT_PRODUCTS_DIR}/KMPNativeCoroutinesCore-umbrella.h",
"${BUILT_PRODUCTS_DIR}/Swift Compatibility Header/${PRODUCT_MODULE_NAME}-Swift.h",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "COMPATIBILITY_HEADER_PATH=\"${BUILT_PRODUCTS_DIR}/Swift Compatibility Header/${PRODUCT_MODULE_NAME}-Swift.h\"\nMODULE_MAP_PATH=\"${BUILT_PRODUCTS_DIR}/${PRODUCT_MODULE_NAME}.modulemap\"\n\nditto \"${DERIVED_SOURCES_DIR}/${PRODUCT_MODULE_NAME}-Swift.h\" \"${COMPATIBILITY_HEADER_PATH}\"\nditto \"${PODS_ROOT}/Headers/Public/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore.modulemap\" \"${MODULE_MAP_PATH}\"\nditto \"${PODS_ROOT}/Headers/Public/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore-umbrella.h\" \"${BUILT_PRODUCTS_DIR}\"\nprintf \"\\n\\nmodule ${PRODUCT_MODULE_NAME}.Swift {\\n header \\\"${COMPATIBILITY_HEADER_PATH}\\\"\\n requires objc\\n}\\n\" >> \"${MODULE_MAP_PATH}\"\n";
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
D305D7457D6577A950CFE60B3043D652 /* Sources */ = {
18779BCA9D1123CA855810C0AAE5A6D0 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
7EE04E32660FEA2555A49E1495986AF0 /* Pods-PeopleInSpace-dummy.m in Sources */,
4D058353F02CB5ADCD8D002099B1DF7A /* KMPNativeCoroutinesCore-dummy.m in Sources */,
8AD216478639C6A89F4A5681F0167FC2 /* NativeCallback.swift in Sources */,
7E6C22677B35403CD19CD97CF5C9C55B /* NativeCancellable.swift in Sources */,
4DC8F1E3DC92D51E273BCEBF689FBE81 /* NativeFlow.swift in Sources */,
67CD9BF971445F04D19C8A3F0E694D03 /* NativeSuspend.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
9CEA02A290EF1B802DB096A30846A9F5 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
F665CC033BA40B1DD8175B0419E51CAF /* Future.swift in Sources */,
81017431C9331986689A0A08AFA75E2B /* FuturePublisher.swift in Sources */,
D449674759C5FEEC3D6CC8EB235862CA /* KMPNativeCoroutinesCombine-dummy.m in Sources */,
3736EF6166F11F146BF0224EF85DCD33 /* Publisher.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
DA57476879C9AF7FEE9745D963C6B187 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
043C42C08203AD7285BDB21C47D33249 /* Pods-PeopleInSpace-dummy.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
57232FE50E2497447CFACBE2757A8222 /* PBXTargetDependency */ = {
70DC7965A62EDDBF458AFDBD3571CFFE /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = common;
target = 8217FBB9D1218C346C0781D0B8F2BBE8 /* common */;
targetProxy = 8231E61C22B0B0267D6B822E259A45F3 /* PBXContainerItemProxy */;
targetProxy = 9BBF0F64698ABF7695026003A2064F3C /* PBXContainerItemProxy */;
};
CA65EF2D19634B520AE4B11C70E822D9 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = KMPNativeCoroutinesCombine;
target = 3F9FD9D97D14F53EE028871E5A26555A /* KMPNativeCoroutinesCombine */;
targetProxy = 47DB3C25400C1F423D29F65D8870E9CB /* PBXContainerItemProxy */;
};
D35DFA056BF6EBA699088C91A0049D19 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = KMPNativeCoroutinesCore;
target = FFFB6783B79B68DA14E36A00A348B0B3 /* KMPNativeCoroutinesCore */;
targetProxy = 78AA26295B54DF9A6A1F5180093F3E80 /* PBXContainerItemProxy */;
};
DE102CF6445EDDB7EAA484EE0352D047 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = KMPNativeCoroutinesCore;
target = FFFB6783B79B68DA14E36A00A348B0B3 /* KMPNativeCoroutinesCore */;
targetProxy = A0A09942BB536170555BACB2BE6D6FD1 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin XCBuildConfiguration section */
0253CCDEE11BB2E876CF8C6EBDC6E1A8 /* Release */ = {
0AE172D8F2A4843BFACAD21A0ED26541 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@ -269,6 +554,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -303,10 +589,29 @@
};
name = Release;
};
6DC6BBF7D2A721A4E91A75A28EEB8E83 /* Debug */ = {
178DF5E36D59F8FD6C6680014C4EC930 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = EB3F91873EE86E12ADFA4BF9F5D786D8 /* common.debug.xcconfig */;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CLANG_ENABLE_OBJC_WEAK = NO;
COMBINE_HIDPI_IMAGES = YES;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.6;
SDKROOT = macosx;
};
name = Debug;
};
808E544862838153672EA12FCC127D9A /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
@ -329,6 +634,7 @@
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
@ -367,20 +673,69 @@
};
name = Debug;
};
80DB47D66BFD15CAB66D0E949A3F916A /* Debug */ = {
A6AED7D3BEE730887C83F60FD7AFEE1C /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 94E5CDD5D764030A85FEEB8A2E3D7F10 /* Pods-PeopleInSpace.debug.xcconfig */;
baseConfigurationReference = EEEC7F6E823C77314E6D7F04F0B659C2 /* Pods-PeopleInSpace.release.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
CLANG_ENABLE_OBJC_WEAK = NO;
CODE_SIGN_IDENTITY = "-";
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
EXECUTABLE_PREFIX = lib;
MACH_O_TYPE = staticlib;
MACOSX_DEPLOYMENT_TARGET = 10.15;
MODULEMAP_FILE = "Target Support Files/Pods-PeopleInSpace/Pods-PeopleInSpace.modulemap";
OTHER_LDFLAGS = "";
OTHER_LIBTOOLFLAGS = "";
PODS_ROOT = "$(SRCROOT)";
PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
SDKROOT = macosx;
SKIP_INSTALL = YES;
};
name = Release;
};
B97A6B72EDA86EE6FA21497F49168EBA /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 2CB824F75C95F744CD060A677ADEF508 /* KMPNativeCoroutinesCombine.release.xcconfig */;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
CLANG_ENABLE_OBJC_WEAK = NO;
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
EXECUTABLE_PREFIX = lib;
GCC_PREFIX_HEADER = "Target Support Files/KMPNativeCoroutinesCombine/KMPNativeCoroutinesCombine-prefix.pch";
MACOSX_DEPLOYMENT_TARGET = 10.15;
MODULEMAP_FILE = Headers/Public/KMPNativeCoroutinesCombine/KMPNativeCoroutinesCombine.modulemap;
OTHER_LDFLAGS = "";
OTHER_LIBTOOLFLAGS = "";
PRIVATE_HEADERS_FOLDER_PATH = "";
PRODUCT_MODULE_NAME = KMPNativeCoroutinesCombine;
PRODUCT_NAME = KMPNativeCoroutinesCombine;
PUBLIC_HEADERS_FOLDER_PATH = "";
SDKROOT = macosx;
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
SWIFT_VERSION = 5.0;
};
name = Release;
};
C077C674C6469568DB938C668E829AE1 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 77A6C896A2C42904FB007F52F8CEFAB8 /* Pods-PeopleInSpace.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
CLANG_ENABLE_OBJC_WEAK = NO;
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
EXECUTABLE_PREFIX = lib;
MACH_O_TYPE = staticlib;
MACOSX_DEPLOYMENT_TARGET = 10.15;
MODULEMAP_FILE = "Target Support Files/Pods-PeopleInSpace/Pods-PeopleInSpace.modulemap";
OTHER_LDFLAGS = "";
OTHER_LIBTOOLFLAGS = "";
PODS_ROOT = "$(SRCROOT)";
@ -390,32 +745,39 @@
};
name = Debug;
};
86D2A2EFA4F2CF72E22F58CF8CD6B995 /* Debug */ = {
D3707D8F3BE7987DB96E0F0911DCC65A /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = EB3F91873EE86E12ADFA4BF9F5D786D8 /* common.debug.xcconfig */;
baseConfigurationReference = 702E8C690C894B05B2B335B3222E38BE /* KMPNativeCoroutinesCore.release.xcconfig */;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CLANG_ENABLE_OBJC_WEAK = NO;
CODE_SIGN_IDENTITY = "-";
COMBINE_HIDPI_IMAGES = YES;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.6;
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
EXECUTABLE_PREFIX = lib;
GCC_PREFIX_HEADER = "Target Support Files/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore-prefix.pch";
MACOSX_DEPLOYMENT_TARGET = 10.9;
MODULEMAP_FILE = Headers/Public/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore.modulemap;
OTHER_LDFLAGS = "";
OTHER_LIBTOOLFLAGS = "";
PRIVATE_HEADERS_FOLDER_PATH = "";
PRODUCT_MODULE_NAME = KMPNativeCoroutinesCore;
PRODUCT_NAME = KMPNativeCoroutinesCore;
PUBLIC_HEADERS_FOLDER_PATH = "";
SDKROOT = macosx;
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
SWIFT_VERSION = 5.0;
};
name = Debug;
name = Release;
};
A131A2412A163203FF1534E11094A448 /* Release */ = {
EC20AF0F50816F95DC12A275149D93D6 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 092A4CE06CEC277508371925DC20C57F /* common.release.xcconfig */;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CLANG_ENABLE_OBJC_WEAK = NO;
CODE_SIGN_IDENTITY = "-";
COMBINE_HIDPI_IMAGES = YES;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
@ -426,46 +788,92 @@
};
name = Release;
};
D6A7904CAD11E3F3726C99F86480B560 /* Release */ = {
F401A5F613D876B8143283F0DE7F0E58 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 2574321D10AA6E9E090925AD61FC5281 /* Pods-PeopleInSpace.release.xcconfig */;
baseConfigurationReference = 441594932398928E8B523A7C8A149DDE /* KMPNativeCoroutinesCore.debug.xcconfig */;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO;
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
CLANG_ENABLE_OBJC_WEAK = NO;
CODE_SIGN_IDENTITY = "-";
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
EXECUTABLE_PREFIX = lib;
MACH_O_TYPE = staticlib;
MACOSX_DEPLOYMENT_TARGET = 10.15;
GCC_PREFIX_HEADER = "Target Support Files/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore-prefix.pch";
MACOSX_DEPLOYMENT_TARGET = 10.9;
MODULEMAP_FILE = Headers/Public/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore.modulemap;
OTHER_LDFLAGS = "";
OTHER_LIBTOOLFLAGS = "";
PODS_ROOT = "$(SRCROOT)";
PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}";
PRIVATE_HEADERS_FOLDER_PATH = "";
PRODUCT_MODULE_NAME = KMPNativeCoroutinesCore;
PRODUCT_NAME = KMPNativeCoroutinesCore;
PUBLIC_HEADERS_FOLDER_PATH = "";
SDKROOT = macosx;
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
SWIFT_VERSION = 5.0;
};
name = Release;
name = Debug;
};
F4684F8D37EB6F50D84EAFBA3EDB9AAE /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 00E9CDC40C89F2C4236A1FCF1C2C333D /* KMPNativeCoroutinesCombine.debug.xcconfig */;
buildSettings = {
ARCHS = "$(ARCHS_STANDARD_64_BIT)";
CLANG_ENABLE_OBJC_WEAK = NO;
"CODE_SIGN_IDENTITY[sdk=appletvos*]" = "";
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "";
"CODE_SIGN_IDENTITY[sdk=watchos*]" = "";
EXECUTABLE_PREFIX = lib;
GCC_PREFIX_HEADER = "Target Support Files/KMPNativeCoroutinesCombine/KMPNativeCoroutinesCombine-prefix.pch";
MACOSX_DEPLOYMENT_TARGET = 10.15;
MODULEMAP_FILE = Headers/Public/KMPNativeCoroutinesCombine/KMPNativeCoroutinesCombine.modulemap;
OTHER_LDFLAGS = "";
OTHER_LIBTOOLFLAGS = "";
PRIVATE_HEADERS_FOLDER_PATH = "";
PRODUCT_MODULE_NAME = KMPNativeCoroutinesCombine;
PRODUCT_NAME = KMPNativeCoroutinesCombine;
PUBLIC_HEADERS_FOLDER_PATH = "";
SDKROOT = macosx;
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) ";
SWIFT_VERSION = 5.0;
};
name = Debug;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = {
2B4D7B0804DDDDD535EBCDB2916D5BCB /* Build configuration list for PBXNativeTarget "KMPNativeCoroutinesCore" */ = {
isa = XCConfigurationList;
buildConfigurations = (
6DC6BBF7D2A721A4E91A75A28EEB8E83 /* Debug */,
0253CCDEE11BB2E876CF8C6EBDC6E1A8 /* Release */,
F401A5F613D876B8143283F0DE7F0E58 /* Debug */,
D3707D8F3BE7987DB96E0F0911DCC65A /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
BEE7419E71C054760BD15B7423CFF907 /* Build configuration list for PBXNativeTarget "Pods-PeopleInSpace" */ = {
2ED9FB6D099CCE4F4978F62F7663ED7C /* Build configuration list for PBXNativeTarget "KMPNativeCoroutinesCombine" */ = {
isa = XCConfigurationList;
buildConfigurations = (
80DB47D66BFD15CAB66D0E949A3F916A /* Debug */,
D6A7904CAD11E3F3726C99F86480B560 /* Release */,
F4684F8D37EB6F50D84EAFBA3EDB9AAE /* Debug */,
B97A6B72EDA86EE6FA21497F49168EBA /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = {
isa = XCConfigurationList;
buildConfigurations = (
808E544862838153672EA12FCC127D9A /* Debug */,
0AE172D8F2A4843BFACAD21A0ED26541 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
E0B01867EA2B9108E49B01132E5D2B37 /* Build configuration list for PBXNativeTarget "Pods-PeopleInSpace" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C077C674C6469568DB938C668E829AE1 /* Debug */,
A6AED7D3BEE730887C83F60FD7AFEE1C /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
@ -473,8 +881,8 @@
F11FEA02DA0EC11D42BB6656A90E71FA /* Build configuration list for PBXAggregateTarget "common" */ = {
isa = XCConfigurationList;
buildConfigurations = (
86D2A2EFA4F2CF72E22F58CF8CD6B995 /* Debug */,
A131A2412A163203FF1534E11094A448 /* Release */,
178DF5E36D59F8FD6C6680014C4EC930 /* Debug */,
EC20AF0F50816F95DC12A275149D93D6 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;

View file

@ -0,0 +1,5 @@
#import <Foundation/Foundation.h>
@interface PodsDummy_KMPNativeCoroutinesCombine : NSObject
@end
@implementation PodsDummy_KMPNativeCoroutinesCombine
@end

View file

@ -0,0 +1,12 @@
#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif

View file

@ -0,0 +1,16 @@
#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif
FOUNDATION_EXPORT double KMPNativeCoroutinesCombineVersionNumber;
FOUNDATION_EXPORT const unsigned char KMPNativeCoroutinesCombineVersionString[];

View file

@ -0,0 +1,14 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCombine
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
OTHER_CFLAGS = $(inherited) -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore.modulemap"
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -Xcc -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore.modulemap" -import-underlying-module -Xcc -fmodule-map-file="${SRCROOT}/${MODULEMAP_FILE}"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PODS_TARGET_SRCROOT = ${PODS_ROOT}/KMPNativeCoroutinesCombine
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES
SWIFT_INCLUDE_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCore"
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

View file

@ -0,0 +1,6 @@
module KMPNativeCoroutinesCombine {
umbrella header "KMPNativeCoroutinesCombine-umbrella.h"
export *
module * { export * }
}

View file

@ -0,0 +1,14 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCombine
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
OTHER_CFLAGS = $(inherited) -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore.modulemap"
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -Xcc -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore.modulemap" -import-underlying-module -Xcc -fmodule-map-file="${SRCROOT}/${MODULEMAP_FILE}"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PODS_TARGET_SRCROOT = ${PODS_ROOT}/KMPNativeCoroutinesCombine
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES
SWIFT_INCLUDE_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCore"
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

View file

@ -0,0 +1,5 @@
#import <Foundation/Foundation.h>
@interface PodsDummy_KMPNativeCoroutinesCore : NSObject
@end
@implementation PodsDummy_KMPNativeCoroutinesCore
@end

View file

@ -0,0 +1,12 @@
#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif

View file

@ -0,0 +1,16 @@
#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif
FOUNDATION_EXPORT double KMPNativeCoroutinesCoreVersionNumber;
FOUNDATION_EXPORT const unsigned char KMPNativeCoroutinesCoreVersionString[];

View file

@ -0,0 +1,12 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCore
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -import-underlying-module -Xcc -fmodule-map-file="${SRCROOT}/${MODULEMAP_FILE}"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PODS_TARGET_SRCROOT = ${PODS_ROOT}/KMPNativeCoroutinesCore
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

View file

@ -0,0 +1,6 @@
module KMPNativeCoroutinesCore {
umbrella header "KMPNativeCoroutinesCore-umbrella.h"
export *
module * { export * }
}

View file

@ -0,0 +1,12 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCore
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -import-underlying-module -Xcc -fmodule-map-file="${SRCROOT}/${MODULEMAP_FILE}"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PODS_TARGET_SRCROOT = ${PODS_ROOT}/KMPNativeCoroutinesCore
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
SKIP_INSTALL = YES
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

View file

@ -1,3 +1,53 @@
# Acknowledgements
This application makes use of the following third party libraries:
## KMPNativeCoroutinesCombine
MIT License
Copyright (c) 2021 Rick Clephas
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
## KMPNativeCoroutinesCore
MIT License
Copyright (c) 2021 Rick Clephas
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Generated by CocoaPods - https://cocoapods.org

View file

@ -12,6 +12,68 @@
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>MIT License
Copyright (c) 2021 Rick Clephas
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
</string>
<key>License</key>
<string>MIT</string>
<key>Title</key>
<string>KMPNativeCoroutinesCombine</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>MIT License
Copyright (c) 2021 Rick Clephas
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
</string>
<key>License</key>
<string>MIT</string>
<key>Title</key>
<string>KMPNativeCoroutinesCore</string>
<key>Type</key>
<string>PSGroupSpecifier</string>
</dict>
<dict>
<key>FooterText</key>
<string>Generated by CocoaPods - https://cocoapods.org</string>

View file

@ -0,0 +1,16 @@
#ifdef __OBJC__
#import <Cocoa/Cocoa.h>
#else
#ifndef FOUNDATION_EXPORT
#if defined(__cplusplus)
#define FOUNDATION_EXPORT extern "C"
#else
#define FOUNDATION_EXPORT extern
#endif
#endif
#endif
FOUNDATION_EXPORT double Pods_PeopleInSpaceVersionNumber;
FOUNDATION_EXPORT const unsigned char Pods_PeopleInSpaceVersionString[];

View file

@ -1,8 +1,15 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../../common/build/cocoapods/framework"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -framework "common"
LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCombine" "${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCore"
OTHER_CFLAGS = $(inherited) -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCombine/KMPNativeCoroutinesCombine.modulemap" -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore.modulemap"
OTHER_LDFLAGS = $(inherited) -ObjC -l"KMPNativeCoroutinesCombine" -l"KMPNativeCoroutinesCore" -l"c++" -framework "Combine" -framework "common"
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -Xcc -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCombine/KMPNativeCoroutinesCombine.modulemap" -Xcc -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore.modulemap"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
SWIFT_INCLUDE_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCombine" "${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCore"
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

View file

@ -0,0 +1,6 @@
module Pods_PeopleInSpace {
umbrella header "Pods-PeopleInSpace-umbrella.h"
export *
module * { export * }
}

View file

@ -1,8 +1,15 @@
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../../common/build/cocoapods/framework"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
OTHER_LDFLAGS = $(inherited) -ObjC -l"c++" -framework "common"
LIBRARY_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCombine" "${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCore"
OTHER_CFLAGS = $(inherited) -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCombine/KMPNativeCoroutinesCombine.modulemap" -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore.modulemap"
OTHER_LDFLAGS = $(inherited) -ObjC -l"KMPNativeCoroutinesCombine" -l"KMPNativeCoroutinesCore" -l"c++" -framework "Combine" -framework "common"
OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -Xcc -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCombine/KMPNativeCoroutinesCombine.modulemap" -Xcc -fmodule-map-file="${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCore/KMPNativeCoroutinesCore.modulemap"
PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_PODFILE_DIR_PATH = ${SRCROOT}/.
PODS_ROOT = ${SRCROOT}/Pods
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
SWIFT_INCLUDE_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCombine" "${PODS_CONFIGURATION_BUILD_DIR}/KMPNativeCoroutinesCore"
USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES

View file

@ -1,3 +1,4 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/common
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../../common/build/cocoapods/framework"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
@ -6,6 +7,7 @@ PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../../common
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
PRODUCT_MODULE_NAME = common
SKIP_INSTALL = YES

View file

@ -1,3 +1,4 @@
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO
CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/common
FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/../../../common/build/cocoapods/framework"
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
@ -6,6 +7,7 @@ PODS_BUILD_DIR = ${BUILD_DIR}
PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)
PODS_ROOT = ${SRCROOT}
PODS_TARGET_SRCROOT = ${PODS_ROOT}/../../../common
PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates
PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier}
PRODUCT_MODULE_NAME = common
SKIP_INSTALL = YES