diff --git a/.github/workflows/pr_check.yml b/.github/workflows/pr_check.yml
new file mode 100644
index 00000000..d88d747d
--- /dev/null
+++ b/.github/workflows/pr_check.yml
@@ -0,0 +1,22 @@
+name: PR Check
+on: [pull_request]
+concurrency:
+ group: ${{ github.head_ref }}
+ cancel-in-progress: true
+jobs:
+ pr_check:
+ runs-on: macOS-11
+ if: github.event.pull_request.draft == false
+ steps:
+ - name: Checkout Project
+ uses: actions/checkout@v2
+ - uses: ruby/setup-ruby@v1
+ with:
+ bundler-cache: true
+ - name: Danger
+ env:
+ DANGER_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: bundle exec danger
+ - name: Test
+ run: swift test
+
diff --git a/.gitignore b/.gitignore
index f657dea3..8270a930 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,6 +21,7 @@ xcuserdata/
*.moved-aside
*.xcuserstate
*.xcscmblueprint
+.DS_Store
## Obj-C/Swift specific
*.hmap
@@ -53,6 +54,9 @@ Pods/
Carthage/Build
+# SwiftPM
+.swiftpm/
+
# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
diff --git a/.ruby-version b/.ruby-version
new file mode 100644
index 00000000..860487ca
--- /dev/null
+++ b/.ruby-version
@@ -0,0 +1 @@
+2.7.1
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c2c3544a..d24b4a67 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,9 @@
## Main
##### New Features/Enhancements
+- Add Swift Package Manager Support
+ [notbenoit](https://github.com/notbenoit)
+ [#73](https://github.com/Fueled/ios-utilities/pulls/73)
- Add `ActionProtocol`
- Add `AnyAction`, allowing to type-erase any actions represented by a `ActionProtocol`
diff --git a/FueledUtils.podspec b/FueledUtils.podspec
index 3966e47b..9d426985 100644
--- a/FueledUtils.podspec
+++ b/FueledUtils.podspec
@@ -2,7 +2,7 @@
Pod::Spec.new do |s|
s.name = 'FueledUtils'
- s.version = '3.0.0'
+ s.version = '3.1.0'
s.summary = 'A collection of utilities used at Fueled'
s.description = 'This is a collection of classes, extensions, methods and functions used within Fueled projects that aims at decomplexifying tasks that should be easy.'
s.swift_version = '5'
diff --git a/FueledUtils/Combine/Action.swift b/FueledUtils/Combine/Action.swift
index ed38326c..fe42255f 100644
--- a/FueledUtils/Combine/Action.swift
+++ b/FueledUtils/Combine/Action.swift
@@ -14,6 +14,10 @@
#if canImport(Combine)
import Combine
+#if canImport(FueledUtilsReactiveCommon)
+import FueledUtilsCore
+import FueledUtilsReactiveCommon
+#endif
@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
public final class Action {
diff --git a/FueledUtils/Combine/ActionError.swift b/FueledUtils/Combine/ActionError.swift
index f1cc075e..4783697c 100644
--- a/FueledUtils/Combine/ActionError.swift
+++ b/FueledUtils/Combine/ActionError.swift
@@ -12,6 +12,10 @@
// See the License for the specific language governing permissions and
// limitations under the License.
+#if canImport(FueledUtilsReactiveCommon)
+import FueledUtilsReactiveCommon
+#endif
+
@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
public enum ActionError: Swift.Error {
case disabled
diff --git a/FueledUtils/Combine/AnyCurrentValuePublisher.swift b/FueledUtils/Combine/AnyCurrentValuePublisher.swift
index af94361b..4ad849af 100644
--- a/FueledUtils/Combine/AnyCurrentValuePublisher.swift
+++ b/FueledUtils/Combine/AnyCurrentValuePublisher.swift
@@ -14,6 +14,9 @@
#if canImport(Combine)
import Combine
+#if canImport(FueledUtilsReactiveCommon)
+import FueledUtilsReactiveCommon
+#endif
///
/// A type-erasing current value publisher.
@@ -35,7 +38,7 @@ public struct AnyCurrentValuePublisher