diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..57040a9 Binary files /dev/null and b/.DS_Store differ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a0dd232 --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +# macOS +.DS_Store + +# Xcode +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata/ +*.xccheckout +profile +*.moved-aside +DerivedData +*.hmap +*.ipa + +# Bundler +.bundle + +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + +# We recommend against adding the Pods directory to your .gitignore. However +# you should judge for yourself, the pros and cons are mentioned at: +# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control +# +# Note: if you ignore the Pods directory, make sure to uncomment +# `pod install` in .travis.yml +# +# Pods/ diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..ff9372d --- /dev/null +++ b/.travis.yml @@ -0,0 +1,14 @@ +# references: +# * https://www.objc.io/issues/6-build-tools/travis-ci/ +# * https://github.com/supermarin/xcpretty#usage + +osx_image: xcode7.3 +language: objective-c +# cache: cocoapods +# podfile: Example/Podfile +# before_install: +# - gem install cocoapods # Since Travis is not always on latest version +# - pod install --project-directory=Example +script: +- set -o pipefail && xcodebuild test -enableCodeCoverage YES -workspace Example/RxComposableArchitecture.xcworkspace -scheme RxComposableArchitecture-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty +- pod lib lint diff --git a/DiffingInterface/DiffingInterface.docc/DiffingInterface.md b/DiffingInterface/DiffingInterface.docc/DiffingInterface.md deleted file mode 100755 index cd4d191..0000000 --- a/DiffingInterface/DiffingInterface.docc/DiffingInterface.md +++ /dev/null @@ -1,13 +0,0 @@ -# ``DiffingInterface`` - -Summary - -## Overview - -Text - -## Topics - -### Group - -- ``Symbol`` \ No newline at end of file diff --git a/DiffingInterface/DiffingInterface.h b/DiffingInterface/DiffingInterface.h deleted file mode 100644 index 8d05e36..0000000 --- a/DiffingInterface/DiffingInterface.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// DiffingInterface.h -// DiffingInterface -// -// Created by Andrey Yoshua Manik on 21/02/22. -// - -#import - -//! Project version number for DiffingInterface. -FOUNDATION_EXPORT double DiffingInterfaceVersionNumber; - -//! Project version string for DiffingInterface. -FOUNDATION_EXPORT const unsigned char DiffingInterfaceVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/DiffingTestSupport/DiffingTestSupport.docc/DiffingTestSupport.md b/DiffingTestSupport/DiffingTestSupport.docc/DiffingTestSupport.md deleted file mode 100755 index 0502619..0000000 --- a/DiffingTestSupport/DiffingTestSupport.docc/DiffingTestSupport.md +++ /dev/null @@ -1,13 +0,0 @@ -# ``DiffingTestSupport`` - -Summary - -## Overview - -Text - -## Topics - -### Group - -- ``Symbol`` \ No newline at end of file diff --git a/DiffingTestSupport/DiffingTestSupport.h b/DiffingTestSupport/DiffingTestSupport.h deleted file mode 100644 index f2c9f7d..0000000 --- a/DiffingTestSupport/DiffingTestSupport.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// DiffingTestSupport.h -// DiffingTestSupport -// -// Created by Andrey Yoshua Manik on 21/02/22. -// - -#import - -//! Project version number for DiffingTestSupport. -FOUNDATION_EXPORT double DiffingTestSupportVersionNumber; - -//! Project version string for DiffingTestSupport. -FOUNDATION_EXPORT const unsigned char DiffingTestSupportVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/DiffingTestSupport/XCTDecode.swift b/DiffingTestSupport/XCTDecode.swift deleted file mode 100644 index 9862cff..0000000 --- a/DiffingTestSupport/XCTDecode.swift +++ /dev/null @@ -1,57 +0,0 @@ -// -// XCTDecode.swift -// Tests -// -// Created by Kensen on 12/07/21. -// - -import XCTest - -public func XCTDecode(_ type: T.Type, from data: Data, atKeyPath keyPath: String? = nil, file: StaticString = #file, line: UInt = #line) throws -> T where T: Decodable { - do { - if let keyPath = keyPath { - let topLevel = try JSONSerialization.jsonObject(with: data) - - if let nestedJson = (topLevel as AnyObject).value(forKeyPath: keyPath) { - let nestedJsonData = try JSONSerialization.data(withJSONObject: nestedJson) - return try JSONDecoder().decode(type, from: nestedJsonData) - } else { - let debugDescription = "Nested JSON not found for key path \"\(keyPath)\"" - let decodingError = DecodingError.dataCorrupted( - .init( - codingPath: [], - debugDescription: debugDescription - ) - ) - - XCTFail(debugDescription, file: file, line: line) - throw decodingError - } - } else { - return try JSONDecoder().decode(type, from: data) - } - } catch { - guard let decodingError = error as? DecodingError else { - XCTFail(error.localizedDescription, file: file, line: line) - throw error - } - - switch decodingError { - case let .dataCorrupted(context), let .keyNotFound(_, context), let .typeMismatch(_, context), let .valueNotFound(_, context): - let codingPath: String = context.codingPath.map(\.stringValue).joined(separator: ".") - - let failMessage: String - if codingPath.isEmpty { - failMessage = context.debugDescription - } else { - failMessage = "\(context.debugDescription) (codingPath: \"\(codingPath)\")" - } - - XCTFail(failMessage, file: file, line: line) - @unknown default: - XCTFail(decodingError.localizedDescription, file: file, line: line) - } - - throw decodingError - } -} diff --git a/DiffingTestSupport/XCTPrettyEqual.swift b/DiffingTestSupport/XCTPrettyEqual.swift deleted file mode 100644 index 5befbbb..0000000 --- a/DiffingTestSupport/XCTPrettyEqual.swift +++ /dev/null @@ -1,15 +0,0 @@ -// -// XCTPrettyAssertEqual.swift -// RxComposableArchitecture_TestSupport -// -// Created by Jefferson Setiawan on 20/01/21. -// - -import DiffingUtility -import XCTest - -public func XCTPrettyAssertEqual(_ before: T, _ after: T, _ mode: DiffMode = .full, file: StaticString = #file, line: UInt = #line) { - guard let diff = debugDiff(before, after, mode) - .map({ "\($0.indent(by: 4))\n\n(Expected: −, Received: +)" }) else { return } - XCTFail(diff, file: file, line: line) -} diff --git a/DiffingUtility/DiffingUtility.docc/DiffingUtility.md b/DiffingUtility/DiffingUtility.docc/DiffingUtility.md deleted file mode 100755 index d20c6a7..0000000 --- a/DiffingUtility/DiffingUtility.docc/DiffingUtility.md +++ /dev/null @@ -1,13 +0,0 @@ -# ``DiffingUtility`` - -Summary - -## Overview - -Text - -## Topics - -### Group - -- ``Symbol`` \ No newline at end of file diff --git a/DiffingUtility/DiffingUtility.h b/DiffingUtility/DiffingUtility.h deleted file mode 100644 index 4e88f45..0000000 --- a/DiffingUtility/DiffingUtility.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// DiffingUtility.h -// DiffingUtility -// -// Created by Andrey Yoshua Manik on 21/02/22. -// - -#import - -//! Project version number for DiffingUtility. -FOUNDATION_EXPORT double DiffingUtilityVersionNumber; - -//! Project version string for DiffingUtility. -FOUNDATION_EXPORT const unsigned char DiffingUtilityVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/Example/Podfile b/Example/Podfile new file mode 100644 index 0000000..05f351f --- /dev/null +++ b/Example/Podfile @@ -0,0 +1,14 @@ +use_frameworks! + +platform :ios, '10.0' + +target 'RxComposableArchitecture_Example' do + pod 'RxComposableArchitecture', :path => '../' + pod 'CasePaths', :podspec => '../development-podspecs/CasePaths.podspec.json' + + target 'RxComposableArchitecture_Tests' do + inherit! :search_paths + + + end +end diff --git a/Podfile.lock b/Example/Podfile.lock similarity index 53% rename from Podfile.lock rename to Example/Podfile.lock index 9e07be4..a5d018f 100644 --- a/Podfile.lock +++ b/Example/Podfile.lock @@ -3,14 +3,17 @@ PODS: - RxCocoa (5.1.1): - RxRelay (~> 5) - RxSwift (~> 5) + - RxComposableArchitecture (0.1.0): + - CasePaths + - RxCocoa (= 5.1.1) + - RxSwift (= 5.1.1) - RxRelay (5.1.3): - RxSwift (~> 5) - RxSwift (5.1.1) DEPENDENCIES: - - CasePaths (from `./RxComposableArchitecture/development-podspecs/CasePaths.podspec.json`) - - RxCocoa (= 5.1.1) - - RxSwift (= 5.1.1) + - CasePaths (from `../development-podspecs/CasePaths.podspec.json`) + - RxComposableArchitecture (from `../`) SPEC REPOS: trunk: @@ -20,14 +23,17 @@ SPEC REPOS: EXTERNAL SOURCES: CasePaths: - :podspec: "./RxComposableArchitecture/development-podspecs/CasePaths.podspec.json" + :podspec: "../development-podspecs/CasePaths.podspec.json" + RxComposableArchitecture: + :path: "../" SPEC CHECKSUMS: CasePaths: 24576a4ae8972199d6195c91d6474896755664ed RxCocoa: 32065309a38d29b5b0db858819b5bf9ef038b601 + RxComposableArchitecture: 8e19c1d0c97c0d1cc2976b8b44137381ae062dc8 RxRelay: 5a18c2eb2d68326ebaf0112f80d837ae41b92b97 RxSwift: 81470a2074fa8780320ea5fe4102807cb7118178 -PODFILE CHECKSUM: b186eb071dc125f12c8b55c07e3715069964f397 +PODFILE CHECKSUM: fbef6ffe299d02b770ac092a983e56e004af7251 COCOAPODS: 1.11.2 diff --git a/Example/RxComposableArchitecture.xcodeproj/project.pbxproj b/Example/RxComposableArchitecture.xcodeproj/project.pbxproj new file mode 100644 index 0000000..8ddb219 --- /dev/null +++ b/Example/RxComposableArchitecture.xcodeproj/project.pbxproj @@ -0,0 +1,587 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 17052C4B33DC192F601D8A0B /* Pods_RxComposableArchitecture_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29FC08E4DACDDCE98D8925A2 /* Pods_RxComposableArchitecture_Example.framework */; }; + 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; + 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; + 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; + 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; + 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; + 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* Tests.swift */; }; + 852F4FE2179B4ABDAA68FBAD /* Pods_RxComposableArchitecture_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0A9E85147266305698B534F /* Pods_RxComposableArchitecture_Tests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 607FACC81AFB9204008FA782 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 607FACCF1AFB9204008FA782; + remoteInfo = RxComposableArchitecture; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 1798FFB4523F9DE3C29F12E1 /* Pods-RxComposableArchitecture_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxComposableArchitecture_Tests.debug.xcconfig"; path = "Target Support Files/Pods-RxComposableArchitecture_Tests/Pods-RxComposableArchitecture_Tests.debug.xcconfig"; sourceTree = ""; }; + 29FC08E4DACDDCE98D8925A2 /* Pods_RxComposableArchitecture_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RxComposableArchitecture_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 47617C3F2EE39CB169FD426A /* Pods-RxComposableArchitecture_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxComposableArchitecture_Example.debug.xcconfig"; path = "Target Support Files/Pods-RxComposableArchitecture_Example/Pods-RxComposableArchitecture_Example.debug.xcconfig"; sourceTree = ""; }; + 607FACD01AFB9204008FA782 /* RxComposableArchitecture_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RxComposableArchitecture_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 607FACD71AFB9204008FA782 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + 607FACE51AFB9204008FA782 /* RxComposableArchitecture_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RxComposableArchitecture_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; + 8694B607FA6DE13542F1EB7D /* Pods-RxComposableArchitecture_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxComposableArchitecture_Tests.release.xcconfig"; path = "Target Support Files/Pods-RxComposableArchitecture_Tests/Pods-RxComposableArchitecture_Tests.release.xcconfig"; sourceTree = ""; }; + B03EAF931852F2F891C13CFB /* RxComposableArchitecture.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = RxComposableArchitecture.podspec; path = ../RxComposableArchitecture.podspec; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + B887F4DBAC1BD2A15A9CB4F8 /* Pods-RxComposableArchitecture_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxComposableArchitecture_Example.release.xcconfig"; path = "Target Support Files/Pods-RxComposableArchitecture_Example/Pods-RxComposableArchitecture_Example.release.xcconfig"; sourceTree = ""; }; + BC8C6A6DC3084E2309482628 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; + C0A9E85147266305698B534F /* Pods_RxComposableArchitecture_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RxComposableArchitecture_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FE636A89E884234C80C16800 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 607FACCD1AFB9204008FA782 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 17052C4B33DC192F601D8A0B /* Pods_RxComposableArchitecture_Example.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 607FACE21AFB9204008FA782 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 852F4FE2179B4ABDAA68FBAD /* Pods_RxComposableArchitecture_Tests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 581457AD474CCE8C534404CB /* Frameworks */ = { + isa = PBXGroup; + children = ( + 29FC08E4DACDDCE98D8925A2 /* Pods_RxComposableArchitecture_Example.framework */, + C0A9E85147266305698B534F /* Pods_RxComposableArchitecture_Tests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 607FACC71AFB9204008FA782 = { + isa = PBXGroup; + children = ( + 607FACF51AFB993E008FA782 /* Podspec Metadata */, + 607FACD21AFB9204008FA782 /* Example for RxComposableArchitecture */, + 607FACE81AFB9204008FA782 /* Tests */, + 607FACD11AFB9204008FA782 /* Products */, + E3BC02DDE34B0274B6CDF7C9 /* Pods */, + 581457AD474CCE8C534404CB /* Frameworks */, + ); + sourceTree = ""; + }; + 607FACD11AFB9204008FA782 /* Products */ = { + isa = PBXGroup; + children = ( + 607FACD01AFB9204008FA782 /* RxComposableArchitecture_Example.app */, + 607FACE51AFB9204008FA782 /* RxComposableArchitecture_Tests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 607FACD21AFB9204008FA782 /* Example for RxComposableArchitecture */ = { + isa = PBXGroup; + children = ( + 607FACD51AFB9204008FA782 /* AppDelegate.swift */, + 607FACD71AFB9204008FA782 /* ViewController.swift */, + 607FACD91AFB9204008FA782 /* Main.storyboard */, + 607FACDC1AFB9204008FA782 /* Images.xcassets */, + 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, + 607FACD31AFB9204008FA782 /* Supporting Files */, + ); + name = "Example for RxComposableArchitecture"; + path = RxComposableArchitecture; + sourceTree = ""; + }; + 607FACD31AFB9204008FA782 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 607FACD41AFB9204008FA782 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 607FACE81AFB9204008FA782 /* Tests */ = { + isa = PBXGroup; + children = ( + 607FACEB1AFB9204008FA782 /* Tests.swift */, + 607FACE91AFB9204008FA782 /* Supporting Files */, + ); + path = Tests; + sourceTree = ""; + }; + 607FACE91AFB9204008FA782 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 607FACEA1AFB9204008FA782 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { + isa = PBXGroup; + children = ( + B03EAF931852F2F891C13CFB /* RxComposableArchitecture.podspec */, + FE636A89E884234C80C16800 /* README.md */, + BC8C6A6DC3084E2309482628 /* LICENSE */, + ); + name = "Podspec Metadata"; + sourceTree = ""; + }; + E3BC02DDE34B0274B6CDF7C9 /* Pods */ = { + isa = PBXGroup; + children = ( + 47617C3F2EE39CB169FD426A /* Pods-RxComposableArchitecture_Example.debug.xcconfig */, + B887F4DBAC1BD2A15A9CB4F8 /* Pods-RxComposableArchitecture_Example.release.xcconfig */, + 1798FFB4523F9DE3C29F12E1 /* Pods-RxComposableArchitecture_Tests.debug.xcconfig */, + 8694B607FA6DE13542F1EB7D /* Pods-RxComposableArchitecture_Tests.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 607FACCF1AFB9204008FA782 /* RxComposableArchitecture_Example */ = { + isa = PBXNativeTarget; + buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "RxComposableArchitecture_Example" */; + buildPhases = ( + 706EB1D85D940129C23B99A9 /* [CP] Check Pods Manifest.lock */, + 607FACCC1AFB9204008FA782 /* Sources */, + 607FACCD1AFB9204008FA782 /* Frameworks */, + 607FACCE1AFB9204008FA782 /* Resources */, + CFE3E968A9DA0041F56F3537 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RxComposableArchitecture_Example; + productName = RxComposableArchitecture; + productReference = 607FACD01AFB9204008FA782 /* RxComposableArchitecture_Example.app */; + productType = "com.apple.product-type.application"; + }; + 607FACE41AFB9204008FA782 /* RxComposableArchitecture_Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "RxComposableArchitecture_Tests" */; + buildPhases = ( + CBBD1A8FA53CDFCDD0486BF9 /* [CP] Check Pods Manifest.lock */, + 607FACE11AFB9204008FA782 /* Sources */, + 607FACE21AFB9204008FA782 /* Frameworks */, + 607FACE31AFB9204008FA782 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 607FACE71AFB9204008FA782 /* PBXTargetDependency */, + ); + name = RxComposableArchitecture_Tests; + productName = Tests; + productReference = 607FACE51AFB9204008FA782 /* RxComposableArchitecture_Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 607FACC81AFB9204008FA782 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 0830; + ORGANIZATIONNAME = CocoaPods; + TargetAttributes = { + 607FACCF1AFB9204008FA782 = { + CreatedOnToolsVersion = 6.3.1; + LastSwiftMigration = 0900; + }; + 607FACE41AFB9204008FA782 = { + CreatedOnToolsVersion = 6.3.1; + LastSwiftMigration = 0900; + TestTargetID = 607FACCF1AFB9204008FA782; + }; + }; + }; + buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "RxComposableArchitecture" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + en, + Base, + ); + mainGroup = 607FACC71AFB9204008FA782; + productRefGroup = 607FACD11AFB9204008FA782 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 607FACCF1AFB9204008FA782 /* RxComposableArchitecture_Example */, + 607FACE41AFB9204008FA782 /* RxComposableArchitecture_Tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 607FACCE1AFB9204008FA782 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, + 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, + 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 607FACE31AFB9204008FA782 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 706EB1D85D940129C23B99A9 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RxComposableArchitecture_Example-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + CBBD1A8FA53CDFCDD0486BF9 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RxComposableArchitecture_Tests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + CFE3E968A9DA0041F56F3537 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-RxComposableArchitecture_Example/Pods-RxComposableArchitecture_Example-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/CasePaths/CasePaths.framework", + "${BUILT_PRODUCTS_DIR}/RxCocoa/RxCocoa.framework", + "${BUILT_PRODUCTS_DIR}/RxComposableArchitecture/RxComposableArchitecture.framework", + "${BUILT_PRODUCTS_DIR}/RxRelay/RxRelay.framework", + "${BUILT_PRODUCTS_DIR}/RxSwift/RxSwift.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CasePaths.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxCocoa.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxComposableArchitecture.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxRelay.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RxSwift.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RxComposableArchitecture_Example/Pods-RxComposableArchitecture_Example-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 607FACCC1AFB9204008FA782 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, + 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 607FACE11AFB9204008FA782 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 607FACE71AFB9204008FA782 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 607FACCF1AFB9204008FA782 /* RxComposableArchitecture_Example */; + targetProxy = 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 607FACD91AFB9204008FA782 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 607FACDA1AFB9204008FA782 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + 607FACDF1AFB9204008FA782 /* Base */, + ); + name = LaunchScreen.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 607FACED1AFB9204008FA782 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 607FACEE1AFB9204008FA782 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 607FACF01AFB9204008FA782 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 47617C3F2EE39CB169FD426A /* Pods-RxComposableArchitecture_Example.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = RxComposableArchitecture/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MODULE_NAME = ExampleApp; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; + }; + name = Debug; + }; + 607FACF11AFB9204008FA782 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B887F4DBAC1BD2A15A9CB4F8 /* Pods-RxComposableArchitecture_Example.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = RxComposableArchitecture/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MODULE_NAME = ExampleApp; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; + }; + name = Release; + }; + 607FACF31AFB9204008FA782 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1798FFB4523F9DE3C29F12E1 /* Pods-RxComposableArchitecture_Tests.debug.xcconfig */; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(PLATFORM_DIR)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RxComposableArchitecture_Example.app/RxComposableArchitecture_Example"; + }; + name = Debug; + }; + 607FACF41AFB9204008FA782 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 8694B607FA6DE13542F1EB7D /* Pods-RxComposableArchitecture_Tests.release.xcconfig */; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(PLATFORM_DIR)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/RxComposableArchitecture_Example.app/RxComposableArchitecture_Example"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "RxComposableArchitecture" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACED1AFB9204008FA782 /* Debug */, + 607FACEE1AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "RxComposableArchitecture_Example" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACF01AFB9204008FA782 /* Debug */, + 607FACF11AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "RxComposableArchitecture_Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACF31AFB9204008FA782 /* Debug */, + 607FACF41AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 607FACC81AFB9204008FA782 /* Project object */; +} diff --git a/RxComposableArchitectureExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example/RxComposableArchitecture.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 64% rename from RxComposableArchitectureExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Example/RxComposableArchitecture.xcodeproj/project.xcworkspace/contents.xcworkspacedata index 919434a..1d5d9a1 100644 --- a/RxComposableArchitectureExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/Example/RxComposableArchitecture.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:RxComposableArchitecture.xcodeproj"> diff --git a/Example/RxComposableArchitecture.xcodeproj/xcshareddata/xcschemes/RxComposableArchitecture-Example.xcscheme b/Example/RxComposableArchitecture.xcodeproj/xcshareddata/xcschemes/RxComposableArchitecture-Example.xcscheme new file mode 100644 index 0000000..d801f6a --- /dev/null +++ b/Example/RxComposableArchitecture.xcodeproj/xcshareddata/xcschemes/RxComposableArchitecture-Example.xcscheme @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/RxComposableArchitectureExample.xcworkspace/contents.xcworkspacedata b/Example/RxComposableArchitecture.xcworkspace/contents.xcworkspacedata similarity index 72% rename from RxComposableArchitectureExample.xcworkspace/contents.xcworkspacedata rename to Example/RxComposableArchitecture.xcworkspace/contents.xcworkspacedata index 732b828..a471dd0 100644 --- a/RxComposableArchitectureExample.xcworkspace/contents.xcworkspacedata +++ b/Example/RxComposableArchitecture.xcworkspace/contents.xcworkspacedata @@ -2,7 +2,7 @@ + location = "group:RxComposableArchitecture.xcodeproj"> diff --git a/RxComposableArchitectureExample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/RxComposableArchitecture.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from RxComposableArchitectureExample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to Example/RxComposableArchitecture.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Example/RxComposableArchitecture/AppDelegate.swift b/Example/RxComposableArchitecture/AppDelegate.swift new file mode 100644 index 0000000..7665f15 --- /dev/null +++ b/Example/RxComposableArchitecture/AppDelegate.swift @@ -0,0 +1,46 @@ +// +// AppDelegate.swift +// RxComposableArchitecture +// +// Created by andreyyoshua on 02/23/2022. +// Copyright (c) 2022 andreyyoshua. All rights reserved. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/Example/RxComposableArchitecture/Base.lproj/LaunchScreen.xib b/Example/RxComposableArchitecture/Base.lproj/LaunchScreen.xib new file mode 100644 index 0000000..ee3ecef --- /dev/null +++ b/Example/RxComposableArchitecture/Base.lproj/LaunchScreen.xib @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/RxComposableArchitecture/Base.lproj/Main.storyboard b/Example/RxComposableArchitecture/Base.lproj/Main.storyboard new file mode 100644 index 0000000..52a6d6f --- /dev/null +++ b/Example/RxComposableArchitecture/Base.lproj/Main.storyboard @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/RxComposableArchitecture/Images.xcassets/AppIcon.appiconset/Contents.json b/Example/RxComposableArchitecture/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..7006c9e --- /dev/null +++ b/Example/RxComposableArchitecture/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,53 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/Example/RxComposableArchitecture/Info.plist b/Example/RxComposableArchitecture/Info.plist new file mode 100644 index 0000000..eb18faa --- /dev/null +++ b/Example/RxComposableArchitecture/Info.plist @@ -0,0 +1,39 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + + + diff --git a/Example/RxComposableArchitecture/ViewController.swift b/Example/RxComposableArchitecture/ViewController.swift new file mode 100644 index 0000000..d734e8a --- /dev/null +++ b/Example/RxComposableArchitecture/ViewController.swift @@ -0,0 +1,24 @@ +// +// ViewController.swift +// RxComposableArchitecture +// +// Created by andreyyoshua on 02/23/2022. +// Copyright (c) 2022 andreyyoshua. All rights reserved. +// + +import UIKit + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view, typically from a nib. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + +} + diff --git a/Example/Tests/Info.plist b/Example/Tests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/Example/Tests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Example/Tests/Tests.swift b/Example/Tests/Tests.swift new file mode 100644 index 0000000..5b0dc9c --- /dev/null +++ b/Example/Tests/Tests.swift @@ -0,0 +1,28 @@ +import XCTest +import RxComposableArchitecture + +class Tests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + XCTAssert(true, "Pass") + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measure() { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b33573c --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2022 andreyyoshua + +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. diff --git a/Podfile b/Podfile deleted file mode 100644 index 26c757a..0000000 --- a/Podfile +++ /dev/null @@ -1,39 +0,0 @@ -# Uncomment the next line to define a global platform for your project -# platform :ios, '9.0' - -target 'RxComposableArchitecture' do - # Comment the next line if you don't want to use dynamic frameworks - use_frameworks! - - # Pods for RxComposableArchitecture - pod 'RxSwift', '5.1.1' - pod 'RxCocoa', '5.1.1' - pod 'CasePaths', :podspec => './RxComposableArchitecture/development-podspecs/CasePaths.podspec.json' - -end - -target 'RxComposableArchitectureTests' do - # Comment the next line if you don't want to use dynamic frameworks - use_frameworks! - - # Pods for RxComposableArchitecture - pod 'RxSwift', '5.1.1' - -end - -target 'TestSupport' do - # Comment the next line if you don't want to use dynamic frameworks - use_frameworks! - - # Pods for RxComposableArchitecture - pod 'RxSwift', '5.1.1' - -end - -target 'RxComposableArchitectureExample' do - # Comment the next line if you don't want to use dynamic frameworks - use_frameworks! - - # Pods for RxComposableArchitectureExample - -end diff --git a/README.md b/README.md new file mode 100644 index 0000000..20dabbf --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# RxComposableArchitecture + +[![CI Status](https://img.shields.io/travis/andreyyoshua/RxComposableArchitecture.svg?style=flat)](https://travis-ci.org/andreyyoshua/RxComposableArchitecture) +[![Version](https://img.shields.io/cocoapods/v/RxComposableArchitecture.svg?style=flat)](https://cocoapods.org/pods/RxComposableArchitecture) +[![License](https://img.shields.io/cocoapods/l/RxComposableArchitecture.svg?style=flat)](https://cocoapods.org/pods/RxComposableArchitecture) +[![Platform](https://img.shields.io/cocoapods/p/RxComposableArchitecture.svg?style=flat)](https://cocoapods.org/pods/RxComposableArchitecture) + +## Example + +To run the example project, clone the repo, and run `pod install` from the Example directory first. + +## Requirements + +## Installation + +RxComposableArchitecture is available through [CocoaPods](https://cocoapods.org). To install +it, simply add the following line to your Podfile: + +```ruby +pod 'RxComposableArchitecture' +``` + +## Author + +andreyyoshua, andrey.yoshua@gmail.com + +## License + +RxComposableArchitecture is available under the MIT license. See the LICENSE file for more info. diff --git a/RxComposableArchitecture.podspec b/RxComposableArchitecture.podspec new file mode 100644 index 0000000..672b328 --- /dev/null +++ b/RxComposableArchitecture.podspec @@ -0,0 +1,58 @@ +# +# Be sure to run `pod lib lint RxComposableArchitecture.podspec' to ensure this is a +# valid spec before submitting. +# +# Any lines starting with a # are optional, but their use is encouraged +# To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html +# + +Pod::Spec.new do |s| + s.name = 'RxComposableArchitecture' + s.version = '0.1.0' + s.summary = 'A short description of RxComposableArchitecture.' + +# This description is used to generate tags and improve search results. +# * Think: What does it do? Why did you write it? What is the focus? +# * Try to keep it short, snappy and to the point. +# * Write the description between the DESC delimiters below. +# * Finally, don't worry about the indent, CocoaPods strips it! + + s.description = <<-DESC +TODO: Add long description of the pod here. + DESC + + s.homepage = 'https://github.com/andreyyoshua/RxComposableArchitecture' + # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' + s.license = { :type => 'MIT', :file => 'LICENSE' } + s.author = { 'andreyyoshua' => 'andrey.yoshua@gmail.com' } + s.source = { :git => 'https://github.com/andreyyoshua/RxComposableArchitecture.git', :tag => s.version.to_s } + # s.social_media_url = 'https://twitter.com/' + + s.ios.deployment_target = '10.0' + + s.source_files = [ + 'RxComposableArchitecture/Classes/**/*', + 'DiffingInterface/**/*.swift', + 'DiffingUtility/**/*.swift' + ] + + # s.resource_bundles = { + # 'RxComposableArchitecture' => ['RxComposableArchitecture/Assets/*.png'] + # } + + # s.public_header_files = 'Pod/Classes/**/*.h' + # s.frameworks = 'UIKit', 'MapKit' + s.dependency 'RxSwift', '5.1.1' + s.dependency 'RxCocoa', '5.1.1' + s.dependency 'CasePaths' + +# s.subspec 'DiffingInterface' do |diffingInterface| +# diffingInterface.dependency 'Alamofire' +# diffingInterface.source_files = 'DiffingInterface/**/*.swift' +# end +# +# s.subspec 'DiffingUtility' do |diffingUtility| +# diffingUtility.source_files = 'DiffingUtility/**/*.swift' +# end + +end diff --git a/RxComposableArchitecture/Assets/.gitkeep b/RxComposableArchitecture/Assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/RxComposableArchitecture/Classes/.gitkeep b/RxComposableArchitecture/Classes/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/RxComposableArchitecture/Binding.swift b/RxComposableArchitecture/Classes/Binding.swift similarity index 100% rename from RxComposableArchitecture/Binding.swift rename to RxComposableArchitecture/Classes/Binding.swift diff --git a/RxComposableArchitecture/Debugging/Bootstrapping.swift b/RxComposableArchitecture/Classes/Debugging/Bootstrapping.swift similarity index 100% rename from RxComposableArchitecture/Debugging/Bootstrapping.swift rename to RxComposableArchitecture/Classes/Debugging/Bootstrapping.swift diff --git a/RxComposableArchitecture/Debugging/MockPageTemplate.swift b/RxComposableArchitecture/Classes/Debugging/MockPageTemplate.swift similarity index 100% rename from RxComposableArchitecture/Debugging/MockPageTemplate.swift rename to RxComposableArchitecture/Classes/Debugging/MockPageTemplate.swift diff --git a/RxComposableArchitecture/Debugging/ReducerDebugging.swift b/RxComposableArchitecture/Classes/Debugging/ReducerDebugging.swift similarity index 99% rename from RxComposableArchitecture/Debugging/ReducerDebugging.swift rename to RxComposableArchitecture/Classes/Debugging/ReducerDebugging.swift index 05a9ecd..bbae3c7 100644 --- a/RxComposableArchitecture/Debugging/ReducerDebugging.swift +++ b/RxComposableArchitecture/Classes/Debugging/ReducerDebugging.swift @@ -6,7 +6,6 @@ // import CasePaths -import DiffingUtility import Dispatch /// Determines how the string description of an action should be printed when using the `.debug()` diff --git a/RxComposableArchitecture/Debugging/ReducerInstrumentation.swift b/RxComposableArchitecture/Classes/Debugging/ReducerInstrumentation.swift similarity index 100% rename from RxComposableArchitecture/Debugging/ReducerInstrumentation.swift rename to RxComposableArchitecture/Classes/Debugging/ReducerInstrumentation.swift diff --git a/RxComposableArchitecture/Effect.swift b/RxComposableArchitecture/Classes/Effect.swift similarity index 100% rename from RxComposableArchitecture/Effect.swift rename to RxComposableArchitecture/Classes/Effect.swift diff --git a/RxComposableArchitecture/Effects/Cancellation.swift b/RxComposableArchitecture/Classes/Effects/Cancellation.swift similarity index 100% rename from RxComposableArchitecture/Effects/Cancellation.swift rename to RxComposableArchitecture/Classes/Effects/Cancellation.swift diff --git a/RxComposableArchitecture/Effects/Debouncing.swift b/RxComposableArchitecture/Classes/Effects/Debouncing.swift similarity index 100% rename from RxComposableArchitecture/Effects/Debouncing.swift rename to RxComposableArchitecture/Classes/Effects/Debouncing.swift diff --git a/RxComposableArchitecture/Effects/Deferring.swift b/RxComposableArchitecture/Classes/Effects/Deferring.swift similarity index 100% rename from RxComposableArchitecture/Effects/Deferring.swift rename to RxComposableArchitecture/Classes/Effects/Deferring.swift diff --git a/RxComposableArchitecture/Effects/FireAndForget.swift b/RxComposableArchitecture/Classes/Effects/FireAndForget.swift similarity index 100% rename from RxComposableArchitecture/Effects/FireAndForget.swift rename to RxComposableArchitecture/Classes/Effects/FireAndForget.swift diff --git a/RxComposableArchitecture/Effects/Timer.swift b/RxComposableArchitecture/Classes/Effects/Timer.swift similarity index 100% rename from RxComposableArchitecture/Effects/Timer.swift rename to RxComposableArchitecture/Classes/Effects/Timer.swift diff --git a/RxComposableArchitecture/Classes/Export.swift b/RxComposableArchitecture/Classes/Export.swift new file mode 100644 index 0000000..55ecc58 --- /dev/null +++ b/RxComposableArchitecture/Classes/Export.swift @@ -0,0 +1 @@ +@_exported import CasePaths diff --git a/RxComposableArchitecture/IdentifiedArray.swift b/RxComposableArchitecture/Classes/IdentifiedArray.swift similarity index 99% rename from RxComposableArchitecture/IdentifiedArray.swift rename to RxComposableArchitecture/Classes/IdentifiedArray.swift index 0acebec..b7ae6cd 100644 --- a/RxComposableArchitecture/IdentifiedArray.swift +++ b/RxComposableArchitecture/Classes/IdentifiedArray.swift @@ -5,7 +5,6 @@ // Created by Jefferson Setiawan on 16/07/20. // -import DiffingInterface import Foundation /// An array of elements that can be identified by a given key path. diff --git a/RxComposableArchitecture/IfLet.swift b/RxComposableArchitecture/Classes/IfLet.swift similarity index 100% rename from RxComposableArchitecture/IfLet.swift rename to RxComposableArchitecture/Classes/IfLet.swift diff --git a/RxComposableArchitecture/Internal/AnyDisposable.swift b/RxComposableArchitecture/Classes/Internal/AnyDisposable.swift similarity index 100% rename from RxComposableArchitecture/Internal/AnyDisposable.swift rename to RxComposableArchitecture/Classes/Internal/AnyDisposable.swift diff --git a/RxComposableArchitecture/Internal/Deprecated.swift b/RxComposableArchitecture/Classes/Internal/Deprecated.swift similarity index 100% rename from RxComposableArchitecture/Internal/Deprecated.swift rename to RxComposableArchitecture/Classes/Internal/Deprecated.swift diff --git a/RxComposableArchitecture/Internal/Locking.swift b/RxComposableArchitecture/Classes/Internal/Locking.swift similarity index 100% rename from RxComposableArchitecture/Internal/Locking.swift rename to RxComposableArchitecture/Classes/Internal/Locking.swift diff --git a/RxComposableArchitecture/OptionalPaths.swift b/RxComposableArchitecture/Classes/OptionalPaths.swift similarity index 100% rename from RxComposableArchitecture/OptionalPaths.swift rename to RxComposableArchitecture/Classes/OptionalPaths.swift diff --git a/RxComposableArchitecture/PropertyWrapper/SingleSelection.swift b/RxComposableArchitecture/Classes/PropertyWrapper/SingleSelection.swift similarity index 100% rename from RxComposableArchitecture/PropertyWrapper/SingleSelection.swift rename to RxComposableArchitecture/Classes/PropertyWrapper/SingleSelection.swift diff --git a/RxComposableArchitecture/PropertyWrapper/UniqueElements.swift b/RxComposableArchitecture/Classes/PropertyWrapper/UniqueElements.swift similarity index 98% rename from RxComposableArchitecture/PropertyWrapper/UniqueElements.swift rename to RxComposableArchitecture/Classes/PropertyWrapper/UniqueElements.swift index e789985..92273d2 100644 --- a/RxComposableArchitecture/PropertyWrapper/UniqueElements.swift +++ b/RxComposableArchitecture/Classes/PropertyWrapper/UniqueElements.swift @@ -5,7 +5,6 @@ // Created by Kensen on 07/01/21. // -import DiffingInterface /** Property wrapper to reduce boiler plate code to remove duplicates from a collection of HashDiffable. diff --git a/RxComposableArchitecture/Reducer.swift b/RxComposableArchitecture/Classes/Reducer.swift similarity index 99% rename from RxComposableArchitecture/Reducer.swift rename to RxComposableArchitecture/Classes/Reducer.swift index 8455cb4..ad9a16c 100644 --- a/RxComposableArchitecture/Reducer.swift +++ b/RxComposableArchitecture/Classes/Reducer.swift @@ -1,6 +1,5 @@ import CasePaths import Darwin -import DiffingInterface import RxSwift public struct Reducer { diff --git a/RxComposableArchitecture/Stateless.swift b/RxComposableArchitecture/Classes/Stateless.swift similarity index 100% rename from RxComposableArchitecture/Stateless.swift rename to RxComposableArchitecture/Classes/Stateless.swift diff --git a/RxComposableArchitecture/Store.swift b/RxComposableArchitecture/Classes/Store.swift similarity index 99% rename from RxComposableArchitecture/Store.swift rename to RxComposableArchitecture/Classes/Store.swift index 5bdb446..8d1d7cd 100644 --- a/RxComposableArchitecture/Store.swift +++ b/RxComposableArchitecture/Classes/Store.swift @@ -1,4 +1,3 @@ -import DiffingInterface import Foundation import RxRelay import RxSwift diff --git a/RxComposableArchitecture/Export.swift b/RxComposableArchitecture/Export.swift deleted file mode 100644 index 6a457dd..0000000 --- a/RxComposableArchitecture/Export.swift +++ /dev/null @@ -1,2 +0,0 @@ -@_exported import CasePaths -@_exported import DiffingInterface diff --git a/RxComposableArchitecture/RxComposableArchitecture.docc/RxComposableArchitecture.md b/RxComposableArchitecture/RxComposableArchitecture.docc/RxComposableArchitecture.md deleted file mode 100755 index 78e511e..0000000 --- a/RxComposableArchitecture/RxComposableArchitecture.docc/RxComposableArchitecture.md +++ /dev/null @@ -1,13 +0,0 @@ -# ``RxComposableArchitecture`` - -Summary - -## Overview - -Text - -## Topics - -### Group - -- ``Symbol`` \ No newline at end of file diff --git a/RxComposableArchitecture/RxComposableArchitecture.h b/RxComposableArchitecture/RxComposableArchitecture.h deleted file mode 100644 index cf131d9..0000000 --- a/RxComposableArchitecture/RxComposableArchitecture.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// RxComposableArchitecture.h -// RxComposableArchitecture -// -// Created by Andrey Yoshua Manik on 21/02/22. -// - -#import - -//! Project version number for RxComposableArchitecture. -FOUNDATION_EXPORT double RxComposableArchitectureVersionNumber; - -//! Project version string for RxComposableArchitecture. -FOUNDATION_EXPORT const unsigned char RxComposableArchitectureVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/RxComposableArchitectureExample.xcodeproj/project.pbxproj b/RxComposableArchitectureExample.xcodeproj/project.pbxproj deleted file mode 100644 index 117c735..0000000 --- a/RxComposableArchitectureExample.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1836 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 55; - objects = { - -/* Begin PBXBuildFile section */ - 16BF42554966E67266B4076B /* Pods_RxComposableArchitectureExample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D35E75E6027094F0586CB60E /* Pods_RxComposableArchitectureExample.framework */; }; - 2A32D642256972C1FF0BAB1F /* Pods_TestSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 74CA63C0EA127FBD45E7C596 /* Pods_TestSupport.framework */; }; - 48DAC5ED27C381FD001D45D0 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC5EC27C381FD001D45D0 /* AppDelegate.swift */; }; - 48DAC5EF27C381FD001D45D0 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC5EE27C381FD001D45D0 /* SceneDelegate.swift */; }; - 48DAC5F127C381FD001D45D0 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC5F027C381FD001D45D0 /* ViewController.swift */; }; - 48DAC5F427C381FD001D45D0 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 48DAC5F227C381FD001D45D0 /* Main.storyboard */; }; - 48DAC5F627C381FF001D45D0 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 48DAC5F527C381FF001D45D0 /* Assets.xcassets */; }; - 48DAC5F927C381FF001D45D0 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 48DAC5F727C381FF001D45D0 /* LaunchScreen.storyboard */; }; - 48DAC60927C3843A001D45D0 /* RxComposableArchitecture.docc in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC60827C3843A001D45D0 /* RxComposableArchitecture.docc */; }; - 48DAC60A27C3843A001D45D0 /* RxComposableArchitecture.h in Headers */ = {isa = PBXBuildFile; fileRef = 48DAC60727C3843A001D45D0 /* RxComposableArchitecture.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 48DAC60D27C3843A001D45D0 /* RxComposableArchitecture.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC60527C3843A001D45D0 /* RxComposableArchitecture.framework */; }; - 48DAC60E27C3843A001D45D0 /* RxComposableArchitecture.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC60527C3843A001D45D0 /* RxComposableArchitecture.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 48DAC61C27C38663001D45D0 /* DiffingInterface.docc in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC61B27C38663001D45D0 /* DiffingInterface.docc */; }; - 48DAC61D27C38663001D45D0 /* DiffingInterface.h in Headers */ = {isa = PBXBuildFile; fileRef = 48DAC61A27C38663001D45D0 /* DiffingInterface.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 48DAC62027C38663001D45D0 /* DiffingInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC61827C38663001D45D0 /* DiffingInterface.framework */; }; - 48DAC62127C38663001D45D0 /* DiffingInterface.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC61827C38663001D45D0 /* DiffingInterface.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 48DAC62927C38677001D45D0 /* DiffingInterface+Primitives.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC62527C38677001D45D0 /* DiffingInterface+Primitives.swift */; }; - 48DAC62A27C38677001D45D0 /* HashDiffing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC62627C38677001D45D0 /* HashDiffing.swift */; }; - 48DAC62B27C38677001D45D0 /* HashDiffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC62727C38677001D45D0 /* HashDiffable.swift */; }; - 48DAC62C27C38677001D45D0 /* AnyHashDiffable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC62827C38677001D45D0 /* AnyHashDiffable.swift */; }; - 48DAC63627C386C0001D45D0 /* DiffingUtility.docc in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC63527C386C0001D45D0 /* DiffingUtility.docc */; }; - 48DAC63727C386C0001D45D0 /* DiffingUtility.h in Headers */ = {isa = PBXBuildFile; fileRef = 48DAC63427C386C0001D45D0 /* DiffingUtility.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 48DAC63A27C386C0001D45D0 /* DiffingUtility.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC63227C386C0001D45D0 /* DiffingUtility.framework */; }; - 48DAC63B27C386C0001D45D0 /* DiffingUtility.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC63227C386C0001D45D0 /* DiffingUtility.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 48DAC64127C386CF001D45D0 /* Diff.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC63F27C386CF001D45D0 /* Diff.swift */; }; - 48DAC64227C386CF001D45D0 /* Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC64027C386CF001D45D0 /* Debug.swift */; }; - 48DAC64327C386E0001D45D0 /* DiffingInterface.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC61827C38663001D45D0 /* DiffingInterface.framework */; }; - 48DAC64827C386E3001D45D0 /* DiffingUtility.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC63227C386C0001D45D0 /* DiffingUtility.framework */; }; - 48DAC6EF27C38B10001D45D0 /* IfLet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6D427C38B0F001D45D0 /* IfLet.swift */; }; - 48DAC6F027C38B10001D45D0 /* Binding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6D527C38B0F001D45D0 /* Binding.swift */; }; - 48DAC6F127C38B10001D45D0 /* Effect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6D627C38B0F001D45D0 /* Effect.swift */; }; - 48DAC6F227C38B10001D45D0 /* Export.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6D727C38B0F001D45D0 /* Export.swift */; }; - 48DAC6F327C38B10001D45D0 /* Store.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6D827C38B0F001D45D0 /* Store.swift */; }; - 48DAC6F427C38B10001D45D0 /* IdentifiedArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6D927C38B0F001D45D0 /* IdentifiedArray.swift */; }; - 48DAC6F527C38B10001D45D0 /* Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6DB27C38B0F001D45D0 /* Deprecated.swift */; }; - 48DAC6F627C38B10001D45D0 /* AnyDisposable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6DC27C38B0F001D45D0 /* AnyDisposable.swift */; }; - 48DAC6F727C38B10001D45D0 /* Locking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6DD27C38B0F001D45D0 /* Locking.swift */; }; - 48DAC6F827C38B10001D45D0 /* Reducer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6DE27C38B10001D45D0 /* Reducer.swift */; }; - 48DAC6F927C38B10001D45D0 /* Stateless.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6DF27C38B10001D45D0 /* Stateless.swift */; }; - 48DAC6FA27C38B10001D45D0 /* MockPageTemplate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6E127C38B10001D45D0 /* MockPageTemplate.swift */; }; - 48DAC6FB27C38B10001D45D0 /* Bootstrapping.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6E227C38B10001D45D0 /* Bootstrapping.swift */; }; - 48DAC6FC27C38B10001D45D0 /* ReducerInstrumentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6E327C38B10001D45D0 /* ReducerInstrumentation.swift */; }; - 48DAC6FD27C38B10001D45D0 /* ReducerDebugging.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6E427C38B10001D45D0 /* ReducerDebugging.swift */; }; - 48DAC6FE27C38B10001D45D0 /* SingleSelection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6E627C38B10001D45D0 /* SingleSelection.swift */; }; - 48DAC6FF27C38B10001D45D0 /* UniqueElements.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6E727C38B10001D45D0 /* UniqueElements.swift */; }; - 48DAC70027C38B10001D45D0 /* Timer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6E927C38B10001D45D0 /* Timer.swift */; }; - 48DAC70127C38B10001D45D0 /* Cancellation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6EA27C38B10001D45D0 /* Cancellation.swift */; }; - 48DAC70227C38B10001D45D0 /* Deferring.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6EB27C38B10001D45D0 /* Deferring.swift */; }; - 48DAC70327C38B10001D45D0 /* FireAndForget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6EC27C38B10001D45D0 /* FireAndForget.swift */; }; - 48DAC70427C38B10001D45D0 /* Debouncing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6ED27C38B10001D45D0 /* Debouncing.swift */; }; - 48DAC70527C38B10001D45D0 /* OptionalPaths.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC6EE27C38B10001D45D0 /* OptionalPaths.swift */; }; - 48DAC70F27C38CCB001D45D0 /* RxComposableArchitectureTests.docc in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC70E27C38CCB001D45D0 /* RxComposableArchitectureTests.docc */; }; - 48DAC71027C38CCB001D45D0 /* RxComposableArchitectureTests.h in Headers */ = {isa = PBXBuildFile; fileRef = 48DAC70D27C38CCB001D45D0 /* RxComposableArchitectureTests.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 48DAC71327C38CCB001D45D0 /* RxComposableArchitectureTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC70B27C38CCB001D45D0 /* RxComposableArchitectureTests.framework */; }; - 48DAC71427C38CCB001D45D0 /* RxComposableArchitectureTests.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC70B27C38CCB001D45D0 /* RxComposableArchitectureTests.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 48DAC72627C38CDE001D45D0 /* IdentifiedArrayTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC71827C38CDE001D45D0 /* IdentifiedArrayTests.swift */; }; - 48DAC72727C38CDE001D45D0 /* EffectTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC71927C38CDE001D45D0 /* EffectTests.swift */; }; - 48DAC72827C38CDE001D45D0 /* EffectDebounceTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC71A27C38CDE001D45D0 /* EffectDebounceTests.swift */; }; - 48DAC72927C38CDE001D45D0 /* LCRNG.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC71B27C38CDE001D45D0 /* LCRNG.swift */; }; - 48DAC72A27C38CDE001D45D0 /* EffectCancellationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC71C27C38CDE001D45D0 /* EffectCancellationTests.swift */; }; - 48DAC72B27C38CDE001D45D0 /* RxComposableArchitectureTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC71D27C38CDE001D45D0 /* RxComposableArchitectureTests.swift */; }; - 48DAC72C27C38CDE001D45D0 /* TimerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC71E27C38CDE001D45D0 /* TimerTests.swift */; }; - 48DAC72D27C38CDE001D45D0 /* EffectDeferredTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC71F27C38CDE001D45D0 /* EffectDeferredTests.swift */; }; - 48DAC72E27C38CDE001D45D0 /* ReducerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC72027C38CDE001D45D0 /* ReducerTests.swift */; }; - 48DAC72F27C38CDE001D45D0 /* DebugTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC72127C38CDE001D45D0 /* DebugTests.swift */; }; - 48DAC73027C38CDE001D45D0 /* SingleSelectionSelectableTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC72227C38CDE001D45D0 /* SingleSelectionSelectableTypeTests.swift */; }; - 48DAC73127C38CDE001D45D0 /* StoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC72327C38CDE001D45D0 /* StoreTests.swift */; }; - 48DAC73227C38CDE001D45D0 /* MemoryManagementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC72427C38CDE001D45D0 /* MemoryManagementTests.swift */; }; - 48DAC73327C38CDE001D45D0 /* SingleSelectionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC72527C38CDE001D45D0 /* SingleSelectionTests.swift */; }; - 48DAC73427C38CFE001D45D0 /* RxComposableArchitecture.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC60527C3843A001D45D0 /* RxComposableArchitecture.framework */; }; - 48DAC74227C38D97001D45D0 /* TestSupport.docc in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC74127C38D97001D45D0 /* TestSupport.docc */; }; - 48DAC74327C38D97001D45D0 /* TestSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 48DAC74027C38D97001D45D0 /* TestSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 48DAC74627C38D97001D45D0 /* TestSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC73E27C38D97001D45D0 /* TestSupport.framework */; }; - 48DAC74727C38D97001D45D0 /* TestSupport.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC73E27C38D97001D45D0 /* TestSupport.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 48DAC75427C38DAA001D45D0 /* TestScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC74B27C38DAA001D45D0 /* TestScheduler.swift */; }; - 48DAC75527C38DAA001D45D0 /* Export.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC74C27C38DAA001D45D0 /* Export.swift */; }; - 48DAC75627C38DAA001D45D0 /* Unwrap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC74D27C38DAA001D45D0 /* Unwrap.swift */; }; - 48DAC75727C38DAA001D45D0 /* Annotating.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC74E27C38DAA001D45D0 /* Annotating.swift */; }; - 48DAC75827C38DAA001D45D0 /* FailingEffect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC74F27C38DAA001D45D0 /* FailingEffect.swift */; }; - 48DAC75927C38DAA001D45D0 /* VirtualTimeScheduler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC75127C38DAA001D45D0 /* VirtualTimeScheduler.swift */; }; - 48DAC75A27C38DAA001D45D0 /* PriorityQueue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC75227C38DAA001D45D0 /* PriorityQueue.swift */; }; - 48DAC75B27C38DAA001D45D0 /* TestStore.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC75327C38DAA001D45D0 /* TestStore.swift */; }; - 48DAC75C27C38DB1001D45D0 /* TestSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC73E27C38D97001D45D0 /* TestSupport.framework */; }; - 48DAC76227C38E73001D45D0 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC76127C38E73001D45D0 /* XCTest.framework */; platformFilter = ios; }; - 48DAC76527C38E81001D45D0 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC76127C38E73001D45D0 /* XCTest.framework */; platformFilter = ios; }; - 48DAC77127C38EAD001D45D0 /* DiffingTestSupport.docc in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC77027C38EAD001D45D0 /* DiffingTestSupport.docc */; }; - 48DAC77227C38EAD001D45D0 /* DiffingTestSupport.h in Headers */ = {isa = PBXBuildFile; fileRef = 48DAC76F27C38EAD001D45D0 /* DiffingTestSupport.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 48DAC77527C38EAD001D45D0 /* DiffingTestSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC76D27C38EAD001D45D0 /* DiffingTestSupport.framework */; }; - 48DAC77627C38EAD001D45D0 /* DiffingTestSupport.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC76D27C38EAD001D45D0 /* DiffingTestSupport.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 48DAC77C27C38EC9001D45D0 /* XCTDecode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC77A27C38EC9001D45D0 /* XCTDecode.swift */; }; - 48DAC77D27C38EC9001D45D0 /* XCTPrettyEqual.swift in Sources */ = {isa = PBXBuildFile; fileRef = 48DAC77B27C38EC9001D45D0 /* XCTPrettyEqual.swift */; }; - 48DAC77E27C38EF7001D45D0 /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC76127C38E73001D45D0 /* XCTest.framework */; platformFilter = ios; }; - 48DAC78127C38F26001D45D0 /* RxComposableArchitecture.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC60527C3843A001D45D0 /* RxComposableArchitecture.framework */; }; - 48DAC78627C38F4E001D45D0 /* DiffingTestSupport.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC76D27C38EAD001D45D0 /* DiffingTestSupport.framework */; }; - 48DAC78B27C38FAF001D45D0 /* DiffingUtility.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 48DAC63227C386C0001D45D0 /* DiffingUtility.framework */; }; - 7BA5C006372D1DB429138D8B /* Pods_RxComposableArchitectureTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 165D1F46AB6664F68B7E57BB /* Pods_RxComposableArchitectureTests.framework */; }; - E4EF80B30828B9F434A161B4 /* Pods_RxComposableArchitecture.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 99350B5DA80BAC5D18EA3B8D /* Pods_RxComposableArchitecture.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 48DAC60B27C3843A001D45D0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 48DAC5E127C381FD001D45D0 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 48DAC60427C3843A001D45D0; - remoteInfo = RxComposableArchitecture; - }; - 48DAC61E27C38663001D45D0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 48DAC5E127C381FD001D45D0 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 48DAC61727C38663001D45D0; - remoteInfo = DiffingInterface; - }; - 48DAC63827C386C0001D45D0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 48DAC5E127C381FD001D45D0 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 48DAC63127C386C0001D45D0; - remoteInfo = DiffingUtility; - }; - 48DAC64527C386E0001D45D0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 48DAC5E127C381FD001D45D0 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 48DAC61727C38663001D45D0; - remoteInfo = DiffingInterface; - }; - 48DAC64A27C386E3001D45D0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 48DAC5E127C381FD001D45D0 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 48DAC63127C386C0001D45D0; - remoteInfo = DiffingUtility; - }; - 48DAC71127C38CCB001D45D0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 48DAC5E127C381FD001D45D0 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 48DAC70A27C38CCB001D45D0; - remoteInfo = RxComposableArchitectureTests; - }; - 48DAC73627C38CFE001D45D0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 48DAC5E127C381FD001D45D0 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 48DAC60427C3843A001D45D0; - remoteInfo = RxComposableArchitecture; - }; - 48DAC74427C38D97001D45D0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 48DAC5E127C381FD001D45D0 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 48DAC73D27C38D97001D45D0; - remoteInfo = TestSupport; - }; - 48DAC75E27C38DB1001D45D0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 48DAC5E127C381FD001D45D0 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 48DAC73D27C38D97001D45D0; - remoteInfo = TestSupport; - }; - 48DAC77327C38EAD001D45D0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 48DAC5E127C381FD001D45D0 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 48DAC76C27C38EAD001D45D0; - remoteInfo = DiffingTestSupport; - }; - 48DAC78327C38F26001D45D0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 48DAC5E127C381FD001D45D0 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 48DAC60427C3843A001D45D0; - remoteInfo = RxComposableArchitecture; - }; - 48DAC78827C38F4E001D45D0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 48DAC5E127C381FD001D45D0 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 48DAC76C27C38EAD001D45D0; - remoteInfo = DiffingTestSupport; - }; - 48DAC78D27C38FAF001D45D0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 48DAC5E127C381FD001D45D0 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 48DAC63127C386C0001D45D0; - remoteInfo = DiffingUtility; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 48DAC60F27C3843A001D45D0 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 48DAC74727C38D97001D45D0 /* TestSupport.framework in Embed Frameworks */, - 48DAC71427C38CCB001D45D0 /* RxComposableArchitectureTests.framework in Embed Frameworks */, - 48DAC62127C38663001D45D0 /* DiffingInterface.framework in Embed Frameworks */, - 48DAC60E27C3843A001D45D0 /* RxComposableArchitecture.framework in Embed Frameworks */, - 48DAC77627C38EAD001D45D0 /* DiffingTestSupport.framework in Embed Frameworks */, - 48DAC63B27C386C0001D45D0 /* DiffingUtility.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 165D1F46AB6664F68B7E57BB /* Pods_RxComposableArchitectureTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RxComposableArchitectureTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1CDF88EE99C341A71671F250 /* Pods-RxComposableArchitectureExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxComposableArchitectureExample.release.xcconfig"; path = "Target Support Files/Pods-RxComposableArchitectureExample/Pods-RxComposableArchitectureExample.release.xcconfig"; sourceTree = ""; }; - 48DAC5E927C381FD001D45D0 /* RxComposableArchitectureExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RxComposableArchitectureExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 48DAC5EC27C381FD001D45D0 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 48DAC5EE27C381FD001D45D0 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; - 48DAC5F027C381FD001D45D0 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 48DAC5F327C381FD001D45D0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 48DAC5F527C381FF001D45D0 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 48DAC5F827C381FF001D45D0 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 48DAC5FA27C381FF001D45D0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 48DAC60527C3843A001D45D0 /* RxComposableArchitecture.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxComposableArchitecture.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 48DAC60727C3843A001D45D0 /* RxComposableArchitecture.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RxComposableArchitecture.h; sourceTree = ""; }; - 48DAC60827C3843A001D45D0 /* RxComposableArchitecture.docc */ = {isa = PBXFileReference; lastKnownFileType = folder.documentationcatalog; path = RxComposableArchitecture.docc; sourceTree = ""; }; - 48DAC61827C38663001D45D0 /* DiffingInterface.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DiffingInterface.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 48DAC61A27C38663001D45D0 /* DiffingInterface.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DiffingInterface.h; sourceTree = ""; }; - 48DAC61B27C38663001D45D0 /* DiffingInterface.docc */ = {isa = PBXFileReference; lastKnownFileType = folder.documentationcatalog; path = DiffingInterface.docc; sourceTree = ""; }; - 48DAC62527C38677001D45D0 /* DiffingInterface+Primitives.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "DiffingInterface+Primitives.swift"; sourceTree = ""; }; - 48DAC62627C38677001D45D0 /* HashDiffing.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HashDiffing.swift; sourceTree = ""; }; - 48DAC62727C38677001D45D0 /* HashDiffable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HashDiffable.swift; sourceTree = ""; }; - 48DAC62827C38677001D45D0 /* AnyHashDiffable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnyHashDiffable.swift; sourceTree = ""; }; - 48DAC63227C386C0001D45D0 /* DiffingUtility.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DiffingUtility.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 48DAC63427C386C0001D45D0 /* DiffingUtility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DiffingUtility.h; sourceTree = ""; }; - 48DAC63527C386C0001D45D0 /* DiffingUtility.docc */ = {isa = PBXFileReference; lastKnownFileType = folder.documentationcatalog; path = DiffingUtility.docc; sourceTree = ""; }; - 48DAC63F27C386CF001D45D0 /* Diff.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Diff.swift; sourceTree = ""; }; - 48DAC64027C386CF001D45D0 /* Debug.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Debug.swift; sourceTree = ""; }; - 48DAC6D427C38B0F001D45D0 /* IfLet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IfLet.swift; sourceTree = ""; }; - 48DAC6D527C38B0F001D45D0 /* Binding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Binding.swift; sourceTree = ""; }; - 48DAC6D627C38B0F001D45D0 /* Effect.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Effect.swift; sourceTree = ""; }; - 48DAC6D727C38B0F001D45D0 /* Export.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Export.swift; sourceTree = ""; }; - 48DAC6D827C38B0F001D45D0 /* Store.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Store.swift; sourceTree = ""; }; - 48DAC6D927C38B0F001D45D0 /* IdentifiedArray.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IdentifiedArray.swift; sourceTree = ""; }; - 48DAC6DB27C38B0F001D45D0 /* Deprecated.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Deprecated.swift; sourceTree = ""; }; - 48DAC6DC27C38B0F001D45D0 /* AnyDisposable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnyDisposable.swift; sourceTree = ""; }; - 48DAC6DD27C38B0F001D45D0 /* Locking.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Locking.swift; sourceTree = ""; }; - 48DAC6DE27C38B10001D45D0 /* Reducer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Reducer.swift; sourceTree = ""; }; - 48DAC6DF27C38B10001D45D0 /* Stateless.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Stateless.swift; sourceTree = ""; }; - 48DAC6E127C38B10001D45D0 /* MockPageTemplate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MockPageTemplate.swift; sourceTree = ""; }; - 48DAC6E227C38B10001D45D0 /* Bootstrapping.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Bootstrapping.swift; sourceTree = ""; }; - 48DAC6E327C38B10001D45D0 /* ReducerInstrumentation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReducerInstrumentation.swift; sourceTree = ""; }; - 48DAC6E427C38B10001D45D0 /* ReducerDebugging.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReducerDebugging.swift; sourceTree = ""; }; - 48DAC6E627C38B10001D45D0 /* SingleSelection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleSelection.swift; sourceTree = ""; }; - 48DAC6E727C38B10001D45D0 /* UniqueElements.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UniqueElements.swift; sourceTree = ""; }; - 48DAC6E927C38B10001D45D0 /* Timer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Timer.swift; sourceTree = ""; }; - 48DAC6EA27C38B10001D45D0 /* Cancellation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Cancellation.swift; sourceTree = ""; }; - 48DAC6EB27C38B10001D45D0 /* Deferring.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Deferring.swift; sourceTree = ""; }; - 48DAC6EC27C38B10001D45D0 /* FireAndForget.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FireAndForget.swift; sourceTree = ""; }; - 48DAC6ED27C38B10001D45D0 /* Debouncing.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Debouncing.swift; sourceTree = ""; }; - 48DAC6EE27C38B10001D45D0 /* OptionalPaths.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OptionalPaths.swift; sourceTree = ""; }; - 48DAC70B27C38CCB001D45D0 /* RxComposableArchitectureTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxComposableArchitectureTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 48DAC70D27C38CCB001D45D0 /* RxComposableArchitectureTests.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RxComposableArchitectureTests.h; sourceTree = ""; }; - 48DAC70E27C38CCB001D45D0 /* RxComposableArchitectureTests.docc */ = {isa = PBXFileReference; lastKnownFileType = folder.documentationcatalog; path = RxComposableArchitectureTests.docc; sourceTree = ""; }; - 48DAC71827C38CDE001D45D0 /* IdentifiedArrayTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IdentifiedArrayTests.swift; sourceTree = ""; }; - 48DAC71927C38CDE001D45D0 /* EffectTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EffectTests.swift; sourceTree = ""; }; - 48DAC71A27C38CDE001D45D0 /* EffectDebounceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EffectDebounceTests.swift; sourceTree = ""; }; - 48DAC71B27C38CDE001D45D0 /* LCRNG.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LCRNG.swift; sourceTree = ""; }; - 48DAC71C27C38CDE001D45D0 /* EffectCancellationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EffectCancellationTests.swift; sourceTree = ""; }; - 48DAC71D27C38CDE001D45D0 /* RxComposableArchitectureTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxComposableArchitectureTests.swift; sourceTree = ""; }; - 48DAC71E27C38CDE001D45D0 /* TimerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TimerTests.swift; sourceTree = ""; }; - 48DAC71F27C38CDE001D45D0 /* EffectDeferredTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EffectDeferredTests.swift; sourceTree = ""; }; - 48DAC72027C38CDE001D45D0 /* ReducerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReducerTests.swift; sourceTree = ""; }; - 48DAC72127C38CDE001D45D0 /* DebugTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DebugTests.swift; sourceTree = ""; }; - 48DAC72227C38CDE001D45D0 /* SingleSelectionSelectableTypeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleSelectionSelectableTypeTests.swift; sourceTree = ""; }; - 48DAC72327C38CDE001D45D0 /* StoreTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StoreTests.swift; sourceTree = ""; }; - 48DAC72427C38CDE001D45D0 /* MemoryManagementTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MemoryManagementTests.swift; sourceTree = ""; }; - 48DAC72527C38CDE001D45D0 /* SingleSelectionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SingleSelectionTests.swift; sourceTree = ""; }; - 48DAC73E27C38D97001D45D0 /* TestSupport.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TestSupport.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 48DAC74027C38D97001D45D0 /* TestSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TestSupport.h; sourceTree = ""; }; - 48DAC74127C38D97001D45D0 /* TestSupport.docc */ = {isa = PBXFileReference; lastKnownFileType = folder.documentationcatalog; path = TestSupport.docc; sourceTree = ""; }; - 48DAC74B27C38DAA001D45D0 /* TestScheduler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestScheduler.swift; sourceTree = ""; }; - 48DAC74C27C38DAA001D45D0 /* Export.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Export.swift; sourceTree = ""; }; - 48DAC74D27C38DAA001D45D0 /* Unwrap.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Unwrap.swift; sourceTree = ""; }; - 48DAC74E27C38DAA001D45D0 /* Annotating.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Annotating.swift; sourceTree = ""; }; - 48DAC74F27C38DAA001D45D0 /* FailingEffect.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FailingEffect.swift; sourceTree = ""; }; - 48DAC75127C38DAA001D45D0 /* VirtualTimeScheduler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VirtualTimeScheduler.swift; sourceTree = ""; }; - 48DAC75227C38DAA001D45D0 /* PriorityQueue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PriorityQueue.swift; sourceTree = ""; }; - 48DAC75327C38DAA001D45D0 /* TestStore.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestStore.swift; sourceTree = ""; }; - 48DAC76127C38E73001D45D0 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Platforms/iPhoneOS.platform/Developer/Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; - 48DAC76D27C38EAD001D45D0 /* DiffingTestSupport.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DiffingTestSupport.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 48DAC76F27C38EAD001D45D0 /* DiffingTestSupport.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DiffingTestSupport.h; sourceTree = ""; }; - 48DAC77027C38EAD001D45D0 /* DiffingTestSupport.docc */ = {isa = PBXFileReference; lastKnownFileType = folder.documentationcatalog; path = DiffingTestSupport.docc; sourceTree = ""; }; - 48DAC77A27C38EC9001D45D0 /* XCTDecode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCTDecode.swift; sourceTree = ""; }; - 48DAC77B27C38EC9001D45D0 /* XCTPrettyEqual.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = XCTPrettyEqual.swift; sourceTree = ""; }; - 593494F11362312C1943BCAA /* Pods-RxComposableArchitecture.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxComposableArchitecture.release.xcconfig"; path = "Target Support Files/Pods-RxComposableArchitecture/Pods-RxComposableArchitecture.release.xcconfig"; sourceTree = ""; }; - 5D9BE14880FA5F45EA62F238 /* Pods-RxComposableArchitecture.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxComposableArchitecture.debug.xcconfig"; path = "Target Support Files/Pods-RxComposableArchitecture/Pods-RxComposableArchitecture.debug.xcconfig"; sourceTree = ""; }; - 6E5147DCC852345C4F52D0F9 /* Pods-RxComposableArchitectureTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxComposableArchitectureTests.debug.xcconfig"; path = "Target Support Files/Pods-RxComposableArchitectureTests/Pods-RxComposableArchitectureTests.debug.xcconfig"; sourceTree = ""; }; - 74CA63C0EA127FBD45E7C596 /* Pods_TestSupport.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_TestSupport.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 99350B5DA80BAC5D18EA3B8D /* Pods_RxComposableArchitecture.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RxComposableArchitecture.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - B711F2F591349482FACDBE8C /* Pods-TestSupport.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TestSupport.debug.xcconfig"; path = "Target Support Files/Pods-TestSupport/Pods-TestSupport.debug.xcconfig"; sourceTree = ""; }; - BAC720BB1276FD4A58E0995F /* Pods-RxComposableArchitectureExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxComposableArchitectureExample.debug.xcconfig"; path = "Target Support Files/Pods-RxComposableArchitectureExample/Pods-RxComposableArchitectureExample.debug.xcconfig"; sourceTree = ""; }; - CE869D92EC2BD944F657ABC9 /* Pods-RxComposableArchitectureTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RxComposableArchitectureTests.release.xcconfig"; path = "Target Support Files/Pods-RxComposableArchitectureTests/Pods-RxComposableArchitectureTests.release.xcconfig"; sourceTree = ""; }; - D35E75E6027094F0586CB60E /* Pods_RxComposableArchitectureExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RxComposableArchitectureExample.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - F1387F3EA85FC5DB51814A48 /* Pods-TestSupport.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TestSupport.release.xcconfig"; path = "Target Support Files/Pods-TestSupport/Pods-TestSupport.release.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 48DAC5E627C381FD001D45D0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC74627C38D97001D45D0 /* TestSupport.framework in Frameworks */, - 48DAC60D27C3843A001D45D0 /* RxComposableArchitecture.framework in Frameworks */, - 48DAC77527C38EAD001D45D0 /* DiffingTestSupport.framework in Frameworks */, - 16BF42554966E67266B4076B /* Pods_RxComposableArchitectureExample.framework in Frameworks */, - 48DAC62027C38663001D45D0 /* DiffingInterface.framework in Frameworks */, - 48DAC63A27C386C0001D45D0 /* DiffingUtility.framework in Frameworks */, - 48DAC71327C38CCB001D45D0 /* RxComposableArchitectureTests.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC60227C3843A001D45D0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC64327C386E0001D45D0 /* DiffingInterface.framework in Frameworks */, - E4EF80B30828B9F434A161B4 /* Pods_RxComposableArchitecture.framework in Frameworks */, - 48DAC64827C386E3001D45D0 /* DiffingUtility.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC61527C38663001D45D0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC62F27C386C0001D45D0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC70827C38CCB001D45D0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC75C27C38DB1001D45D0 /* TestSupport.framework in Frameworks */, - 48DAC73427C38CFE001D45D0 /* RxComposableArchitecture.framework in Frameworks */, - 7BA5C006372D1DB429138D8B /* Pods_RxComposableArchitectureTests.framework in Frameworks */, - 48DAC76227C38E73001D45D0 /* XCTest.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC73B27C38D97001D45D0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC78127C38F26001D45D0 /* RxComposableArchitecture.framework in Frameworks */, - 48DAC78627C38F4E001D45D0 /* DiffingTestSupport.framework in Frameworks */, - 48DAC76527C38E81001D45D0 /* XCTest.framework in Frameworks */, - 2A32D642256972C1FF0BAB1F /* Pods_TestSupport.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC76A27C38EAD001D45D0 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC77E27C38EF7001D45D0 /* XCTest.framework in Frameworks */, - 48DAC78B27C38FAF001D45D0 /* DiffingUtility.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 162C0FF428D521412006FBCF /* Pods */ = { - isa = PBXGroup; - children = ( - 5D9BE14880FA5F45EA62F238 /* Pods-RxComposableArchitecture.debug.xcconfig */, - 593494F11362312C1943BCAA /* Pods-RxComposableArchitecture.release.xcconfig */, - BAC720BB1276FD4A58E0995F /* Pods-RxComposableArchitectureExample.debug.xcconfig */, - 1CDF88EE99C341A71671F250 /* Pods-RxComposableArchitectureExample.release.xcconfig */, - 6E5147DCC852345C4F52D0F9 /* Pods-RxComposableArchitectureTests.debug.xcconfig */, - CE869D92EC2BD944F657ABC9 /* Pods-RxComposableArchitectureTests.release.xcconfig */, - B711F2F591349482FACDBE8C /* Pods-TestSupport.debug.xcconfig */, - F1387F3EA85FC5DB51814A48 /* Pods-TestSupport.release.xcconfig */, - ); - path = Pods; - sourceTree = ""; - }; - 48DAC5E027C381FD001D45D0 = { - isa = PBXGroup; - children = ( - 48DAC5EB27C381FD001D45D0 /* RxComposableArchitectureExample */, - 48DAC60627C3843A001D45D0 /* RxComposableArchitecture */, - 48DAC61927C38663001D45D0 /* DiffingInterface */, - 48DAC63327C386C0001D45D0 /* DiffingUtility */, - 48DAC70C27C38CCB001D45D0 /* RxComposableArchitectureTests */, - 48DAC73F27C38D97001D45D0 /* TestSupport */, - 48DAC76E27C38EAD001D45D0 /* DiffingTestSupport */, - 48DAC5EA27C381FD001D45D0 /* Products */, - 162C0FF428D521412006FBCF /* Pods */, - C1F4AC2AB7BCDCBDA46BF5ED /* Frameworks */, - ); - sourceTree = ""; - }; - 48DAC5EA27C381FD001D45D0 /* Products */ = { - isa = PBXGroup; - children = ( - 48DAC5E927C381FD001D45D0 /* RxComposableArchitectureExample.app */, - 48DAC60527C3843A001D45D0 /* RxComposableArchitecture.framework */, - 48DAC61827C38663001D45D0 /* DiffingInterface.framework */, - 48DAC63227C386C0001D45D0 /* DiffingUtility.framework */, - 48DAC70B27C38CCB001D45D0 /* RxComposableArchitectureTests.framework */, - 48DAC73E27C38D97001D45D0 /* TestSupport.framework */, - 48DAC76D27C38EAD001D45D0 /* DiffingTestSupport.framework */, - ); - name = Products; - sourceTree = ""; - }; - 48DAC5EB27C381FD001D45D0 /* RxComposableArchitectureExample */ = { - isa = PBXGroup; - children = ( - 48DAC5EC27C381FD001D45D0 /* AppDelegate.swift */, - 48DAC5EE27C381FD001D45D0 /* SceneDelegate.swift */, - 48DAC5F027C381FD001D45D0 /* ViewController.swift */, - 48DAC5F227C381FD001D45D0 /* Main.storyboard */, - 48DAC5F527C381FF001D45D0 /* Assets.xcassets */, - 48DAC5F727C381FF001D45D0 /* LaunchScreen.storyboard */, - 48DAC5FA27C381FF001D45D0 /* Info.plist */, - ); - path = RxComposableArchitectureExample; - sourceTree = ""; - }; - 48DAC60627C3843A001D45D0 /* RxComposableArchitecture */ = { - isa = PBXGroup; - children = ( - 48DAC6D527C38B0F001D45D0 /* Binding.swift */, - 48DAC6E027C38B10001D45D0 /* Debugging */, - 48DAC6D627C38B0F001D45D0 /* Effect.swift */, - 48DAC6E827C38B10001D45D0 /* Effects */, - 48DAC6D727C38B0F001D45D0 /* Export.swift */, - 48DAC6D927C38B0F001D45D0 /* IdentifiedArray.swift */, - 48DAC6D427C38B0F001D45D0 /* IfLet.swift */, - 48DAC6DA27C38B0F001D45D0 /* Internal */, - 48DAC6EE27C38B10001D45D0 /* OptionalPaths.swift */, - 48DAC6E527C38B10001D45D0 /* PropertyWrapper */, - 48DAC6DE27C38B10001D45D0 /* Reducer.swift */, - 48DAC6DF27C38B10001D45D0 /* Stateless.swift */, - 48DAC6D827C38B0F001D45D0 /* Store.swift */, - 48DAC60727C3843A001D45D0 /* RxComposableArchitecture.h */, - 48DAC60827C3843A001D45D0 /* RxComposableArchitecture.docc */, - ); - path = RxComposableArchitecture; - sourceTree = ""; - }; - 48DAC61927C38663001D45D0 /* DiffingInterface */ = { - isa = PBXGroup; - children = ( - 48DAC62827C38677001D45D0 /* AnyHashDiffable.swift */, - 48DAC62527C38677001D45D0 /* DiffingInterface+Primitives.swift */, - 48DAC62727C38677001D45D0 /* HashDiffable.swift */, - 48DAC62627C38677001D45D0 /* HashDiffing.swift */, - 48DAC61A27C38663001D45D0 /* DiffingInterface.h */, - 48DAC61B27C38663001D45D0 /* DiffingInterface.docc */, - ); - path = DiffingInterface; - sourceTree = ""; - }; - 48DAC63327C386C0001D45D0 /* DiffingUtility */ = { - isa = PBXGroup; - children = ( - 48DAC64027C386CF001D45D0 /* Debug.swift */, - 48DAC63F27C386CF001D45D0 /* Diff.swift */, - 48DAC63427C386C0001D45D0 /* DiffingUtility.h */, - 48DAC63527C386C0001D45D0 /* DiffingUtility.docc */, - ); - path = DiffingUtility; - sourceTree = ""; - }; - 48DAC6DA27C38B0F001D45D0 /* Internal */ = { - isa = PBXGroup; - children = ( - 48DAC6DB27C38B0F001D45D0 /* Deprecated.swift */, - 48DAC6DC27C38B0F001D45D0 /* AnyDisposable.swift */, - 48DAC6DD27C38B0F001D45D0 /* Locking.swift */, - ); - path = Internal; - sourceTree = ""; - }; - 48DAC6E027C38B10001D45D0 /* Debugging */ = { - isa = PBXGroup; - children = ( - 48DAC6E127C38B10001D45D0 /* MockPageTemplate.swift */, - 48DAC6E227C38B10001D45D0 /* Bootstrapping.swift */, - 48DAC6E327C38B10001D45D0 /* ReducerInstrumentation.swift */, - 48DAC6E427C38B10001D45D0 /* ReducerDebugging.swift */, - ); - path = Debugging; - sourceTree = ""; - }; - 48DAC6E527C38B10001D45D0 /* PropertyWrapper */ = { - isa = PBXGroup; - children = ( - 48DAC6E627C38B10001D45D0 /* SingleSelection.swift */, - 48DAC6E727C38B10001D45D0 /* UniqueElements.swift */, - ); - path = PropertyWrapper; - sourceTree = ""; - }; - 48DAC6E827C38B10001D45D0 /* Effects */ = { - isa = PBXGroup; - children = ( - 48DAC6E927C38B10001D45D0 /* Timer.swift */, - 48DAC6EA27C38B10001D45D0 /* Cancellation.swift */, - 48DAC6EB27C38B10001D45D0 /* Deferring.swift */, - 48DAC6EC27C38B10001D45D0 /* FireAndForget.swift */, - 48DAC6ED27C38B10001D45D0 /* Debouncing.swift */, - ); - path = Effects; - sourceTree = ""; - }; - 48DAC70C27C38CCB001D45D0 /* RxComposableArchitectureTests */ = { - isa = PBXGroup; - children = ( - 48DAC72127C38CDE001D45D0 /* DebugTests.swift */, - 48DAC71C27C38CDE001D45D0 /* EffectCancellationTests.swift */, - 48DAC71A27C38CDE001D45D0 /* EffectDebounceTests.swift */, - 48DAC71F27C38CDE001D45D0 /* EffectDeferredTests.swift */, - 48DAC71927C38CDE001D45D0 /* EffectTests.swift */, - 48DAC71827C38CDE001D45D0 /* IdentifiedArrayTests.swift */, - 48DAC71B27C38CDE001D45D0 /* LCRNG.swift */, - 48DAC72427C38CDE001D45D0 /* MemoryManagementTests.swift */, - 48DAC72027C38CDE001D45D0 /* ReducerTests.swift */, - 48DAC71D27C38CDE001D45D0 /* RxComposableArchitectureTests.swift */, - 48DAC72227C38CDE001D45D0 /* SingleSelectionSelectableTypeTests.swift */, - 48DAC72527C38CDE001D45D0 /* SingleSelectionTests.swift */, - 48DAC72327C38CDE001D45D0 /* StoreTests.swift */, - 48DAC71E27C38CDE001D45D0 /* TimerTests.swift */, - 48DAC70D27C38CCB001D45D0 /* RxComposableArchitectureTests.h */, - 48DAC70E27C38CCB001D45D0 /* RxComposableArchitectureTests.docc */, - ); - path = RxComposableArchitectureTests; - sourceTree = ""; - }; - 48DAC73F27C38D97001D45D0 /* TestSupport */ = { - isa = PBXGroup; - children = ( - 48DAC74E27C38DAA001D45D0 /* Annotating.swift */, - 48DAC74C27C38DAA001D45D0 /* Export.swift */, - 48DAC74F27C38DAA001D45D0 /* FailingEffect.swift */, - 48DAC75027C38DAA001D45D0 /* Internal */, - 48DAC74B27C38DAA001D45D0 /* TestScheduler.swift */, - 48DAC75327C38DAA001D45D0 /* TestStore.swift */, - 48DAC74D27C38DAA001D45D0 /* Unwrap.swift */, - 48DAC74027C38D97001D45D0 /* TestSupport.h */, - 48DAC74127C38D97001D45D0 /* TestSupport.docc */, - ); - path = TestSupport; - sourceTree = ""; - }; - 48DAC75027C38DAA001D45D0 /* Internal */ = { - isa = PBXGroup; - children = ( - 48DAC75127C38DAA001D45D0 /* VirtualTimeScheduler.swift */, - 48DAC75227C38DAA001D45D0 /* PriorityQueue.swift */, - ); - path = Internal; - sourceTree = ""; - }; - 48DAC76E27C38EAD001D45D0 /* DiffingTestSupport */ = { - isa = PBXGroup; - children = ( - 48DAC76F27C38EAD001D45D0 /* DiffingTestSupport.h */, - 48DAC77A27C38EC9001D45D0 /* XCTDecode.swift */, - 48DAC77B27C38EC9001D45D0 /* XCTPrettyEqual.swift */, - 48DAC77027C38EAD001D45D0 /* DiffingTestSupport.docc */, - ); - path = DiffingTestSupport; - sourceTree = ""; - }; - C1F4AC2AB7BCDCBDA46BF5ED /* Frameworks */ = { - isa = PBXGroup; - children = ( - 48DAC76127C38E73001D45D0 /* XCTest.framework */, - 99350B5DA80BAC5D18EA3B8D /* Pods_RxComposableArchitecture.framework */, - D35E75E6027094F0586CB60E /* Pods_RxComposableArchitectureExample.framework */, - 165D1F46AB6664F68B7E57BB /* Pods_RxComposableArchitectureTests.framework */, - 74CA63C0EA127FBD45E7C596 /* Pods_TestSupport.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 48DAC60027C3843A001D45D0 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC60A27C3843A001D45D0 /* RxComposableArchitecture.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC61327C38663001D45D0 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC61D27C38663001D45D0 /* DiffingInterface.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC62D27C386C0001D45D0 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC63727C386C0001D45D0 /* DiffingUtility.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC70627C38CCB001D45D0 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC71027C38CCB001D45D0 /* RxComposableArchitectureTests.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC73927C38D97001D45D0 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC74327C38D97001D45D0 /* TestSupport.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC76827C38EAD001D45D0 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC77227C38EAD001D45D0 /* DiffingTestSupport.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 48DAC5E827C381FD001D45D0 /* RxComposableArchitectureExample */ = { - isa = PBXNativeTarget; - buildConfigurationList = 48DAC5FD27C381FF001D45D0 /* Build configuration list for PBXNativeTarget "RxComposableArchitectureExample" */; - buildPhases = ( - 472D0183AEC591766F1B65EC /* [CP] Check Pods Manifest.lock */, - 48DAC5E527C381FD001D45D0 /* Sources */, - 48DAC5E627C381FD001D45D0 /* Frameworks */, - 48DAC5E727C381FD001D45D0 /* Resources */, - 48DAC60F27C3843A001D45D0 /* Embed Frameworks */, - 6855932ADD0A9E42C5273DBC /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - 48DAC60C27C3843A001D45D0 /* PBXTargetDependency */, - 48DAC61F27C38663001D45D0 /* PBXTargetDependency */, - 48DAC63927C386C0001D45D0 /* PBXTargetDependency */, - 48DAC71227C38CCB001D45D0 /* PBXTargetDependency */, - 48DAC74527C38D97001D45D0 /* PBXTargetDependency */, - 48DAC77427C38EAD001D45D0 /* PBXTargetDependency */, - ); - name = RxComposableArchitectureExample; - productName = RxComposableArchitectureExample; - productReference = 48DAC5E927C381FD001D45D0 /* RxComposableArchitectureExample.app */; - productType = "com.apple.product-type.application"; - }; - 48DAC60427C3843A001D45D0 /* RxComposableArchitecture */ = { - isa = PBXNativeTarget; - buildConfigurationList = 48DAC61227C3843A001D45D0 /* Build configuration list for PBXNativeTarget "RxComposableArchitecture" */; - buildPhases = ( - 99804DB9C0CFD37309D68FFE /* [CP] Check Pods Manifest.lock */, - 48DAC60027C3843A001D45D0 /* Headers */, - 48DAC60127C3843A001D45D0 /* Sources */, - 48DAC60227C3843A001D45D0 /* Frameworks */, - 48DAC60327C3843A001D45D0 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 48DAC64627C386E0001D45D0 /* PBXTargetDependency */, - 48DAC64B27C386E3001D45D0 /* PBXTargetDependency */, - ); - name = RxComposableArchitecture; - productName = RxComposableArchitecture; - productReference = 48DAC60527C3843A001D45D0 /* RxComposableArchitecture.framework */; - productType = "com.apple.product-type.framework"; - }; - 48DAC61727C38663001D45D0 /* DiffingInterface */ = { - isa = PBXNativeTarget; - buildConfigurationList = 48DAC62427C38663001D45D0 /* Build configuration list for PBXNativeTarget "DiffingInterface" */; - buildPhases = ( - 48DAC61327C38663001D45D0 /* Headers */, - 48DAC61427C38663001D45D0 /* Sources */, - 48DAC61527C38663001D45D0 /* Frameworks */, - 48DAC61627C38663001D45D0 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = DiffingInterface; - productName = DiffingInterface; - productReference = 48DAC61827C38663001D45D0 /* DiffingInterface.framework */; - productType = "com.apple.product-type.framework"; - }; - 48DAC63127C386C0001D45D0 /* DiffingUtility */ = { - isa = PBXNativeTarget; - buildConfigurationList = 48DAC63C27C386C0001D45D0 /* Build configuration list for PBXNativeTarget "DiffingUtility" */; - buildPhases = ( - 48DAC62D27C386C0001D45D0 /* Headers */, - 48DAC62E27C386C0001D45D0 /* Sources */, - 48DAC62F27C386C0001D45D0 /* Frameworks */, - 48DAC63027C386C0001D45D0 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = DiffingUtility; - productName = DiffingUtility; - productReference = 48DAC63227C386C0001D45D0 /* DiffingUtility.framework */; - productType = "com.apple.product-type.framework"; - }; - 48DAC70A27C38CCB001D45D0 /* RxComposableArchitectureTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 48DAC71727C38CCB001D45D0 /* Build configuration list for PBXNativeTarget "RxComposableArchitectureTests" */; - buildPhases = ( - E1FE4262446CDF5AE252ADE1 /* [CP] Check Pods Manifest.lock */, - 48DAC70627C38CCB001D45D0 /* Headers */, - 48DAC70727C38CCB001D45D0 /* Sources */, - 48DAC70827C38CCB001D45D0 /* Frameworks */, - 48DAC70927C38CCB001D45D0 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 48DAC73727C38CFE001D45D0 /* PBXTargetDependency */, - 48DAC75F27C38DB1001D45D0 /* PBXTargetDependency */, - ); - name = RxComposableArchitectureTests; - productName = RxComposableArchitectureTests; - productReference = 48DAC70B27C38CCB001D45D0 /* RxComposableArchitectureTests.framework */; - productType = "com.apple.product-type.framework"; - }; - 48DAC73D27C38D97001D45D0 /* TestSupport */ = { - isa = PBXNativeTarget; - buildConfigurationList = 48DAC74A27C38D97001D45D0 /* Build configuration list for PBXNativeTarget "TestSupport" */; - buildPhases = ( - 85CEF4D1A5EC629B0C6FB655 /* [CP] Check Pods Manifest.lock */, - 48DAC73927C38D97001D45D0 /* Headers */, - 48DAC73A27C38D97001D45D0 /* Sources */, - 48DAC73B27C38D97001D45D0 /* Frameworks */, - 48DAC73C27C38D97001D45D0 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 48DAC78427C38F26001D45D0 /* PBXTargetDependency */, - 48DAC78927C38F4E001D45D0 /* PBXTargetDependency */, - ); - name = TestSupport; - productName = TestSupport; - productReference = 48DAC73E27C38D97001D45D0 /* TestSupport.framework */; - productType = "com.apple.product-type.framework"; - }; - 48DAC76C27C38EAD001D45D0 /* DiffingTestSupport */ = { - isa = PBXNativeTarget; - buildConfigurationList = 48DAC77727C38EAD001D45D0 /* Build configuration list for PBXNativeTarget "DiffingTestSupport" */; - buildPhases = ( - 48DAC76827C38EAD001D45D0 /* Headers */, - 48DAC76927C38EAD001D45D0 /* Sources */, - 48DAC76A27C38EAD001D45D0 /* Frameworks */, - 48DAC76B27C38EAD001D45D0 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 48DAC78E27C38FAF001D45D0 /* PBXTargetDependency */, - ); - name = DiffingTestSupport; - productName = DiffingTestSupport; - productReference = 48DAC76D27C38EAD001D45D0 /* DiffingTestSupport.framework */; - productType = "com.apple.product-type.framework"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 48DAC5E127C381FD001D45D0 /* Project object */ = { - isa = PBXProject; - attributes = { - BuildIndependentTargetsInParallel = 1; - LastSwiftUpdateCheck = 1320; - LastUpgradeCheck = 1320; - TargetAttributes = { - 48DAC5E827C381FD001D45D0 = { - CreatedOnToolsVersion = 13.2.1; - }; - 48DAC60427C3843A001D45D0 = { - CreatedOnToolsVersion = 13.2.1; - }; - 48DAC61727C38663001D45D0 = { - CreatedOnToolsVersion = 13.2.1; - }; - 48DAC63127C386C0001D45D0 = { - CreatedOnToolsVersion = 13.2.1; - }; - 48DAC70A27C38CCB001D45D0 = { - CreatedOnToolsVersion = 13.2.1; - }; - 48DAC73D27C38D97001D45D0 = { - CreatedOnToolsVersion = 13.2.1; - }; - 48DAC76C27C38EAD001D45D0 = { - CreatedOnToolsVersion = 13.2.1; - }; - }; - }; - buildConfigurationList = 48DAC5E427C381FD001D45D0 /* Build configuration list for PBXProject "RxComposableArchitectureExample" */; - compatibilityVersion = "Xcode 13.0"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 48DAC5E027C381FD001D45D0; - productRefGroup = 48DAC5EA27C381FD001D45D0 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 48DAC5E827C381FD001D45D0 /* RxComposableArchitectureExample */, - 48DAC60427C3843A001D45D0 /* RxComposableArchitecture */, - 48DAC61727C38663001D45D0 /* DiffingInterface */, - 48DAC63127C386C0001D45D0 /* DiffingUtility */, - 48DAC70A27C38CCB001D45D0 /* RxComposableArchitectureTests */, - 48DAC73D27C38D97001D45D0 /* TestSupport */, - 48DAC76C27C38EAD001D45D0 /* DiffingTestSupport */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 48DAC5E727C381FD001D45D0 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC5F927C381FF001D45D0 /* LaunchScreen.storyboard in Resources */, - 48DAC5F627C381FF001D45D0 /* Assets.xcassets in Resources */, - 48DAC5F427C381FD001D45D0 /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC60327C3843A001D45D0 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC61627C38663001D45D0 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC63027C386C0001D45D0 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC70927C38CCB001D45D0 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC73C27C38D97001D45D0 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC76B27C38EAD001D45D0 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 472D0183AEC591766F1B65EC /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RxComposableArchitectureExample-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 6855932ADD0A9E42C5273DBC /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-RxComposableArchitectureExample/Pods-RxComposableArchitectureExample-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-RxComposableArchitectureExample/Pods-RxComposableArchitectureExample-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-RxComposableArchitectureExample/Pods-RxComposableArchitectureExample-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 85CEF4D1A5EC629B0C6FB655 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-TestSupport-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - 99804DB9C0CFD37309D68FFE /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RxComposableArchitecture-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; - E1FE4262446CDF5AE252ADE1 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-RxComposableArchitectureTests-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 48DAC5E527C381FD001D45D0 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC5F127C381FD001D45D0 /* ViewController.swift in Sources */, - 48DAC5ED27C381FD001D45D0 /* AppDelegate.swift in Sources */, - 48DAC5EF27C381FD001D45D0 /* SceneDelegate.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC60127C3843A001D45D0 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC6F227C38B10001D45D0 /* Export.swift in Sources */, - 48DAC6F127C38B10001D45D0 /* Effect.swift in Sources */, - 48DAC6F627C38B10001D45D0 /* AnyDisposable.swift in Sources */, - 48DAC6F827C38B10001D45D0 /* Reducer.swift in Sources */, - 48DAC70527C38B10001D45D0 /* OptionalPaths.swift in Sources */, - 48DAC6FB27C38B10001D45D0 /* Bootstrapping.swift in Sources */, - 48DAC6F427C38B10001D45D0 /* IdentifiedArray.swift in Sources */, - 48DAC70127C38B10001D45D0 /* Cancellation.swift in Sources */, - 48DAC70427C38B10001D45D0 /* Debouncing.swift in Sources */, - 48DAC6FC27C38B10001D45D0 /* ReducerInstrumentation.swift in Sources */, - 48DAC6FD27C38B10001D45D0 /* ReducerDebugging.swift in Sources */, - 48DAC70027C38B10001D45D0 /* Timer.swift in Sources */, - 48DAC6EF27C38B10001D45D0 /* IfLet.swift in Sources */, - 48DAC6F527C38B10001D45D0 /* Deprecated.swift in Sources */, - 48DAC6F327C38B10001D45D0 /* Store.swift in Sources */, - 48DAC6FF27C38B10001D45D0 /* UniqueElements.swift in Sources */, - 48DAC6F027C38B10001D45D0 /* Binding.swift in Sources */, - 48DAC60927C3843A001D45D0 /* RxComposableArchitecture.docc in Sources */, - 48DAC6FE27C38B10001D45D0 /* SingleSelection.swift in Sources */, - 48DAC70227C38B10001D45D0 /* Deferring.swift in Sources */, - 48DAC6FA27C38B10001D45D0 /* MockPageTemplate.swift in Sources */, - 48DAC6F927C38B10001D45D0 /* Stateless.swift in Sources */, - 48DAC70327C38B10001D45D0 /* FireAndForget.swift in Sources */, - 48DAC6F727C38B10001D45D0 /* Locking.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC61427C38663001D45D0 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC61C27C38663001D45D0 /* DiffingInterface.docc in Sources */, - 48DAC62927C38677001D45D0 /* DiffingInterface+Primitives.swift in Sources */, - 48DAC62B27C38677001D45D0 /* HashDiffable.swift in Sources */, - 48DAC62A27C38677001D45D0 /* HashDiffing.swift in Sources */, - 48DAC62C27C38677001D45D0 /* AnyHashDiffable.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC62E27C386C0001D45D0 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC64127C386CF001D45D0 /* Diff.swift in Sources */, - 48DAC64227C386CF001D45D0 /* Debug.swift in Sources */, - 48DAC63627C386C0001D45D0 /* DiffingUtility.docc in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC70727C38CCB001D45D0 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC73127C38CDE001D45D0 /* StoreTests.swift in Sources */, - 48DAC73227C38CDE001D45D0 /* MemoryManagementTests.swift in Sources */, - 48DAC73027C38CDE001D45D0 /* SingleSelectionSelectableTypeTests.swift in Sources */, - 48DAC72F27C38CDE001D45D0 /* DebugTests.swift in Sources */, - 48DAC72627C38CDE001D45D0 /* IdentifiedArrayTests.swift in Sources */, - 48DAC72B27C38CDE001D45D0 /* RxComposableArchitectureTests.swift in Sources */, - 48DAC72A27C38CDE001D45D0 /* EffectCancellationTests.swift in Sources */, - 48DAC72827C38CDE001D45D0 /* EffectDebounceTests.swift in Sources */, - 48DAC73327C38CDE001D45D0 /* SingleSelectionTests.swift in Sources */, - 48DAC72927C38CDE001D45D0 /* LCRNG.swift in Sources */, - 48DAC72D27C38CDE001D45D0 /* EffectDeferredTests.swift in Sources */, - 48DAC72E27C38CDE001D45D0 /* ReducerTests.swift in Sources */, - 48DAC70F27C38CCB001D45D0 /* RxComposableArchitectureTests.docc in Sources */, - 48DAC72727C38CDE001D45D0 /* EffectTests.swift in Sources */, - 48DAC72C27C38CDE001D45D0 /* TimerTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC73A27C38D97001D45D0 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC75727C38DAA001D45D0 /* Annotating.swift in Sources */, - 48DAC75827C38DAA001D45D0 /* FailingEffect.swift in Sources */, - 48DAC75627C38DAA001D45D0 /* Unwrap.swift in Sources */, - 48DAC75927C38DAA001D45D0 /* VirtualTimeScheduler.swift in Sources */, - 48DAC75B27C38DAA001D45D0 /* TestStore.swift in Sources */, - 48DAC74227C38D97001D45D0 /* TestSupport.docc in Sources */, - 48DAC75A27C38DAA001D45D0 /* PriorityQueue.swift in Sources */, - 48DAC75427C38DAA001D45D0 /* TestScheduler.swift in Sources */, - 48DAC75527C38DAA001D45D0 /* Export.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 48DAC76927C38EAD001D45D0 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 48DAC77D27C38EC9001D45D0 /* XCTPrettyEqual.swift in Sources */, - 48DAC77127C38EAD001D45D0 /* DiffingTestSupport.docc in Sources */, - 48DAC77C27C38EC9001D45D0 /* XCTDecode.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 48DAC60C27C3843A001D45D0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 48DAC60427C3843A001D45D0 /* RxComposableArchitecture */; - targetProxy = 48DAC60B27C3843A001D45D0 /* PBXContainerItemProxy */; - }; - 48DAC61F27C38663001D45D0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 48DAC61727C38663001D45D0 /* DiffingInterface */; - targetProxy = 48DAC61E27C38663001D45D0 /* PBXContainerItemProxy */; - }; - 48DAC63927C386C0001D45D0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 48DAC63127C386C0001D45D0 /* DiffingUtility */; - targetProxy = 48DAC63827C386C0001D45D0 /* PBXContainerItemProxy */; - }; - 48DAC64627C386E0001D45D0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 48DAC61727C38663001D45D0 /* DiffingInterface */; - targetProxy = 48DAC64527C386E0001D45D0 /* PBXContainerItemProxy */; - }; - 48DAC64B27C386E3001D45D0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 48DAC63127C386C0001D45D0 /* DiffingUtility */; - targetProxy = 48DAC64A27C386E3001D45D0 /* PBXContainerItemProxy */; - }; - 48DAC71227C38CCB001D45D0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 48DAC70A27C38CCB001D45D0 /* RxComposableArchitectureTests */; - targetProxy = 48DAC71127C38CCB001D45D0 /* PBXContainerItemProxy */; - }; - 48DAC73727C38CFE001D45D0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 48DAC60427C3843A001D45D0 /* RxComposableArchitecture */; - targetProxy = 48DAC73627C38CFE001D45D0 /* PBXContainerItemProxy */; - }; - 48DAC74527C38D97001D45D0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 48DAC73D27C38D97001D45D0 /* TestSupport */; - targetProxy = 48DAC74427C38D97001D45D0 /* PBXContainerItemProxy */; - }; - 48DAC75F27C38DB1001D45D0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 48DAC73D27C38D97001D45D0 /* TestSupport */; - targetProxy = 48DAC75E27C38DB1001D45D0 /* PBXContainerItemProxy */; - }; - 48DAC77427C38EAD001D45D0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 48DAC76C27C38EAD001D45D0 /* DiffingTestSupport */; - targetProxy = 48DAC77327C38EAD001D45D0 /* PBXContainerItemProxy */; - }; - 48DAC78427C38F26001D45D0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 48DAC60427C3843A001D45D0 /* RxComposableArchitecture */; - targetProxy = 48DAC78327C38F26001D45D0 /* PBXContainerItemProxy */; - }; - 48DAC78927C38F4E001D45D0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 48DAC76C27C38EAD001D45D0 /* DiffingTestSupport */; - targetProxy = 48DAC78827C38F4E001D45D0 /* PBXContainerItemProxy */; - }; - 48DAC78E27C38FAF001D45D0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 48DAC63127C386C0001D45D0 /* DiffingUtility */; - targetProxy = 48DAC78D27C38FAF001D45D0 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - 48DAC5F227C381FD001D45D0 /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 48DAC5F327C381FD001D45D0 /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 48DAC5F727C381FF001D45D0 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 48DAC5F827C381FF001D45D0 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 48DAC5FB27C381FF001D45D0 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - 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; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.2; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 48DAC5FC27C381FF001D45D0 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - 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; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.2; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 48DAC5FE27C381FF001D45D0 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = BAC720BB1276FD4A58E0995F /* Pods-RxComposableArchitectureExample.debug.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = RxComposableArchitectureExample/Info.plist; - INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; - INFOPLIST_KEY_UIMainStoryboardFile = Main; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.tokopedia.RxComposableArchitectureExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 48DAC5FF27C381FF001D45D0 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 1CDF88EE99C341A71671F250 /* Pods-RxComposableArchitectureExample.release.xcconfig */; - buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_FILE = RxComposableArchitectureExample/Info.plist; - INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen; - INFOPLIST_KEY_UIMainStoryboardFile = Main; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.tokopedia.RxComposableArchitectureExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; - 48DAC61027C3843A001D45D0 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 5D9BE14880FA5F45EA62F238 /* Pods-RxComposableArchitecture.debug.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.tokopedia.RxComposableArchitecture; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 48DAC61127C3843A001D45D0 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 593494F11362312C1943BCAA /* Pods-RxComposableArchitecture.release.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.tokopedia.RxComposableArchitecture; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 48DAC62227C38663001D45D0 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.tokopedia.DiffingInterface; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 48DAC62327C38663001D45D0 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.tokopedia.DiffingInterface; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 48DAC63D27C386C0001D45D0 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.tokopedia.DiffingUtility; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 48DAC63E27C386C0001D45D0 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.tokopedia.DiffingUtility; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 48DAC71527C38CCB001D45D0 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 6E5147DCC852345C4F52D0F9 /* Pods-RxComposableArchitectureTests.debug.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.tokopedia.RxComposableArchitectureTests; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 48DAC71627C38CCB001D45D0 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = CE869D92EC2BD944F657ABC9 /* Pods-RxComposableArchitectureTests.release.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.tokopedia.RxComposableArchitectureTests; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 48DAC74827C38D97001D45D0 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = B711F2F591349482FACDBE8C /* Pods-TestSupport.debug.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.tokopedia.TestSupport; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 48DAC74927C38D97001D45D0 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = F1387F3EA85FC5DB51814A48 /* Pods-TestSupport.release.xcconfig */; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.tokopedia.TestSupport; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 48DAC77827C38EAD001D45D0 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.tokopedia.DiffingTestSupport; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 48DAC77927C38EAD001D45D0 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_NSHumanReadableCopyright = ""; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.tokopedia.DiffingTestSupport; - PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; - SKIP_INSTALL = YES; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 48DAC5E427C381FD001D45D0 /* Build configuration list for PBXProject "RxComposableArchitectureExample" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 48DAC5FB27C381FF001D45D0 /* Debug */, - 48DAC5FC27C381FF001D45D0 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 48DAC5FD27C381FF001D45D0 /* Build configuration list for PBXNativeTarget "RxComposableArchitectureExample" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 48DAC5FE27C381FF001D45D0 /* Debug */, - 48DAC5FF27C381FF001D45D0 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 48DAC61227C3843A001D45D0 /* Build configuration list for PBXNativeTarget "RxComposableArchitecture" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 48DAC61027C3843A001D45D0 /* Debug */, - 48DAC61127C3843A001D45D0 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 48DAC62427C38663001D45D0 /* Build configuration list for PBXNativeTarget "DiffingInterface" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 48DAC62227C38663001D45D0 /* Debug */, - 48DAC62327C38663001D45D0 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 48DAC63C27C386C0001D45D0 /* Build configuration list for PBXNativeTarget "DiffingUtility" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 48DAC63D27C386C0001D45D0 /* Debug */, - 48DAC63E27C386C0001D45D0 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 48DAC71727C38CCB001D45D0 /* Build configuration list for PBXNativeTarget "RxComposableArchitectureTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 48DAC71527C38CCB001D45D0 /* Debug */, - 48DAC71627C38CCB001D45D0 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 48DAC74A27C38D97001D45D0 /* Build configuration list for PBXNativeTarget "TestSupport" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 48DAC74827C38D97001D45D0 /* Debug */, - 48DAC74927C38D97001D45D0 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 48DAC77727C38EAD001D45D0 /* Build configuration list for PBXNativeTarget "DiffingTestSupport" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 48DAC77827C38EAD001D45D0 /* Debug */, - 48DAC77927C38EAD001D45D0 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 48DAC5E127C381FD001D45D0 /* Project object */; -} diff --git a/RxComposableArchitectureExample.xcodeproj/xcshareddata/xcschemes/DiffingUtility.xcscheme b/RxComposableArchitectureExample.xcodeproj/xcshareddata/xcschemes/DiffingUtility.xcscheme deleted file mode 100644 index f5faecb..0000000 --- a/RxComposableArchitectureExample.xcodeproj/xcshareddata/xcschemes/DiffingUtility.xcscheme +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/RxComposableArchitectureExample.xcodeproj/xcuserdata/andreyyoshuamanik.xcuserdatad/xcschemes/xcschememanagement.plist b/RxComposableArchitectureExample.xcodeproj/xcuserdata/andreyyoshuamanik.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 6b68456..0000000 --- a/RxComposableArchitectureExample.xcodeproj/xcuserdata/andreyyoshuamanik.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,52 +0,0 @@ - - - - - SchemeUserState - - DiffingInterface.xcscheme_^#shared#^_ - - orderHint - 14 - - DiffingTestSupport.xcscheme_^#shared#^_ - - orderHint - 9 - - DiffingUtility.xcscheme_^#shared#^_ - - orderHint - 0 - - RxComposableArchitecture.xcscheme_^#shared#^_ - - orderHint - 11 - - RxComposableArchitectureExample.xcscheme_^#shared#^_ - - orderHint - 12 - - RxComposableArchitectureTests.xcscheme_^#shared#^_ - - orderHint - 13 - - TestSupport.xcscheme_^#shared#^_ - - orderHint - 10 - - - SuppressBuildableAutocreation - - 48DAC63127C386C0001D45D0 - - primary - - - - - diff --git a/RxComposableArchitectureExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/RxComposableArchitectureExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/RxComposableArchitectureExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/RxComposableArchitectureExample/AppDelegate.swift b/RxComposableArchitectureExample/AppDelegate.swift deleted file mode 100644 index 40569f5..0000000 --- a/RxComposableArchitectureExample/AppDelegate.swift +++ /dev/null @@ -1,36 +0,0 @@ -// -// AppDelegate.swift -// RxComposableArchitectureExample -// -// Created by Andrey Yoshua Manik on 21/02/22. -// - -import UIKit - -@main -class AppDelegate: UIResponder, UIApplicationDelegate { - - - - func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { - // Override point for customization after application launch. - return true - } - - // MARK: UISceneSession Lifecycle - - func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { - // Called when a new scene session is being created. - // Use this method to select a configuration to create the new scene with. - return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) - } - - func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set) { - // Called when the user discards a scene session. - // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions. - // Use this method to release any resources that were specific to the discarded scenes, as they will not return. - } - - -} - diff --git a/RxComposableArchitectureExample/Assets.xcassets/AccentColor.colorset/Contents.json b/RxComposableArchitectureExample/Assets.xcassets/AccentColor.colorset/Contents.json deleted file mode 100644 index eb87897..0000000 --- a/RxComposableArchitectureExample/Assets.xcassets/AccentColor.colorset/Contents.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "colors" : [ - { - "idiom" : "universal" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/RxComposableArchitectureExample/Assets.xcassets/AppIcon.appiconset/Contents.json b/RxComposableArchitectureExample/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 9221b9b..0000000 --- a/RxComposableArchitectureExample/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/RxComposableArchitectureExample/Assets.xcassets/Contents.json b/RxComposableArchitectureExample/Assets.xcassets/Contents.json deleted file mode 100644 index 73c0059..0000000 --- a/RxComposableArchitectureExample/Assets.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/RxComposableArchitectureExample/Base.lproj/LaunchScreen.storyboard b/RxComposableArchitectureExample/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index 865e932..0000000 --- a/RxComposableArchitectureExample/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/RxComposableArchitectureExample/Base.lproj/Main.storyboard b/RxComposableArchitectureExample/Base.lproj/Main.storyboard deleted file mode 100644 index 25a7638..0000000 --- a/RxComposableArchitectureExample/Base.lproj/Main.storyboard +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/RxComposableArchitectureExample/Info.plist b/RxComposableArchitectureExample/Info.plist deleted file mode 100644 index dd3c9af..0000000 --- a/RxComposableArchitectureExample/Info.plist +++ /dev/null @@ -1,25 +0,0 @@ - - - - - UIApplicationSceneManifest - - UIApplicationSupportsMultipleScenes - - UISceneConfigurations - - UIWindowSceneSessionRoleApplication - - - UISceneConfigurationName - Default Configuration - UISceneDelegateClassName - $(PRODUCT_MODULE_NAME).SceneDelegate - UISceneStoryboardFile - Main - - - - - - diff --git a/RxComposableArchitectureExample/SceneDelegate.swift b/RxComposableArchitectureExample/SceneDelegate.swift deleted file mode 100644 index e445b2d..0000000 --- a/RxComposableArchitectureExample/SceneDelegate.swift +++ /dev/null @@ -1,52 +0,0 @@ -// -// SceneDelegate.swift -// RxComposableArchitectureExample -// -// Created by Andrey Yoshua Manik on 21/02/22. -// - -import UIKit - -class SceneDelegate: UIResponder, UIWindowSceneDelegate { - - var window: UIWindow? - - - func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { - // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. - // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. - // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). - guard let _ = (scene as? UIWindowScene) else { return } - } - - func sceneDidDisconnect(_ scene: UIScene) { - // Called as the scene is being released by the system. - // This occurs shortly after the scene enters the background, or when its session is discarded. - // Release any resources associated with this scene that can be re-created the next time the scene connects. - // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead). - } - - func sceneDidBecomeActive(_ scene: UIScene) { - // Called when the scene has moved from an inactive state to an active state. - // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive. - } - - func sceneWillResignActive(_ scene: UIScene) { - // Called when the scene will move from an active state to an inactive state. - // This may occur due to temporary interruptions (ex. an incoming phone call). - } - - func sceneWillEnterForeground(_ scene: UIScene) { - // Called as the scene transitions from the background to the foreground. - // Use this method to undo the changes made on entering the background. - } - - func sceneDidEnterBackground(_ scene: UIScene) { - // Called as the scene transitions from the foreground to the background. - // Use this method to save data, release shared resources, and store enough scene-specific state information - // to restore the scene back to its current state. - } - - -} - diff --git a/RxComposableArchitectureExample/ViewController.swift b/RxComposableArchitectureExample/ViewController.swift deleted file mode 100644 index 5d057aa..0000000 --- a/RxComposableArchitectureExample/ViewController.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// ViewController.swift -// RxComposableArchitectureExample -// -// Created by Andrey Yoshua Manik on 21/02/22. -// - -import UIKit - -class ViewController: UIViewController { - - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view. - } - - -} - diff --git a/RxComposableArchitectureTests/DebugTests.swift b/RxComposableArchitectureTests/DebugTests.swift deleted file mode 100644 index 972e459..0000000 --- a/RxComposableArchitectureTests/DebugTests.swift +++ /dev/null @@ -1,748 +0,0 @@ -import DiffingUtility -import RxSwift -import XCTest - -@testable import RxComposableArchitecture - -internal final class DebugTests: XCTestCase { - internal func testCollection() { - XCTAssertEqual( - debugOutput([1, 2, 3]), - """ - [ - 1, - 2, - 3, - ] - """ - ) - - XCTAssertEqual( - debugOutput([[1, 2, 3], [4, 5, 6]]), - """ - [ - [ - 1, - 2, - 3, - ], - [ - 4, - 5, - 6, - ], - ] - """ - ) - } - - internal func testSet() { - XCTAssertEqual( - debugOutput(Set([1, 2, 3])), - """ - Set([ - 1, - 2, - 3, - ]) - """ - ) - - XCTAssertEqual( - debugOutput( - Set([ - Set([1, 2, 3]), - Set([4, 5, 6]) - ]) - ), - """ - Set([ - Set([ - 1, - 2, - 3, - ]), - Set([ - 4, - 5, - 6, - ]), - ]) - """ - ) - } - - internal func testDictionary() { - XCTAssertEqual( - debugOutput(["Blob": 1, "Blob Jr.": 2, "Blob Sr.": 3]), - """ - [ - "Blob Jr.": 2, - "Blob Sr.": 3, - "Blob": 1, - ] - """ - ) - - XCTAssertEqual( - debugOutput([1: ["Blob": 1], 2: ["Blob Jr.": 2], 3: ["Blob Sr.": 3]]), - """ - [ - 1: [ - "Blob": 1, - ], - 2: [ - "Blob Jr.": 2, - ], - 3: [ - "Blob Sr.": 3, - ], - ] - """ - ) - } - - internal func testTuple() { - XCTAssertEqual( - debugOutput((1, "2", 3.0)), - """ - ( - 1, - "2", - 3.0 - ) - """ - ) - - XCTAssertEqual( - debugOutput(((1, "2", 3.0), ("4" as Character, "5" as UnicodeScalar))), - """ - ( - ( - 1, - "2", - 3.0 - ), - ( - "4", - "5" - ) - ) - """ - ) - - XCTAssertEqual( - debugOutput(()), - """ - () - """ - ) - } - - internal func testStruct() { - struct User { - var id: Int - var name: String - } - - XCTAssertEqual( - debugOutput( - User(id: 1, name: "Blob") - ), - """ - User( - id: 1, - name: "Blob" - ) - """ - ) - } - - internal func testClass() { - class User { - var id = 1 - var name = "Blob" - } - - XCTAssertEqual( - debugOutput(User()), - """ - User( - id: 1, - name: "Blob" - ) - """ - ) - } - - internal func testEnum() { - enum Enum { - case caseWithNoAssociatedValues - case caseWithOneAssociatedValue(Int) - case caseWithOneLabeledAssociatedValue(one: Int) - case caseWithTwoLabeledAssociatedValues(one: Int, two: String) - case caseWithTuple((one: Int, two: String)) - } - - XCTAssertEqual( - debugOutput(Enum.caseWithNoAssociatedValues), - """ - Enum.caseWithNoAssociatedValues - """ - ) - XCTAssertEqual( - debugOutput(Enum.caseWithOneAssociatedValue(1)), - """ - Enum.caseWithOneAssociatedValue( - 1 - ) - """ - ) - XCTAssertEqual( - debugOutput(Enum.caseWithOneLabeledAssociatedValue(one: 1)), - """ - Enum.caseWithOneLabeledAssociatedValue( - one: 1 - ) - """ - ) - XCTAssertEqual( - debugOutput(Enum.caseWithTwoLabeledAssociatedValues(one: 1, two: "Blob")), - """ - Enum.caseWithTwoLabeledAssociatedValues( - one: 1, - two: "Blob" - ) - """ - ) - // NB: Fails due to https://bugs.swift.org/browse/SR-12409 - // XCTAssertEqual( - // debugOutput(Enum.caseWithTuple((one: 1, two: "Blob"))), - // """ - // Enum.caseWithTuple( - // ( - // one: 1, - // two: "Blob" - // ) - // ) - // """ - // ) - } - - internal func testObject() { - XCTAssertEqual( - debugOutput(NSObject()), - """ - NSObject() - """ - ) - } - - internal func testDebugOutputConvertible() { - XCTAssertEqual( - debugOutput(Date(timeIntervalSinceReferenceDate: 0)), - "2001-01-01T00:00:00Z" - ) - XCTAssertEqual( - debugOutput(URL(string: "https://www.pointfree.co")!), - "https://www.pointfree.co" - ) - XCTAssertEqual( - debugOutput(DispatchQueue.main), - "DispatchQueue.main" - ) - XCTAssertEqual( - debugOutput(DispatchQueue.global()), - "DispatchQueue.global()" - ) - XCTAssertEqual( - debugOutput(DispatchQueue.global(qos: .background)), - "DispatchQueue.global(qos: .background)" - ) - XCTAssertEqual( - debugOutput(DispatchQueue(label: "co.pointfree", qos: .background)), - #"DispatchQueue(label: "co.pointfree", qos: .background)"# - ) - XCTAssertEqual( - debugOutput(OperationQueue.main), - "OperationQueue.main" - ) - XCTAssertEqual( - debugOutput(OperationQueue()), - "OperationQueue()" - ) - XCTAssertEqual( - debugOutput(RunLoop.main), - "RunLoop.main" - ) - } - - #if compiler(<5.5) - internal func testNestedDump() { - struct User { - var id: UUID - var name: String - var createdAt: Date - var favoritePrimes: [Int] - var friends: [User] - } - - enum AppState { - case loggedOut(login: String, password: String) - case loggedIn(User) - } - - XCTAssertEqual( - debugOutput( - AppState.loggedIn( - User( - id: UUID(uuidString: "DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF")!, - name: "Blob", - createdAt: Date(timeIntervalSinceReferenceDate: 0), - favoritePrimes: [7, 11], - friends: [ - User( - id: UUID(uuidString: "CAFEBEEF-CAFE-BEEF-CAFE-BEEFCAFEBEEF")!, - name: "Blob Jr.", - createdAt: Date(timeIntervalSinceReferenceDate: 60 * 60 * 24 * 365), - favoritePrimes: [2, 3, 5], - friends: [] - ), - User( - id: UUID(uuidString: "D00DBEEF-D00D-BEEF-D00D-BEEFD00DBEEF")!, - name: "Blob Sr.", - createdAt: Date(timeIntervalSinceReferenceDate: 60 * 60 * 48 * 365), - favoritePrimes: [23], - friends: [] - ) - ] - ) - ) - ), - """ - AppState.loggedIn( - User( - id: DEADBEEF-DEAD-BEEF-DEAD-BEEFDEADBEEF, - name: "Blob", - createdAt: 2001-01-01T00:00:00Z, - favoritePrimes: [ - 7, - 11, - ], - friends: [ - User( - id: CAFEBEEF-CAFE-BEEF-CAFE-BEEFCAFEBEEF, - name: "Blob Jr.", - createdAt: 2002-01-01T00:00:00Z, - favoritePrimes: [ - 2, - 3, - 5, - ], - friends: [ - ] - ), - User( - id: D00DBEEF-D00D-BEEF-D00D-BEEFD00DBEEF, - name: "Blob Sr.", - createdAt: 2003-01-01T00:00:00Z, - favoritePrimes: [ - 23, - ], - friends: [ - ] - ), - ] - ) - ) - """ - ) - } - #endif - - internal func testRecursiveOutput() { - class Foo { - var foo: Foo? - } - let foo = Foo() - foo.foo = foo - XCTAssertEqual( - debugOutput(foo), - """ - Foo( - foo: Foo(↩︎) - ) - """ - ) - } - - internal func testStructDiff() { - let before = """ - AppState( - login: LoginState( - alertData: nil, - email: "blob@pointfree.co", - isFormValid: true, - isLoginRequestInFlight: true, - password: "password", - twoFactor: nil - ), - newGame: nil - ) - """ - - let after = """ - AppState( - login: nil, - newGame: NewGameState( - game: nil, - oPlayerName: "", - xPlayerName: "" - ) - ) - """ - - XCTAssertEqual( - debugDiff(before, after, printer: { $0 })!, - """ -   AppState( - − login: LoginState( - − alertData: nil, - − email: "blob@pointfree.co", - − isFormValid: true, - − isLoginRequestInFlight: true, - − password: "password", - − twoFactor: nil - − ), - − newGame: nil - + login: nil, - + newGame: NewGameState( - + game: nil, - + oPlayerName: "", - + xPlayerName: "" - + ) -   ) - """ - ) - } - - internal func testArrayDiff() { - let before = """ - [ - Todo( - isComplete: true, - description: "Milk", - id: 00000000-0000-0000-0000-000000000000 - ), - Todo( - isComplete: false, - description: "Eggs", - id: 00000000-0000-0000-0000-000000000001 - ), - ] - """ - - let after = """ - [ - Todo( - isComplete: false, - description: "Eggs", - id: 00000000-0000-0000-0000-000000000001 - ), - Todo( - isComplete: true, - description: "Milk", - id: 00000000-0000-0000-0000-000000000000 - ), - ] - """ - - XCTAssertEqual( - debugDiff(before, after, printer: { $0 })!, - """ -   [ - − Todo( - − isComplete: true, - − description: "Milk", - − id: 00000000-0000-0000-0000-000000000000 - − ), -   Todo( -   isComplete: false, -   description: "Eggs", -   id: 00000000-0000-0000-0000-000000000001 -   ), - + Todo( - + isComplete: true, - + description: "Milk", - + id: 00000000-0000-0000-0000-000000000000 - + ), -   ] - """ - ) - } - - internal func testComplexDiff() { - let before = """ - AppState( - login: LoginState( - alertData: nil, - email: "blob@pointfree.co", - isFormValid: true, - isLoginRequestInFlight: true, - password: "password", - twoFactor: nil - ), - newGame: nil, - todos: [ - Todo( - isComplete: true, - description: "Milk", - id: 00000000-0000-0000-0000-000000000000 - ), - Todo( - isComplete: false, - description: "Eggs", - id: 00000000-0000-0000-0000-000000000001 - ), - ] - ) - """ - - let after = """ - AppState( - login: nil, - newGame: NewGameState( - game: nil, - oPlayerName: "", - xPlayerName: "" - ), - todos: [ - Todo( - isComplete: false, - description: "Eggs", - id: 00000000-0000-0000-0000-000000000001 - ), - Todo( - isComplete: true, - description: "Milk", - id: 00000000-0000-0000-0000-000000000000 - ), - ] - ) - """ - - XCTAssertEqual( - debugDiff(before, after, printer: { $0 })!, - """ -   AppState( - − login: LoginState( - − alertData: nil, - − email: "blob@pointfree.co", - − isFormValid: true, - − isLoginRequestInFlight: true, - − password: "password", - − twoFactor: nil - + login: nil, - + newGame: NewGameState( - + game: nil, - + oPlayerName: "", - + xPlayerName: "" -   ), - − newGame: nil, -   todos: [ - − Todo( - − isComplete: true, - − description: "Milk", - − id: 00000000-0000-0000-0000-000000000000 - − ), -   Todo( -   isComplete: false, -   description: "Eggs", -   id: 00000000-0000-0000-0000-000000000001 -   ), - + Todo( - + isComplete: true, - + description: "Milk", - + id: 00000000-0000-0000-0000-000000000000 - + ), -   ] -   ) - """ - ) - } - - internal func testComplexDiff2() { - let before = """ - AppState( - login: LoginState( - alertData: nil, - email: "a", - isFormValid: true, - isLoginRequestInFlight: true, - password: "a", - twoFactor: nil - ), - newGame: nil - ) - """ - - let after = """ - AppState( - login: LoginState( - alertData: AlertData( - title: "The operation couldn’t be completed. (AuthenticationClient.AuthenticationError error 0.)" - ), - email: "a", - isFormValid: true, - isLoginRequestInFlight: false, - password: "a", - twoFactor: nil - ), - newGame: nil - ) - """ - - XCTAssertEqual( - debugDiff(before, after, printer: { $0 })!, - """ -   AppState( -   login: LoginState( - − alertData: nil, - + alertData: AlertData( - + title: "The operation couldn’t be completed. (AuthenticationClient.AuthenticationError error 0.)" - + ), -   email: "a", -   isFormValid: true, - − isLoginRequestInFlight: true, - + isLoginRequestInFlight: false, -   password: "a", -   twoFactor: nil -   ), -   newGame: nil -   ) - """ - ) - } - - internal func testComplexDiff3() { - let before = """ - B - B - """ - - let after = """ - A - B - """ - - XCTAssertEqual( - debugDiff(before, after, printer: { $0 })!, - """ - − B - + A -   B - """ - ) - } - - internal func testDebugCaseOutput() { - enum Action { - case action1(Bool, label: String) - case action2(Bool, Int, String) - case screenA(ScreenA) - - enum ScreenA { - case row(index: Int, action: RowAction) - - enum RowAction { - case tapped - case textChanged(query: String) - } - } - } - - XCTAssertEqual( - debugCaseOutput(Action.action1(true, label: "Blob")), - "Action.action1(_:, label:)" - ) - - XCTAssertEqual( - debugCaseOutput(Action.action2(true, 1, "Blob")), - "Action.action2(_:, _:, _:)" - ) - - XCTAssertEqual( - debugCaseOutput(Action.screenA(.row(index: 1, action: .tapped))), - "Action.screenA(.row(index:, action: .tapped))" - ) - - XCTAssertEqual( - debugCaseOutput(Action.screenA(.row(index: 1, action: .textChanged(query: "Hi")))), - "Action.screenA(.row(index:, action: .textChanged(query:)))" - ) - } - - internal func testDebugOutput() { - enum Action { - case action1(Bool, label: String) - case action2(Bool, Int, String) - case screenA(ScreenA) - - enum ScreenA { - case row(index: Int, action: RowAction) - - enum RowAction { - case tapped - case textChanged(query: String) - } - } - } - - XCTAssertEqual( - debugOutput(Action.action1(true, label: "Blob")), - """ - Action.action1( - true, - label: "Blob" - ) - """ - ) - - XCTAssertEqual( - debugOutput(Action.action2(true, 1, "Blob")), - """ - Action.action2( - true, - 1, - "Blob" - ) - """ - ) - - XCTAssertEqual( - debugOutput(Action.screenA(.row(index: 1, action: .tapped))), - """ - Action.screenA( - ScreenA.row( - index: 1, - action: RowAction.tapped - ) - ) - """ - ) - - XCTAssertEqual( - debugOutput(Action.screenA(.row(index: 1, action: .textChanged(query: "Hi")))), - """ - Action.screenA( - ScreenA.row( - index: 1, - action: RowAction.textChanged( - query: "Hi" - ) - ) - ) - """ - ) - } -} diff --git a/RxComposableArchitectureTests/EffectCancellationTests.swift b/RxComposableArchitectureTests/EffectCancellationTests.swift deleted file mode 100644 index 561f659..0000000 --- a/RxComposableArchitectureTests/EffectCancellationTests.swift +++ /dev/null @@ -1,257 +0,0 @@ -import RxSwift -import TestSupport -import XCTest - -@testable import RxComposableArchitecture - -internal final class EffectCancellationTests: XCTestCase { - private var disposeBag = DisposeBag() - - override internal func tearDown() { - super.tearDown() - disposeBag = DisposeBag() - } - - internal func testCancellation() { - struct CancelToken: Hashable {} - var values: [Int] = [] - - let subject = PublishSubject() - let effect = Effect(subject) - .cancellable(id: CancelToken()) - - effect.subscribe(onNext: { values.append($0) }) - .disposed(by: disposeBag) - - XCTAssertEqual(values, []) - subject.onNext(1) - XCTAssertEqual(values, [1]) - subject.onNext(2) - XCTAssertEqual(values, [1, 2]) - - Effect.cancel(id: CancelToken()) - .subscribe() - .disposed(by: disposeBag) - - subject.onNext(3) - XCTAssertEqual(values, [1, 2]) - } - - internal func testCancelInFlight() { - struct CancelToken: Hashable {} - var values: [Int] = [] - - let subject = PublishSubject() - Effect(subject) - .cancellable(id: CancelToken(), cancelInFlight: true) - .subscribe(onNext: { values.append($0) }) - .disposed(by: disposeBag) - - XCTAssertEqual(values, []) - subject.onNext(1) - XCTAssertEqual(values, [1]) - subject.onNext(2) - XCTAssertEqual(values, [1, 2]) - - Effect(subject) - .cancellable(id: CancelToken(), cancelInFlight: true) - .subscribe(onNext: { values.append($0) }) - .disposed(by: disposeBag) - - subject.onNext(3) - XCTAssertEqual(values, [1, 2, 3]) - subject.onNext(4) - XCTAssertEqual(values, [1, 2, 3, 4]) - } - - internal func testCancellationAfterDelay() { - struct CancelToken: Hashable {} - var value: Int? - - Observable.just(1) - .delay(.milliseconds(500), scheduler: MainScheduler.instance) - .eraseToEffect() - .cancellable(id: CancelToken()) - .subscribe(onNext: { value = $0 }) - .disposed(by: disposeBag) - - XCTAssertEqual(value, nil) - - DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) { - _ = Effect.cancel(id: CancelToken()) - .subscribe() - .disposed(by: self.disposeBag) - } - - _ = XCTWaiter.wait(for: [expectation(description: "")], timeout: 0.1) - - XCTAssertEqual(value, nil) - } - - internal func testCancellationAfterDelay_WithTestScheduler() { - struct CancelToken: Hashable {} - - let scheduler = TestScheduler(initialClock: 0) - - var value: Int? - - Observable.just(1) - .delay(.seconds(2), scheduler: scheduler) - .eraseToEffect() - .cancellable(id: CancelToken()) - .subscribe(onNext: { value = $0 }) - .disposed(by: disposeBag) - - XCTAssertEqual(value, nil) - - scheduler.advance(by: .seconds(1)) - - Effect.cancel(id: CancelToken()) - .subscribe() - .disposed(by: disposeBag) - - scheduler.advance(to: 1000) - - XCTAssertEqual(value, nil) - } - - internal func testCancellablesCleanUp_OnComplete() { - Observable.just(1) - .eraseToEffect() - .cancellable(id: 1) - .subscribe() - .disposed(by: disposeBag) - - XCTAssertTrue(cancellationCancellables.isEmpty) - } - - internal func testCancellablesCleanUp_OnCancel() { - let scheduler = TestScheduler(initialClock: 0) - - Observable.just(1) - .delay(.seconds(1), scheduler: scheduler) - .eraseToEffect() - .cancellable(id: 1) - .subscribe() - .disposed(by: disposeBag) - - Effect.cancel(id: 1) - .subscribe() - .disposed(by: disposeBag) - - XCTAssertTrue(cancellationCancellables.isEmpty) - } - - internal func testDoubleCancellation() { - struct CancelToken: Hashable {} - var values: [Int] = [] - - let subject = PublishSubject() - let effect = Effect(subject) - .cancellable(id: CancelToken()) - .cancellable(id: CancelToken()) - - effect - .subscribe(onNext: { values.append($0) }) - .disposed(by: disposeBag) - - XCTAssertEqual(values, []) - subject.onNext(1) - XCTAssertEqual(values, [1]) - - _ = Effect.cancel(id: CancelToken()) - .subscribe() - .disposed(by: disposeBag) - - subject.onNext(2) - XCTAssertEqual(values, [1]) - } - - internal func testCompleteBeforeCancellation() { - struct CancelToken: Hashable {} - var values: [Int] = [] - - let subject = PublishSubject() - let effect = Effect(subject) - .cancellable(id: CancelToken()) - - effect - .subscribe(onNext: { values.append($0) }) - .disposed(by: disposeBag) - - subject.onNext(1) - XCTAssertEqual(values, [1]) - - subject.onCompleted() - XCTAssertEqual(values, [1]) - - Effect.cancel(id: CancelToken()) - .subscribe() - .disposed(by: disposeBag) - - XCTAssertEqual(values, [1]) - } - - internal func testNestedCancels() { - var effect = Observable.never() - .eraseToEffect() - .cancellable(id: 1) - - for _ in 1 ... .random(in: 1 ... 1000) { - effect = effect.cancellable(id: 1) - } - - effect - .subscribe(onNext: { _ in }) - .disposed(by: disposeBag) - - disposeBag = DisposeBag() - - XCTAssertTrue(cancellationCancellables.isEmpty) - } - - internal func testSharedId() { - let scheduler = TestScheduler(initialClock: 0) - - let effect1 = Observable.just(1) - .delay(.seconds(1), scheduler: scheduler) - .eraseToEffect() - .cancellable(id: "id") - - let effect2 = Observable.just(2) - .delay(.seconds(2), scheduler: scheduler) - .eraseToEffect() - .cancellable(id: "id") - - var expectedOutput: [Int] = [] - effect1 - .subscribe(onNext: { expectedOutput.append($0) }) - .disposed(by: disposeBag) - effect2 - .subscribe(onNext: { expectedOutput.append($0) }) - .disposed(by: disposeBag) - - XCTAssertEqual(expectedOutput, []) - scheduler.advance(by: .seconds(1)) - XCTAssertEqual(expectedOutput, [1]) - scheduler.advance(by: .seconds(1)) - XCTAssertEqual(expectedOutput, [1, 2]) - } - - internal func testImmediateCancellation() { - let scheduler = TestScheduler(initialClock: 0) - - var expectedOutput: [Int] = [] - // Don't hold onto cancellable so that it is deallocated immediately. - let d = Observable.deferred { .just(1) } - .delay(.seconds(1), scheduler: scheduler) - .eraseToEffect() - .cancellable(id: "id") - .subscribe(onNext: { expectedOutput.append($0) }) - d.dispose() - - XCTAssertEqual(expectedOutput, []) - scheduler.advance(by: .seconds(1)) - XCTAssertEqual(expectedOutput, []) - } -} diff --git a/RxComposableArchitectureTests/EffectDebounceTests.swift b/RxComposableArchitectureTests/EffectDebounceTests.swift deleted file mode 100644 index 69069ae..0000000 --- a/RxComposableArchitectureTests/EffectDebounceTests.swift +++ /dev/null @@ -1,88 +0,0 @@ -import Foundation -import RxSwift -import TestSupport -import XCTest - -internal final class EffectDebounceTests: XCTestCase { - private let disposeBag = DisposeBag() - - internal func testDebounce() { - let scheduler = TestScheduler(initialClock: 0) - var values: [Int] = [] - - func runDebouncedEffect(value: Int) { - struct CancelToken: Hashable {} - Observable.just(value) - .eraseToEffect() - .debounce(id: CancelToken(), for: .seconds(1), scheduler: scheduler) - .subscribe(onNext: { values.append($0) }) - .disposed(by: disposeBag) - } - - runDebouncedEffect(value: 1) - - // Nothing emits right away. - XCTAssertEqual(values, []) - - // Waiting half the time also emits nothing - scheduler.advance(by: .milliseconds(500)) - XCTAssertEqual(values, []) - - // Run another debounced effect. - runDebouncedEffect(value: 2) - - // Waiting half the time emits nothing because the first debounced effect has been canceled. - scheduler.advance(by: .milliseconds(500)) - - XCTAssertEqual(values, []) - - // Run another debounced effect. - runDebouncedEffect(value: 3) - - // Waiting half the time emits nothing because the second debounced effect has been canceled. - scheduler.advance(by: .milliseconds(500)) - XCTAssertEqual(values, []) - - // Waiting the rest of the time emits the final effect value. - scheduler.advance(by: .milliseconds(500)) - XCTAssertEqual(values, [3]) - - // Running out the scheduler - scheduler.run() - XCTAssertEqual(values, [3]) - } - - internal func testDebounceIsLazy() { - let scheduler = TestScheduler(initialClock: 0) - var values: [Int] = [] - var effectRuns = 0 - - func runDebouncedEffect(value: Int) { - struct CancelToken: Hashable {} - - Observable.deferred { () -> Observable in - effectRuns += 1 - return .just(value) - } - .eraseToEffect() - .debounce(id: CancelToken(), for: .seconds(1), scheduler: scheduler) - .subscribe(onNext: { values.append($0) }) - .disposed(by: disposeBag) - } - - runDebouncedEffect(value: 1) - - XCTAssertEqual(values, []) - XCTAssertEqual(effectRuns, 0) - - scheduler.advance(by: .milliseconds(500)) - - XCTAssertEqual(values, []) - XCTAssertEqual(effectRuns, 0) - - scheduler.advance(by: .milliseconds(500)) - - XCTAssertEqual(values, [1]) - XCTAssertEqual(effectRuns, 1) - } -} diff --git a/RxComposableArchitectureTests/EffectDeferredTests.swift b/RxComposableArchitectureTests/EffectDeferredTests.swift deleted file mode 100644 index d9ba6f9..0000000 --- a/RxComposableArchitectureTests/EffectDeferredTests.swift +++ /dev/null @@ -1,91 +0,0 @@ -// -// EffectDeferredTests.swift -// RxComposableArchitectureTests -// -// Created by Wendy Liga on 18/06/21. -// - -import Foundation -import RxSwift -import TestSupport -import XCTest - -internal final class EffectDeferredTests: XCTestCase { - private let disposeBag = DisposeBag() - - internal func testDeferred() { - let scheduler = TestScheduler(initialClock: 0) - var values: [Int] = [] - - func runDeferredEffect(value: Int) { - Observable.just(value) - .eraseToEffect() - .deferred(for: .seconds(1), scheduler: scheduler) - .subscribe(onNext: { values.append($0) }) - .disposed(by: disposeBag) - } - - runDeferredEffect(value: 1) - - // Nothing emits right away. - XCTAssertEqual(values, []) - - // Waiting half the time also emits nothing - scheduler.advance(by: .milliseconds(500)) - XCTAssertEqual(values, []) - - // Run another deferred effect. - runDeferredEffect(value: 2) - - // Waiting half the time emits first deferred effect received. - scheduler.advance(by: .milliseconds(500)) - XCTAssertEqual(values, [1]) - - // Run another deferred effect. - runDeferredEffect(value: 3) - - // Waiting half the time emits second deferred effect received. - scheduler.advance(by: .milliseconds(500)) - XCTAssertEqual(values, [1, 2]) - - // Waiting the rest of the time emits the final effect value. - scheduler.advance(by: .milliseconds(500)) - XCTAssertEqual(values, [1, 2, 3]) - - // Running out the scheduler - scheduler.run() - XCTAssertEqual(values, [1, 2, 3]) - } - - internal func testDeferredIsLazy() { - let scheduler = TestScheduler(initialClock: 0) - var values: [Int] = [] - var effectRuns = 0 - - func runDeferredEffect(value: Int) { - Observable.deferred { () -> Observable in - effectRuns += 1 - return .just(value) - } - .eraseToEffect() - .deferred(for: .seconds(1), scheduler: scheduler) - .subscribe(onNext: { values.append($0) }) - .disposed(by: disposeBag) - } - - runDeferredEffect(value: 1) - - XCTAssertEqual(values, []) - XCTAssertEqual(effectRuns, 0) - - scheduler.advance(by: .milliseconds(500)) - - XCTAssertEqual(values, []) - XCTAssertEqual(effectRuns, 0) - - scheduler.advance(by: .milliseconds(500)) - - XCTAssertEqual(values, [1]) - XCTAssertEqual(effectRuns, 1) - } -} diff --git a/RxComposableArchitectureTests/EffectTests.swift b/RxComposableArchitectureTests/EffectTests.swift deleted file mode 100644 index 0a26962..0000000 --- a/RxComposableArchitectureTests/EffectTests.swift +++ /dev/null @@ -1,165 +0,0 @@ -// -// EffectTests.swift -// RxComposableArchitecture_RxComposableArchitectureTests -// -// Created by Jefferson Setiawan on 02/02/21. -// - -import RxSwift -import TestSupport -import XCTest - -@testable import RxComposableArchitecture - -internal final class EffectTests: XCTestCase { - private var disposeBag = DisposeBag() - private let scheduler = TestScheduler(initialClock: 0) - - internal func testConcatenate() { - var values: [Int] = [] - - let effect = Effect.concatenate( - Effect(value: 1).delay(.seconds(1), scheduler: scheduler).eraseToEffect(), - Effect(value: 2).delay(.seconds(2), scheduler: scheduler).eraseToEffect(), - Effect(value: 3).delay(.seconds(3), scheduler: scheduler).eraseToEffect() - ) - - effect - .subscribe(onNext: { values.append($0) }) - .disposed(by: disposeBag) - - XCTAssertEqual(values, []) - - scheduler.advance(by: .seconds(1)) - XCTAssertEqual(values, [1]) - - scheduler.advance(by: .seconds(2)) - XCTAssertEqual(values, [1, 2]) - - scheduler.advance(by: .seconds(3)) - XCTAssertEqual(values, [1, 2, 3]) - - scheduler.run() - XCTAssertEqual(values, [1, 2, 3]) - } - - internal func testConcatenateOneEffect() { - var values: [Int] = [] - - let effect = Effect.concatenate( - Effect(value: 1).delay(.seconds(1), scheduler: scheduler).eraseToEffect() - ) - - effect - .subscribe(onNext: { values.append($0) }) - .disposed(by: disposeBag) - - XCTAssertEqual(values, []) - - scheduler.advance(by: .seconds(1)) - XCTAssertEqual(values, [1]) - - scheduler.run() - XCTAssertEqual(values, [1]) - } - - internal func testMerge() { - let effect = Effect.merge( - Effect(value: 1).delay(.seconds(1), scheduler: scheduler).eraseToEffect(), - Effect(value: 2).delay(.seconds(2), scheduler: scheduler).eraseToEffect(), - Effect(value: 3).delay(.seconds(3), scheduler: scheduler).eraseToEffect() - ) - - var values: [Int] = [] - effect - .subscribe(onNext: { values.append($0) }) - .disposed(by: disposeBag) - - XCTAssertEqual(values, []) - - scheduler.advance(by: .seconds(1)) - XCTAssertEqual(values, [1]) - - scheduler.advance(by: .seconds(1)) - XCTAssertEqual(values, [1, 2]) - - scheduler.advance(by: .seconds(1)) - XCTAssertEqual(values, [1, 2, 3]) - } - - internal func testEffectSubscriberInitializer() { - let effect = Effect.run { subscriber in - subscriber.onNext(1) - subscriber.onNext(2) - - self.scheduler.scheduleRelative((), dueTime: .seconds(1)) { - subscriber.onNext(3) - return Disposables.create() - } - .disposed(by: self.disposeBag) - - self.scheduler.scheduleRelative((), dueTime: .seconds(2)) { - subscriber.onNext(4) - subscriber.onCompleted() - return Disposables.create() - } - .disposed(by: self.disposeBag) - - return Disposables.create() - } - - var values: [Int] = [] - var isComplete = false - effect - .subscribe(onNext: { values.append($0) }, onCompleted: { isComplete = true }) - .disposed(by: disposeBag) - - XCTAssertEqual(values, [1, 2]) - XCTAssertEqual(isComplete, false) - - scheduler.advance(by: .seconds(1)) - - XCTAssertEqual(values, [1, 2, 3]) - XCTAssertEqual(isComplete, false) - - scheduler.advance(by: .seconds(1)) - - XCTAssertEqual(values, [1, 2, 3, 4]) - XCTAssertEqual(isComplete, true) - } - - internal func testEffectSubscriberInitializer_WithCancellation() { - struct CancelId: Hashable {} - - let effect = Effect.run { subscriber in - subscriber.onNext(1) - - self.scheduler.scheduleRelative((), dueTime: .seconds(1)) { - subscriber.onNext(2) - return Disposables.create() - } - .disposed(by: self.disposeBag) - - return Disposables.create() - } - .cancellable(id: CancelId()) - - var values: [Int] = [] - var isComplete = false - effect - .subscribe(onNext: { values.append($0) }, onCompleted: { isComplete = true }) - .disposed(by: disposeBag) - - XCTAssertEqual(values, [1]) - XCTAssertEqual(isComplete, false) - - Effect.cancel(id: CancelId()) - .subscribe(onNext: {}) - .disposed(by: disposeBag) - - scheduler.advance(by: .seconds(1)) - - XCTAssertEqual(values, [1]) - XCTAssertEqual(isComplete, true) - } -} diff --git a/RxComposableArchitectureTests/IdentifiedArrayTests.swift b/RxComposableArchitectureTests/IdentifiedArrayTests.swift deleted file mode 100644 index e250db6..0000000 --- a/RxComposableArchitectureTests/IdentifiedArrayTests.swift +++ /dev/null @@ -1,191 +0,0 @@ -import XCTest - -@testable import RxComposableArchitecture - -internal final class IdentifiedArrayTests: XCTestCase { - internal func testIdSubscript() { - let array: IdentifiedArray = [User(id: 1, name: "Blob")] - - XCTAssertEqual(array[id: 1], .some(User(id: 1, name: "Blob"))) - } - - internal func testRemoveId() { - var array: IdentifiedArray = [User(id: 1, name: "Blob")] - - XCTAssertEqual(array.remove(id: 1), User(id: 1, name: "Blob")) - XCTAssertEqual(array, []) - } - - internal func testInsert() { - var array: IdentifiedArray = [User(id: 1, name: "Blob")] - - array.insert(User(id: 2, name: "Blob Jr."), at: 0) - XCTAssertEqual(array, [User(id: 2, name: "Blob Jr."), User(id: 1, name: "Blob")]) - } - - internal func testInsertContentsOf() { - var array: IdentifiedArray = [User(id: 1, name: "Blob")] - - array.insert(contentsOf: [User(id: 3, name: "Blob Sr."), User(id: 2, name: "Blob Jr.")], at: 0) - XCTAssertEqual( - array, - [User(id: 3, name: "Blob Sr."), User(id: 2, name: "Blob Jr."), User(id: 1, name: "Blob")] - ) - } - - internal func testRemoveAt() { - var array: IdentifiedArray = [ - User(id: 3, name: "Blob Sr."), - User(id: 2, name: "Blob Jr."), - User(id: 1, name: "Blob") - ] - - array.remove(at: 1) - XCTAssertEqual(array, [User(id: 3, name: "Blob Sr."), User(id: 1, name: "Blob")]) - } - - internal func testRemoveAllWhere() { - var array: IdentifiedArray = [ - User(id: 3, name: "Blob Sr."), - User(id: 2, name: "Blob Jr."), - User(id: 1, name: "Blob") - ] - - array.removeAll(where: { $0.name.starts(with: "Blob ") }) - XCTAssertEqual(array, [User(id: 1, name: "Blob")]) - } - - internal func testRemoveAtOffsets() { - var array: IdentifiedArray = [ - User(id: 3, name: "Blob Sr."), - User(id: 2, name: "Blob Jr."), - User(id: 1, name: "Blob") - ] - - array.remove(atOffsets: [0, 2]) - XCTAssertEqual(array, [User(id: 2, name: "Blob Jr.")]) - } - - internal func testReplaceSubrange() { - var array: IdentifiedArray = [ - User(id: 3, name: "Blob Sr."), - User(id: 2, name: "Blob Jr."), - User(id: 1, name: "Blob"), - User(id: 2, name: "Blob Jr.") - ] - - array.replaceSubrange( - 0 ... 1, - with: [ - User(id: 4, name: "Flob IV"), - User(id: 5, name: "Flob V") - ] - ) - - XCTAssertEqual( - array, - [ - User(id: 4, name: "Flob IV"), User(id: 5, name: "Flob V"), User(id: 1, name: "Blob"), - User(id: 2, name: "Blob Jr.") - ] - ) - } - - internal func testSortBy() { - var array: IdentifiedArray = [ - ComparableValue(id: 1, value: 100), - ComparableValue(id: 2, value: 50), - ComparableValue(id: 3, value: 75) - ] - - array.sort { $0.value < $1.value } - - XCTAssertEqual([2, 3, 1], array.ids) - XCTAssertEqual( - [ - ComparableValue(id: 2, value: 50), - ComparableValue(id: 3, value: 75), - ComparableValue(id: 1, value: 100) - ], array - ) - } - - internal func testSort() { - var array: IdentifiedArray = [ - ComparableValue(id: 1, value: 100), - ComparableValue(id: 2, value: 50), - ComparableValue(id: 3, value: 75) - ] - - array.sort() - - XCTAssertEqual([2, 3, 1], array.ids) - XCTAssertEqual( - [ - ComparableValue(id: 2, value: 50), - ComparableValue(id: 3, value: 75), - ComparableValue(id: 1, value: 100) - ], array - ) - } - - // Account for randomness API changes in Swift 5.3 (https://twitter.com/mbrandonw/status/1262388756847505410) - // TODO: Try swapping out the LCRNG for a Xoshiro generator - #if swift(>=5.3) - internal func testShuffle() { - var array: IdentifiedArray = [ - User(id: 1, name: "Blob"), - User(id: 2, name: "Blob Jr."), - User(id: 3, name: "Blob Sr."), - User(id: 4, name: "Foo Jr."), - User(id: 5, name: "Bar Jr.") - ] - var lcrng = LCRNG(seed: 0) - array.shuffle(using: &lcrng) - XCTAssertEqual( - [ - User(id: 1, name: "Blob"), - User(id: 3, name: "Blob Sr."), - User(id: 5, name: "Bar Jr."), - User(id: 4, name: "Foo Jr."), - User(id: 2, name: "Blob Jr.") - ], - array.elements - ) - XCTAssertEqual([1, 3, 5, 4, 2], array.ids) - } - #endif - - internal func testReverse() { - var array: IdentifiedArray = [ - ComparableValue(id: 1, value: 100), - ComparableValue(id: 2, value: 50), - ComparableValue(id: 3, value: 75) - ] - - array.reverse() - - XCTAssertEqual([3, 2, 1], array.ids) - XCTAssertEqual( - [ - ComparableValue(id: 3, value: 75), - ComparableValue(id: 2, value: 50), - ComparableValue(id: 1, value: 100) - ], array - ) - } -} - -internal struct User: Equatable, HashDiffable { - internal let id: Int - internal var name: String -} - -internal struct ComparableValue: Comparable, HashDiffable { - internal let id: Int - internal let value: Int - - internal static func < (lhs: ComparableValue, rhs: ComparableValue) -> Bool { - return lhs.value < rhs.value - } -} diff --git a/RxComposableArchitectureTests/LCRNG.swift b/RxComposableArchitectureTests/LCRNG.swift deleted file mode 100644 index da3d330..0000000 --- a/RxComposableArchitectureTests/LCRNG.swift +++ /dev/null @@ -1,15 +0,0 @@ -/// A linear congruential random number generator. -public struct LCRNG: RandomNumberGenerator { - public var seed: UInt64 - - @inlinable - public init(seed: UInt64) { - self.seed = seed - } - - @inlinable - public mutating func next() -> UInt64 { - seed = 2_862_933_555_777_941_757 &* seed &+ 3_037_000_493 - return seed - } -} diff --git a/RxComposableArchitectureTests/MemoryManagementTests.swift b/RxComposableArchitectureTests/MemoryManagementTests.swift deleted file mode 100644 index e1a9ee8..0000000 --- a/RxComposableArchitectureTests/MemoryManagementTests.swift +++ /dev/null @@ -1,26 +0,0 @@ -import Foundation -import RxComposableArchitecture -import RxSwift -import XCTest - -internal final class MemoryManagementTests: XCTestCase { - internal func testOwnership_ScopeHoldsOntoParent() { - let disposeBag = DisposeBag() - - let counterReducer = Reducer { state, _, _ in - state += 1 - return .none - } - let store = Store(initialState: 0, reducer: counterReducer, environment: ()) - .scope(state: { "\($0)" }) - .scope(state: { Int($0)! }) - - var count = 0 - - store.subscribe { $0 }.subscribe(onNext: { count = $0 }).disposed(by: disposeBag) - - XCTAssertEqual(count, 0) - store.send(()) - XCTAssertEqual(count, 1) - } -} diff --git a/RxComposableArchitectureTests/ReducerTests.swift b/RxComposableArchitectureTests/ReducerTests.swift deleted file mode 100644 index cefccc2..0000000 --- a/RxComposableArchitectureTests/ReducerTests.swift +++ /dev/null @@ -1,125 +0,0 @@ -import Foundation -import RxComposableArchitecture -import RxSwift -import TestSupport -import XCTest - -internal final class ReducerTests: XCTestCase { - internal func testCallableAsFunction() { - let reducer = Reducer { state, _, _ in - state += 1 - return .none - } - - var state = 0 - _ = reducer.run(&state, (), ()) - XCTAssertEqual(state, 1) - } - - internal func testCombine_EffectsAreMerged() { - typealias Scheduler = TestScheduler - enum Action: Equatable { - case increment - } - - var fastValue: Int? - let fastReducer = Reducer { state, _, scheduler in - state += 1 - return Effect.fireAndForget { fastValue = 42 } - .delay(.seconds(1), scheduler: scheduler) - .eraseToEffect() - } - - var slowValue: Int? - let slowReducer = Reducer { state, _, scheduler in - state += 1 - return Effect.fireAndForget { slowValue = 1729 } - .delay(.seconds(2), scheduler: scheduler) - .eraseToEffect() - } - - let scheduler = TestScheduler(initialClock: 0) - let store = TestStore( - initialState: 0, - reducer: .combine(fastReducer, slowReducer), - environment: scheduler - ) - - store.assert( - .send(.increment) { - $0 = 2 - }, - // Waiting a second causes the fast effect to fire. - .do { scheduler.advance(by: .seconds(1)) }, - .do { XCTAssertEqual(fastValue, 42) }, - // Waiting one more second causes the slow effect to fire. This proves that the effects - // are merged together, as opposed to concatenated. - .do { scheduler.advance(by: .seconds(1)) }, - .do { XCTAssertEqual(slowValue, 1729) } - ) - } - - internal func testCombine() { - enum Action: Equatable { - case increment - } - - var childEffectExecuted = false - let childReducer = Reducer { state, _, _ in - state += 1 - return Effect.fireAndForget { childEffectExecuted = true } - } - - var mainEffectExecuted = false - let mainReducer = Reducer { state, _, _ in - state += 1 - return Effect.fireAndForget { mainEffectExecuted = true } - } - .combined(with: childReducer) - - let store = TestStore( - initialState: 0, - reducer: mainReducer, - environment: () - ) - - store.assert( - .send(.increment) { - $0 = 2 - } - ) - - XCTAssertTrue(childEffectExecuted) - XCTAssertTrue(mainEffectExecuted) - } - - internal func testDefaultSignpost() { - let disposeBag = DisposeBag() - - let reducer = Reducer.empty.signpost(log: .default) - var n = 0 - - // swiftformat:disable:next redundantParens - let effect = reducer.run(&n, (), ()) - let expectation = self.expectation(description: "effect") - effect - .subscribe(onCompleted: { expectation.fulfill() }) - .disposed(by: disposeBag) - wait(for: [expectation], timeout: 0.1) - } - - internal func testDisabledSignpost() { - let disposeBag = DisposeBag() - - let reducer = Reducer.empty.signpost(log: .disabled) - var n = 0 - - // swiftformat:disable:next redundantParens - let effect = reducer.run(&n, (), ()) - let expectation = self.expectation(description: "effect") - effect - .subscribe(onCompleted: { expectation.fulfill() }) - .disposed(by: disposeBag) - wait(for: [expectation], timeout: 0.1) - } -} diff --git a/RxComposableArchitectureTests/RxComposableArchitectureTests.docc/RxComposableArchitectureTests.md b/RxComposableArchitectureTests/RxComposableArchitectureTests.docc/RxComposableArchitectureTests.md deleted file mode 100755 index 3105fd5..0000000 --- a/RxComposableArchitectureTests/RxComposableArchitectureTests.docc/RxComposableArchitectureTests.md +++ /dev/null @@ -1,13 +0,0 @@ -# ``RxComposableArchitectureTests`` - -Summary - -## Overview - -Text - -## Topics - -### Group - -- ``Symbol`` \ No newline at end of file diff --git a/RxComposableArchitectureTests/RxComposableArchitectureTests.h b/RxComposableArchitectureTests/RxComposableArchitectureTests.h deleted file mode 100644 index ac878d7..0000000 --- a/RxComposableArchitectureTests/RxComposableArchitectureTests.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// RxComposableArchitectureTests.h -// RxComposableArchitectureTests -// -// Created by Andrey Yoshua Manik on 21/02/22. -// - -#import - -//! Project version number for RxComposableArchitectureTests. -FOUNDATION_EXPORT double RxComposableArchitectureTestsVersionNumber; - -//! Project version string for RxComposableArchitectureTests. -FOUNDATION_EXPORT const unsigned char RxComposableArchitectureTestsVersionString[]; - -// In this header, you should import all the public headers of your framework using statements like #import - - diff --git a/RxComposableArchitectureTests/RxComposableArchitectureTests.swift b/RxComposableArchitectureTests/RxComposableArchitectureTests.swift deleted file mode 100644 index 32bd341..0000000 --- a/RxComposableArchitectureTests/RxComposableArchitectureTests.swift +++ /dev/null @@ -1,168 +0,0 @@ -// -// RxComposableArchitectureTests.swift -// RxComposableArchitectureTests -// -// Created by module_generator on 06/05/20. -// Copyright © 2020 module_generator. All rights reserved. -// - -import RxComposableArchitecture -import RxSwift -import TestSupport -import XCTest - -internal class RxComposableArchitectureTests: XCTestCase { - internal func testScheduling() { - enum CounterAction: Equatable { - case incrAndSquareLater - case incrNow - case squareNow - } - - let counterReducer = Reducer { - state, action, scheduler in - switch action { - case .incrAndSquareLater: - return .merge( - Effect(value: .incrNow) - .delay(.seconds(2), scheduler: scheduler) - .eraseToEffect(), - Effect(value: .squareNow) - .delay(.seconds(1), scheduler: scheduler) - .eraseToEffect(), - Effect(value: .squareNow) - .delay(.seconds(2), scheduler: scheduler) - .eraseToEffect() - ) - case .incrNow: - state += 1 - return .none - case .squareNow: - state *= state - return .none - } - } - - let scheduler = TestScheduler(initialClock: 0) - - let store = TestStore( - initialState: 2, - reducer: counterReducer, - environment: scheduler - ) - - store.assert( - .send(.incrAndSquareLater), - .do { scheduler.advance(by: .seconds(1)) }, - .receive(.squareNow) { $0 = 4 }, - .do { scheduler.advance(by: .seconds(1)) }, - .receive(.incrNow) { $0 = 5 }, - .receive(.squareNow) { $0 = 25 } - ) - - store.assert( - .send(.incrAndSquareLater), - .do { scheduler.advance(by: .seconds(2)) }, - .receive(.squareNow) { $0 = 625 }, - .receive(.incrNow) { $0 = 626 }, - .receive(.squareNow) { $0 = 391_876 } - ) - } - - internal func testLongLivingEffects() { - typealias Environment = ( - startEffect: Effect, - stopEffect: Effect - ) - - enum Action { case end, incr, start } - - let reducer = Reducer { state, action, environment in - switch action { - case .end: - return environment.stopEffect.fireAndForget() - case .incr: - state += 1 - return .none - case .start: - return environment.startEffect.map { Action.incr } - } - } - - let subject = PublishSubject() - - let store = TestStore( - initialState: 0, - reducer: reducer, - environment: ( - startEffect: subject.eraseToEffect(), - stopEffect: .fireAndForget { subject.onCompleted() } - ) - ) - - store.assert( - .send(.start), - .send(.incr) { $0 = 1 }, - .do { subject.onNext(()) }, - .receive(.incr) { $0 = 2 }, - .send(.end) - ) - } - - internal func testCancellation() { - enum Action: Equatable { - case cancel - case incr - case response(Int) - } - - struct Environment { - let fetch: (Int) -> Effect - let mainQueue: TestScheduler - } - - let reducer = Reducer { state, action, environment in - struct CancelId: Hashable {} - - switch action { - case .cancel: - return .cancel(id: CancelId()) - - case .incr: - state += 1 - return environment.fetch(state) - .observeOn(environment.mainQueue) - .map(Action.response) - .eraseToEffect() - .cancellable(id: CancelId()) - - case let .response(value): - state = value - return .none - } - } - - let scheduler = TestScheduler(initialClock: 0) - - let store = TestStore( - initialState: 0, - reducer: reducer, - environment: Environment( - fetch: { value in Effect(value: value * value) }, - mainQueue: scheduler - ) - ) - - store.assert( - .send(.incr) { $0 = 1 }, - .do { scheduler.advance(by: .milliseconds(1)) }, - .receive(.response(1)) { $0 = 1 } - ) - - store.assert( - .send(.incr) { $0 = 2 }, - .send(.cancel), - .do { scheduler.run() } - ) - } -} diff --git a/RxComposableArchitectureTests/SingleSelectionSelectableTypeTests.swift b/RxComposableArchitectureTests/SingleSelectionSelectableTypeTests.swift deleted file mode 100644 index 57acb72..0000000 --- a/RxComposableArchitectureTests/SingleSelectionSelectableTypeTests.swift +++ /dev/null @@ -1,104 +0,0 @@ -// -// SingleSelectionSelectableTypeTests.swift -// RxComposableArchitectureTests -// -// Created by Wendy Liga on 25/05/21. -// - -import RxComposableArchitecture -import XCTest - -internal final class SingleSelectionSelectableTypeTests: XCTestCase { - internal struct Item: HashDiffable, Equatable, Selectable { - internal let id: Int - internal var isSelected: Bool - } - - internal struct State { - @SingleSelection - internal var items: IdentifiedArrayOf - } - - internal func test_initNoSelection() { - let initialItems = IdentifiedArray([ - Item(id: 1, isSelected: false), - Item(id: 2, isSelected: false), - Item(id: 3, isSelected: false), - Item(id: 4, isSelected: false) - ]) - - let target = State(items: .init(initialItems)) - AssertSelection(target, selectionId: nil) - } - - internal func test_initWithSelection() { - let initialItems = IdentifiedArray([ - Item(id: 0, isSelected: true), - Item(id: 1, isSelected: false), - Item(id: 2, isSelected: false), - Item(id: 3, isSelected: false) - ]) - - let target = State(items: SingleSelection(initialItems)) - AssertSelection(target, selectionId: 0) - } - - internal func test_initWithMultipleSelection_shouldSelectTheFirstOne() { - let initialItems = IdentifiedArray([ - Item(id: 0, isSelected: false), - Item(id: 1, isSelected: true), - Item(id: 2, isSelected: true), - Item(id: 3, isSelected: true) - ]) - - let target = State(items: SingleSelection(initialItems)) - AssertSelection(target, selectionId: 1) - } - - internal func test_initWithSelection_thenChangeSelection() { - let initialItems = IdentifiedArray([ - Item(id: 0, isSelected: true), - Item(id: 1, isSelected: false), - Item(id: 2, isSelected: false), - Item(id: 3, isSelected: false) - ]) - - var target = State(items: SingleSelection(initialItems)) - - target.items[1].isSelected = true - AssertSelection(target, selectionId: 1) - } - - internal func test_initWithMultipleSelection_shouldSelectTheFirstOne_thenChangeSelectionSeveralTime() { - let initialItems = IdentifiedArray([ - Item(id: 0, isSelected: false), - Item(id: 1, isSelected: true), - Item(id: 2, isSelected: true), - Item(id: 3, isSelected: true) - ]) - - var target = State(items: SingleSelection(initialItems)) - target.items[2].isSelected = true - target.items[3].isSelected = true - AssertSelection(target, selectionId: 3) - } - - internal func AssertSelection( - _ state: State, - selectionId id: Int?, - file: StaticString = #file, - line: UInt = #line - ) { - let selected = state.items.filter(\.isSelected) - guard let id = id else { - XCTAssertTrue(selected.count == 0, file: file, line: line) - return - } - - guard let element = selected[id: id] else { - XCTFail("element is not valid", file: file, line: line); return - } - - XCTAssertTrue(selected.count == 1 && element.isSelected, file: file, line: line) - } -} diff --git a/RxComposableArchitectureTests/SingleSelectionTests.swift b/RxComposableArchitectureTests/SingleSelectionTests.swift deleted file mode 100644 index e890212..0000000 --- a/RxComposableArchitectureTests/SingleSelectionTests.swift +++ /dev/null @@ -1,104 +0,0 @@ -// -// SingleSelectionTests.swift -// RxComposableArchitectureTests -// -// Created by Wendy Liga on 25/05/21. -// - -import RxComposableArchitecture -import XCTest - -internal final class SingleSelectionTests: XCTestCase { - internal struct Item: HashDiffable, Equatable { - internal let id: Int - internal var isSelected: Bool - } - - internal struct State { - @SingleSelection([], selection: \.isSelected) - internal var items: IdentifiedArrayOf - } - - internal func test_initNoSelection() { - let initialItems = IdentifiedArray([ - Item(id: 1, isSelected: false), - Item(id: 2, isSelected: false), - Item(id: 3, isSelected: false), - Item(id: 4, isSelected: false) - ]) - - let target = State(items: SingleSelection(initialItems, selection: \.isSelected)) - AssertSelection(target, selectionId: nil) - } - - internal func test_initWithSelection() { - let initialItems = IdentifiedArray([ - Item(id: 0, isSelected: true), - Item(id: 1, isSelected: false), - Item(id: 2, isSelected: false), - Item(id: 3, isSelected: false) - ]) - - let target = State(items: SingleSelection(initialItems, selection: \.isSelected)) - AssertSelection(target, selectionId: 0) - } - - internal func test_initWithMultipleSelection_shouldSelectTheFirstOne() { - let initialItems = IdentifiedArray([ - Item(id: 0, isSelected: false), - Item(id: 1, isSelected: true), - Item(id: 2, isSelected: true), - Item(id: 3, isSelected: true) - ]) - - let target = State(items: SingleSelection(initialItems, selection: \.isSelected)) - AssertSelection(target, selectionId: 1) - } - - internal func test_initWithSelection_thenChangeSelection() { - let initialItems = IdentifiedArray([ - Item(id: 0, isSelected: true), - Item(id: 1, isSelected: false), - Item(id: 2, isSelected: false), - Item(id: 3, isSelected: false) - ]) - - var target = State(items: SingleSelection(initialItems, selection: \.isSelected)) - - target.items[1].isSelected = true - AssertSelection(target, selectionId: 1) - } - - internal func test_initWithMultipleSelection_shouldSelectTheFirstOne_thenChangeSelectionSeveralTime() { - let initialItems = IdentifiedArray([ - Item(id: 0, isSelected: false), - Item(id: 1, isSelected: true), - Item(id: 2, isSelected: true), - Item(id: 3, isSelected: true) - ]) - - var target = State(items: SingleSelection(initialItems, selection: \.isSelected)) - target.items[2].isSelected = true - target.items[3].isSelected = true - AssertSelection(target, selectionId: 3) - } - - internal func AssertSelection( - _ state: SingleSelectionTests.State, - selectionId id: Int?, - file: StaticString = #file, - line: UInt = #line - ) { - let selected = state.items.filter(\.isSelected) - guard let id = id else { - XCTAssertTrue(selected.count == 0, file: file, line: line) - return - } - - guard let element = selected[id: id] else { - XCTFail("element is not valid", file: file, line: line); return - } - - XCTAssertTrue(selected.count == 1 && element.isSelected, file: file, line: line) - } -} diff --git a/RxComposableArchitectureTests/StoreTests.swift b/RxComposableArchitectureTests/StoreTests.swift deleted file mode 100644 index ffe61a8..0000000 --- a/RxComposableArchitectureTests/StoreTests.swift +++ /dev/null @@ -1,395 +0,0 @@ -import RxSwift -import TestSupport -import XCTest - -@testable import RxComposableArchitecture - -internal final class StoreTests: XCTestCase { - private let disposeBag = DisposeBag() - - internal func testCancellableIsRemovedOnImmediatelyCompletingEffect() { - let reducer = Reducer { _, _, _ in .none } - let store = Store(initialState: (), reducer: reducer, environment: ()) - - XCTAssertEqual(store.effectDisposables.count, 0) - - store.send(()) - - XCTAssertEqual(store.effectDisposables.count, 0) - } - - internal func testCancellableIsRemovedWhenEffectCompletes() { - let scheduler = TestScheduler(initialClock: 0) - let effect = Effect(value: ()) - .delay(.seconds(1), scheduler: scheduler) - .eraseToEffect() - - enum Action { case start, end } - - let reducer = Reducer { _, action, _ in - switch action { - case .start: - return effect.map { .end } - case .end: - return .none - } - } - let store = Store(initialState: (), reducer: reducer, environment: ()) - - XCTAssertEqual(store.effectDisposables.count, 0) - - store.send(.start) - - XCTAssertEqual(store.effectDisposables.count, 1) - - scheduler.advance(by: .seconds(2)) - - XCTAssertEqual(store.effectDisposables.count, 0) - } - - internal func testScopedStoreReceivesUpdatesFromParent() { - let counterReducer = Reducer { state, _, _ in - state += 1 - return .none - } - - let parentStore = Store(initialState: 0, reducer: counterReducer, environment: ()) - let childStore = parentStore.scope(state: String.init) - - var values: [String] = [] - childStore.subscribe { $0 } - .subscribe(onNext: { values.append($0) }) - .disposed(by: disposeBag) - - XCTAssertEqual(values, ["0"]) - - parentStore.send(()) - - XCTAssertEqual(values, ["0", "1"]) - } - - internal func testParentStoreReceivesUpdatesFromChild() { - let counterReducer = Reducer { state, _, _ in - state += 1 - return .none - } - - let parentStore = Store(initialState: 0, reducer: counterReducer, environment: ()) - let childStore = parentStore.scope(state: String.init) - - var values: [Int] = [] - - parentStore.subscribe { $0 } - .subscribe(onNext: { values.append($0) }) - .disposed(by: disposeBag) - - XCTAssertEqual(values, [0]) - - childStore.send(()) - - XCTAssertEqual(values, [0, 1]) - } - - internal func testScopeWithPublisherTransform() { - let counterReducer = Reducer { state, action, _ in - state = action - return .none - } - let parentStore = Store(initialState: 0, reducer: counterReducer, environment: ()) - - var outputs: [String] = [] - - parentStore - .scope(state: { $0.map { "\($0)" }.distinctUntilChanged() }) - .subscribe(onNext: { childStore in - childStore.observable - .subscribe(onNext: { outputs.append($0) }) - .disposed(by: self.disposeBag) - }) - .disposed(by: disposeBag) - - parentStore.send(0) - XCTAssertEqual(outputs, ["0"]) - parentStore.send(0) - XCTAssertEqual(outputs, ["0"]) - parentStore.send(1) - XCTAssertEqual(outputs, ["0", "1"]) - parentStore.send(1) - XCTAssertEqual(outputs, ["0", "1"]) - parentStore.send(2) - XCTAssertEqual(outputs, ["0", "1", "2"]) - } - - internal func testScopeCallCount() { - let counterReducer = Reducer { state, _, _ in state += 1 - return .none - } - - var numCalls1 = 0 - _ = Store(initialState: 0, reducer: counterReducer, environment: ()) - .scope(state: { (count: Int) -> Int in - numCalls1 += 1 - return count - }) - - XCTAssertEqual(numCalls1, 2) - } - - internal func testScopeCallCount2() { - let counterReducer = Reducer { state, _, _ in - state += 1 - return .none - } - - var numCalls1 = 0 - var numCalls2 = 0 - var numCalls3 = 0 - - let store = Store(initialState: 0, reducer: counterReducer, environment: ()) - .scope(state: { (count: Int) -> Int in - numCalls1 += 1 - return count - }) - .scope(state: { (count: Int) -> Int in - numCalls2 += 1 - return count - }) - .scope(state: { (count: Int) -> Int in - numCalls3 += 1 - return count - }) - - XCTAssertEqual(numCalls1, 2) - XCTAssertEqual(numCalls2, 2) - XCTAssertEqual(numCalls3, 2) - - store.send(()) - - XCTAssertEqual(numCalls1, 4) - XCTAssertEqual(numCalls2, 5) - XCTAssertEqual(numCalls3, 6) - - store.send(()) - - XCTAssertEqual(numCalls1, 6) - XCTAssertEqual(numCalls2, 8) - XCTAssertEqual(numCalls3, 10) - - store.send(()) - - XCTAssertEqual(numCalls1, 8) - XCTAssertEqual(numCalls2, 11) - XCTAssertEqual(numCalls3, 14) - } - - internal func testSynchronousEffectsSentAfterSinking() { - enum Action { - case tap - case next1 - case next2 - case end - } - var values: [Int] = [] - let counterReducer = Reducer { _, action, _ in - switch action { - case .tap: - return .merge( - Effect(value: .next1), - Effect(value: .next2), - .fireAndForget { values.append(1) } - ) - case .next1: - return .merge( - Effect(value: .end), - .fireAndForget { values.append(2) } - ) - case .next2: - return .fireAndForget { values.append(3) } - case .end: - return .fireAndForget { values.append(4) } - } - } - - let store = Store(initialState: (), reducer: counterReducer, environment: ()) - - store.send(.tap) - - XCTAssertEqual(values, [1, 2, 3, 4]) - } - - internal func testLotsOfSynchronousActions() { - enum Action { case incr, noop } - let reducer = Reducer { state, action, _ in - switch action { - case .incr: - state += 1 - return state >= 10000 ? Effect(value: .noop) : Effect(value: .incr) - case .noop: - return .none - } - } - - let store = Store(initialState: 0, reducer: reducer, environment: ()) - store.send(.incr) - XCTAssertEqual(store.state, 10000) - } - - internal func testPublisherScope() { - let appReducer = Reducer { state, action, _ in - state += action ? 1 : 0 - return .none - } - - let parentStore = Store(initialState: 0, reducer: appReducer, environment: ()) - - var outputs: [Int] = [] - - parentStore - .scope(state: { $0.distinctUntilChanged() }) - .subscribe(onNext: { childStore in - childStore.observable - .subscribe(onNext: { outputs.append($0) }) - .disposed(by: self.disposeBag) - }) - .disposed(by: disposeBag) - - XCTAssertEqual(outputs, [0]) - - parentStore.send(true) - XCTAssertEqual(outputs, [0, 1]) - - parentStore.send(false) - XCTAssertEqual(outputs, [0, 1]) - parentStore.send(false) - XCTAssertEqual(outputs, [0, 1]) - parentStore.send(false) - XCTAssertEqual(outputs, [0, 1]) - parentStore.send(false) - XCTAssertEqual(outputs, [0, 1]) - } - - internal func testIfLetAfterScope() { - struct AppState { - var count: Int? - } - - let appReducer = Reducer { state, action, _ in - state.count = action - return .none - } - - let parentStore = Store(initialState: AppState(), reducer: appReducer, environment: ()) - - // NB: This test needs to hold a strong reference to the emitted stores - var outputs: [Int?] = [] - var stores: [Any] = [] - - parentStore - .scope(state: { $0.count }) - .ifLet( - then: { store in - stores.append(store) - outputs.append(store.state) - }, - else: { - outputs.append(nil) - } - ) - .disposed(by: disposeBag) - - XCTAssertEqual(outputs, [nil]) - - parentStore.send(1) - XCTAssertEqual(outputs, [nil, 1]) - - parentStore.send(nil) - XCTAssertEqual(outputs, [nil, 1, nil]) - - parentStore.send(1) - XCTAssertEqual(outputs, [nil, 1, nil, 1]) - - parentStore.send(nil) - XCTAssertEqual(outputs, [nil, 1, nil, 1, nil]) - - parentStore.send(1) - XCTAssertEqual(outputs, [nil, 1, nil, 1, nil, 1]) - - parentStore.send(nil) - XCTAssertEqual(outputs, [nil, 1, nil, 1, nil, 1, nil]) - } - - internal func testIfLetTwo() { - let parentStore = Store( - initialState: 0, - reducer: Reducer { state, action, _ in - if action { - state? += 1 - return .none - } else { - return Observable.just(true) - .observeOn(MainScheduler.instance) - .eraseToEffect() - } - }, - environment: () - ) - - parentStore.ifLet { childStore in - childStore - .observable - .subscribe() - .disposed(by: self.disposeBag) - - childStore.send(false) - _ = XCTWaiter.wait(for: [.init()], timeout: 0.1) - childStore.send(false) - _ = XCTWaiter.wait(for: [.init()], timeout: 0.1) - childStore.send(false) - _ = XCTWaiter.wait(for: [.init()], timeout: 0.1) - XCTAssertEqual(childStore.state, 3) - } - .disposed(by: disposeBag) - } - - internal func testActionQueuing() { - let subject = PublishSubject() - - enum Action: Equatable { - case incrementTapped - case initialize - case doIncrement - } - - let store = TestStore( - initialState: 0, - reducer: Reducer { state, action, _ in - switch action { - case .incrementTapped: - subject.onNext(()) - return .none - - case .initialize: - return subject.map { .doIncrement }.eraseToEffect() - - case .doIncrement: - state += 1 - return .none - } - }, - environment: () - ) - - store.assert( - .send(.initialize), - .send(.incrementTapped), - .receive(.doIncrement) { - $0 = 1 - }, - .send(.incrementTapped), - .receive(.doIncrement) { - $0 = 2 - }, - .do { subject.onCompleted() } - ) - } -} diff --git a/RxComposableArchitectureTests/TimerTests.swift b/RxComposableArchitectureTests/TimerTests.swift deleted file mode 100644 index 89b5311..0000000 --- a/RxComposableArchitectureTests/TimerTests.swift +++ /dev/null @@ -1,140 +0,0 @@ -// -// TimerTests.swift -// RxComposableArchitecture_RxComposableArchitectureTests -// -// Created by Jefferson Setiawan on 02/02/21. -// - -import RxComposableArchitecture -import RxSwift -import TestSupport -import XCTest - -internal final class TimerTests: XCTestCase { - private var disposeBag = DisposeBag() - - internal func testTimer() { - let scheduler = TestScheduler(initialClock: 0) - - var count = 0 - - Effect.timer(id: 1, every: .seconds(1), on: scheduler) - .subscribe(onNext: { _ in count += 1 }) - .disposed(by: disposeBag) - - scheduler.advance(by: .seconds(1)) - XCTAssertEqual(count, 1) - - scheduler.advance(by: .seconds(1)) - XCTAssertEqual(count, 2) - - scheduler.advance(by: .seconds(1)) - XCTAssertEqual(count, 3) - - scheduler.advance(by: .seconds(3)) - XCTAssertEqual(count, 6) - } - - internal func testInterleavingTimer() { - let scheduler = TestScheduler(initialClock: 0) - - var count2 = 0 - var count3 = 0 - - Effect.merge( - Effect.timer(id: 1, every: .seconds(2), on: scheduler) - .do(onNext: { _ in count2 += 1 }) - .eraseToEffect(), - Effect.timer(id: 2, every: .seconds(3), on: scheduler) - .do(onNext: { _ in count3 += 1 }) - .eraseToEffect() - ) - .subscribe(onNext: { _ in }) - .disposed(by: disposeBag) - - scheduler.advance(by: .seconds(1)) - XCTAssertEqual(count2, 0) - XCTAssertEqual(count3, 0) - scheduler.advance(by: .seconds(1)) - XCTAssertEqual(count2, 1) - XCTAssertEqual(count3, 0) - scheduler.advance(by: .seconds(1)) - XCTAssertEqual(count2, 1) - XCTAssertEqual(count3, 1) - scheduler.advance(by: .seconds(1)) - XCTAssertEqual(count2, 2) - XCTAssertEqual(count3, 1) - } - - internal func testTimerCancellation() { - let scheduler = TestScheduler(initialClock: 0) - - var count2 = 0 - var count3 = 0 - - struct CancelToken: Hashable {} - - Effect.merge( - Effect.timer(id: CancelToken(), every: .seconds(2), on: scheduler) - .do(onNext: { _ in count2 += 1 }) - .eraseToEffect(), - Effect.timer(id: CancelToken(), every: .seconds(3), on: scheduler) - .do(onNext: { _ in count3 += 1 }) - .eraseToEffect(), - Observable.just(()) - .delay(.seconds(31), scheduler: scheduler) - .flatMap { Effect.cancel(id: CancelToken()) } - .eraseToEffect() - ) - .subscribe(onNext: { _ in }) - .disposed(by: disposeBag) - - scheduler.advance(by: .seconds(1)) - - XCTAssertEqual(count2, 0) - XCTAssertEqual(count3, 0) - - scheduler.advance(by: .seconds(1)) - - XCTAssertEqual(count2, 1) - XCTAssertEqual(count3, 0) - - scheduler.advance(by: .seconds(1)) - - XCTAssertEqual(count2, 1) - XCTAssertEqual(count3, 1) - - scheduler.advance(by: .seconds(1)) - - XCTAssertEqual(count2, 2) - XCTAssertEqual(count3, 1) - - scheduler.run() - - XCTAssertEqual(count2, 15) - XCTAssertEqual(count3, 10) - } - - internal func testTimerCompletion() { - let scheduler = TestScheduler(initialClock: 0) - - var count = 0 - - Effect.timer(id: 1, every: .seconds(1), on: scheduler) - .take(3) - .subscribe(onNext: { _ in count += 1 }) - .disposed(by: disposeBag) - - scheduler.advance(by: .seconds(1)) - XCTAssertEqual(count, 1) - - scheduler.advance(by: .seconds(1)) - XCTAssertEqual(count, 2) - - scheduler.advance(by: .seconds(1)) - XCTAssertEqual(count, 3) - - scheduler.run() - XCTAssertEqual(count, 3) - } -} diff --git a/TestSupport/Annotating.swift b/TestSupport/Annotating.swift deleted file mode 100644 index a3b34f1..0000000 --- a/TestSupport/Annotating.swift +++ /dev/null @@ -1,71 +0,0 @@ -// -// Annotating.swift -// TestSupport -// -// Created by Wendy Liga on 24/09/20. -// - -#if DEBUG - import XCTest - - extension TestStore.Annotating { - public static var activity: Self { - Self { step, groupLevel, callback in - func runActivity(named name: String) { - #if BAZEL - callback { _ in } - /** - unit test on bazel doesn't support add custom activity - - Fatal error: XCTContext.runActivity(named:block:) failed because activities are disallowed in the current configuration.: file /Library/Caches/com.apple.xbs/Sources/XCTest_Sim/XCTest-16091.4/Sources/libXCTestSwiftSupport/XCTContext_SwiftExtensions.swift, line 23 - */ - return - #endif - - let indent = String(repeating: "\t", count: groupLevel) - - XCTContext.runActivity(named: "\(indent)\(name)") { _ in - callback { _ in } - } - } - - switch step.type { - case let .send(action, _): - runActivity(named: "send: \(action)") - case let .receive(action, _): - runActivity(named: "receive: \(action)") - case let .group(name, _): - runActivity(named: name) - default: - callback { _ in } - return - } - } - } - - public static var console: Self { - Self { step, groupLevel, callback in - func console(_ string: String) { - let indent = String(repeating: "\t", count: groupLevel) - print("\(indent)\(string)") - } - - switch step.type { - case let .send(action, _): - console("send: \(action)") - case let .receive(action, _): - console("receive: \(action)") - case let .group(name, _): - console("TestStore assert group: '\(name)' started at \(Date())") - default: - return - } - - callback { stepPassed in - console("\t [\(stepPassed ? "PASS" : "FAIL")]") - } - } - } - } - -#endif diff --git a/TestSupport/Export.swift b/TestSupport/Export.swift deleted file mode 100644 index af096b7..0000000 --- a/TestSupport/Export.swift +++ /dev/null @@ -1,2 +0,0 @@ -@_exported import DiffingTestSupport -@_exported import RxComposableArchitecture diff --git a/TestSupport/FailingEffect.swift b/TestSupport/FailingEffect.swift deleted file mode 100644 index 467fe89..0000000 --- a/TestSupport/FailingEffect.swift +++ /dev/null @@ -1,89 +0,0 @@ -// -// FailingEffect.swift -// RxComposableArchitecture_TestSupport -// -// Created by Jefferson Setiawan on 12/04/21. -// - -import RxComposableArchitecture -import XCTest - -extension Effect { - /// An effect that causes a test to fail if it runs. - /// - /// This effect can provide an additional layer of certainty that a tested code path does not - /// execute a particular effect. - /// - /// For example, let's say we have a very simple counter application, where a user can increment - /// and decrement a number. The state and actions are simple enough: - /// - /// struct CounterState: Equatable { - /// var count = 0 - /// } - /// - /// enum CounterAction: Equatable { - /// case decrementButtonTapped - /// case incrementButtonTapped - /// } - /// - /// Let's throw in a side effect. If the user attempts to decrement the counter below zero, the - /// application should refuse and play an alert sound instead. - /// - /// We can model playing a sound in the environment with an effect: - /// - /// struct CounterEnvironment { - /// let playAlertSound: () -> Effect - /// } - /// - /// Now that we've defined the domain, we can describe the logic in a reducer: - /// - /// let counterReducer = Reducer< - /// CounterState, CounterAction, CounterEnvironment - /// > { state, action, environment in - /// switch action { - /// case .decrementButtonTapped: - /// if state > 0 { - /// state.count -= 0 - /// return .none - /// } else { - /// return environment.playAlertSound() - /// .fireAndForget() - /// } - /// - /// case .incrementButtonTapped: - /// state.count += 1 - /// return .non - /// } - /// } - /// - /// Let's say we want to write a test for the increment path. We can see in the reducer that it - /// should never play an alert, so we can configure the environment with an effect that will - /// fail if it ever executes: - /// - /// func testIncrement() { - /// let store = TestStore( - /// initialState: CounterState(count: 0) - /// reducer: counterReducer, - /// environment: CounterEnvironment( - /// playSound: .failing("playSound") - /// ) - /// ) - /// - /// store.send(.increment) { - /// $0.count = 1 - /// } - /// } - /// - /// By using a `.failing` effect in our environment we have strengthened the assertion and made - /// the test easier to understand at the same time. We can see, without consulting the reducer - /// itself, that this particular action should not access this effect. - /// - /// - Parameter prefix: A string that identifies this scheduler and will prefix all failure - /// messages. - /// - Returns: An effect that causes a test to fail if it runs. - public static func failing(_ prefix: String) -> Effect { - .fireAndForget { - XCTFail("\(prefix.isEmpty ? "" : "\(prefix) - ")A failing effect ran.") - } - } -} diff --git a/TestSupport/Internal/PriorityQueue.swift b/TestSupport/Internal/PriorityQueue.swift deleted file mode 100644 index c0a1af0..0000000 --- a/TestSupport/Internal/PriorityQueue.swift +++ /dev/null @@ -1,107 +0,0 @@ -import Foundation - -// this is a copy pasted code, so don't wanna bother much with linting -// swiftlint:disable explicit_acl -struct PriorityQueue { - private let _hasHigherPriority: (Element, Element) -> Bool - private let _isEqual: (Element, Element) -> Bool - - private var _elements = [Element]() - - init(hasHigherPriority: @escaping (Element, Element) -> Bool, isEqual: @escaping (Element, Element) -> Bool) { - _hasHigherPriority = hasHigherPriority - _isEqual = isEqual - } - - mutating func enqueue(_ element: Element) { - _elements.append(element) - bubbleToHigherPriority(_elements.count - 1) - } - - func peek() -> Element? { - return _elements.first - } - - var isEmpty: Bool { - return _elements.count == 0 - } - - mutating func dequeue() -> Element? { - guard let front = peek() else { - return nil - } - - removeAt(0) - - return front - } - - mutating func remove(_ element: Element) { - for i in 0 ..< _elements.count { - if _isEqual(_elements[i], element) { - removeAt(i) - return - } - } - } - - private mutating func removeAt(_ index: Int) { - let removingLast = index == _elements.count - 1 - if !removingLast { - _elements.swapAt(index, _elements.count - 1) - } - - _ = _elements.popLast() - - if !removingLast { - bubbleToHigherPriority(index) - bubbleToLowerPriority(index) - } - } - - private mutating func bubbleToHigherPriority(_ initialUnbalancedIndex: Int) { - precondition(initialUnbalancedIndex >= 0) - precondition(initialUnbalancedIndex < _elements.count) - - var unbalancedIndex = initialUnbalancedIndex - - while unbalancedIndex > 0 { - let parentIndex = (unbalancedIndex - 1) / 2 - guard _hasHigherPriority(_elements[unbalancedIndex], _elements[parentIndex]) else { break } - _elements.swapAt(unbalancedIndex, parentIndex) - unbalancedIndex = parentIndex - } - } - - private mutating func bubbleToLowerPriority(_ initialUnbalancedIndex: Int) { - precondition(initialUnbalancedIndex >= 0) - precondition(initialUnbalancedIndex < _elements.count) - - var unbalancedIndex = initialUnbalancedIndex - while true { - let leftChildIndex = unbalancedIndex * 2 + 1 - let rightChildIndex = unbalancedIndex * 2 + 2 - - var highestPriorityIndex = unbalancedIndex - - if leftChildIndex < _elements.count, _hasHigherPriority(_elements[leftChildIndex], _elements[highestPriorityIndex]) { - highestPriorityIndex = leftChildIndex - } - - if rightChildIndex < _elements.count, _hasHigherPriority(_elements[rightChildIndex], _elements[highestPriorityIndex]) { - highestPriorityIndex = rightChildIndex - } - - guard highestPriorityIndex != unbalancedIndex else { break } - _elements.swapAt(highestPriorityIndex, unbalancedIndex) - - unbalancedIndex = highestPriorityIndex - } - } -} - -extension PriorityQueue: CustomDebugStringConvertible { - var debugDescription: String { - return _elements.debugDescription - } -} diff --git a/TestSupport/Internal/VirtualTimeScheduler.swift b/TestSupport/Internal/VirtualTimeScheduler.swift deleted file mode 100644 index 9ac4bcc..0000000 --- a/TestSupport/Internal/VirtualTimeScheduler.swift +++ /dev/null @@ -1,276 +0,0 @@ -import Foundation -import RxSwift - -// swiftlint:disable explicit_acl -// this is mostly a copy pasted code, so don't wanna bother much with linting -/// A modified version of RxSwift's VirtualTimeScheduler to support advancing by relative time -open class _VirtualTimeScheduler: - SchedulerType { - public typealias VirtualTime = Converter.VirtualTimeUnit - public typealias VirtualTimeInterval = Converter.VirtualTimeIntervalUnit - - private var _running: Bool - - private var _clock: VirtualTime - - fileprivate var _schedulerQueue: PriorityQueue> - private var _converter: Converter - - private var _nextId = 0 - - /// - returns: Current time. - public var now: RxTime { - return _converter.convertFromVirtualTime(clock) - } - - /// - returns: Scheduler's absolute time clock value. - public var clock: VirtualTime { - return _clock - } - - /// Creates a new virtual time scheduler. - /// - /// - parameter initialClock: Initial value for the clock. - public init(initialClock: VirtualTime, converter: Converter) { - _clock = initialClock - _running = false - _converter = converter - _schedulerQueue = PriorityQueue( - hasHigherPriority: { - switch converter.compareVirtualTime($0.time, $1.time) { - case .lessThan: - return true - case .equal: - return $0.id < $1.id - case .greaterThan: - return false - } - }, isEqual: { $0 === $1 } - ) - #if TRACE_RESOURCES - _ = Resources.incrementTotal() - #endif - } - - /** - Schedules an action to be executed immediately. - - parameter state: State passed to the action to be executed. - - parameter action: Action to be executed. - - returns: The disposable object used to cancel the scheduled action (best effort). - */ - public func schedule(_ state: StateType, action: @escaping (StateType) -> Disposable) - -> Disposable { - return scheduleRelative(state, dueTime: .nanoseconds(0)) { a in - action(a) - } - } - - /** - Schedules an action to be executed. - - parameter state: State passed to the action to be executed. - - parameter dueTime: Relative time after which to execute the action. - - parameter action: Action to be executed. - - returns: The disposable object used to cancel the scheduled action (best effort). - */ - public func scheduleRelative( - _ state: StateType, dueTime: RxTimeInterval, action: @escaping (StateType) -> Disposable - ) -> Disposable { - let time = now.addingTimeInterval(dueTime.convertToSecondsInterval) - let absoluteTime = _converter.convertToVirtualTime(time) - let adjustedTime = adjustScheduledTime(absoluteTime) - return scheduleAbsoluteVirtual(state, time: adjustedTime, action: action) - } - - /** - Schedules an action to be executed after relative time has passed. - - parameter state: State passed to the action to be executed. - - parameter time: Absolute time when to execute the action. If this is less or equal then `now`, `now + 1` will be used. - - parameter action: Action to be executed. - - returns: The disposable object used to cancel the scheduled action (best effort). - */ - public func scheduleRelativeVirtual( - _ state: StateType, dueTime: VirtualTimeInterval, action: @escaping (StateType) -> Disposable - ) -> Disposable { - let time = _converter.offsetVirtualTime(clock, offset: dueTime) - return scheduleAbsoluteVirtual(state, time: time, action: action) - } - - /** - Schedules an action to be executed at absolute virtual time. - - parameter state: State passed to the action to be executed. - - parameter time: Absolute time when to execute the action. - - parameter action: Action to be executed. - - returns: The disposable object used to cancel the scheduled action (best effort). - */ - public func scheduleAbsoluteVirtual( - _ state: StateType, time: Converter.VirtualTimeUnit, action: @escaping (StateType) -> Disposable - ) -> Disposable { - MainScheduler.ensureExecutingOnScheduler() - - let compositeDisposable = CompositeDisposable() - - let item = VirtualSchedulerItem( - action: { - let dispose = action(state) - return dispose - }, time: time, id: _nextId - ) - - _nextId += 1 - - _schedulerQueue.enqueue(item) - - _ = compositeDisposable.insert(item) - - return compositeDisposable - } - - /// Adjusts time of scheduling before adding item to schedule queue. - open func adjustScheduledTime(_ time: Converter.VirtualTimeUnit) -> Converter.VirtualTimeUnit { - return time - } - - /// Runs the scheduler until it has no scheduled items left. - public func run() { - MainScheduler.ensureExecutingOnScheduler() - - if _running { - return - } - - _running = true - repeat { - guard let next = findNext() else { - break - } - - if _converter.compareVirtualTime(next.time, clock).greaterThan { - _clock = next.time - } - - next.invoke() - _schedulerQueue.remove(next) - } while _running - - _running = false - } - - func findNext() -> VirtualSchedulerItem? { - while let front = _schedulerQueue.peek() { - if front.isDisposed { - _schedulerQueue.remove(front) - continue - } - - return front - } - - return nil - } - - /// Advances the scheduler's clock to the specified time, running all work till that point. - /// - /// - parameter virtualTime: Absolute time to advance the scheduler's clock to. - public func advance(to virtualTime: VirtualTime) { - MainScheduler.ensureExecutingOnScheduler() - - if _running { - fatalError("Scheduler is already running") - } - - _running = true - repeat { - guard let next = findNext() else { - break - } - - if _converter.compareVirtualTime(next.time, virtualTime).greaterThan { - break - } - - if _converter.compareVirtualTime(next.time, clock).greaterThan { - _clock = next.time - } - - next.invoke() - _schedulerQueue.remove(next) - } while _running - - _clock = virtualTime - _running = false - } - - public func advance(by virtualInterval: VirtualTimeInterval) { - let absoluteTime = _converter.offsetVirtualTime(clock, offset: virtualInterval) - - advance(to: absoluteTime) - } - - #if TRACE_RESOURCES - deinit { - _ = Resources.decrementTotal() - } - #endif -} - -// MARK: description - -extension _VirtualTimeScheduler: CustomDebugStringConvertible { - /// A textual representation of `self`, suitable for debugging. - public var debugDescription: String { - return _schedulerQueue.debugDescription - } -} - -final class VirtualSchedulerItem