├── .github ├── stale.yml └── workflows │ ├── create-release.yml │ └── pull_request.yml ├── .gitignore ├── .jazzy.yaml ├── .swiftformat ├── .swiftlint.yml ├── .swiftpm └── xcode │ └── package.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── .versionrc ├── Brewfile ├── CHANGELOG.md ├── Cartfile ├── Cartfile.private ├── Cartfile.resolved ├── Dangerfile ├── Gemfile ├── Gemfile.lock ├── LICENSE ├── LICENSE.md ├── Package.resolved ├── Package.swift ├── README.md ├── RxOptional.podspec ├── RxOptional.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcshareddata │ └── xcschemes │ ├── RxOptional iOS.xcscheme │ ├── RxOptional macOS.xcscheme │ ├── RxOptional tvOS.xcscheme │ └── RxOptional watchOS.xcscheme ├── RxOptionalExample.playground ├── Contents.swift └── contents.xcplayground ├── Sources └── RxOptional │ ├── Observable+Occupiable.swift │ ├── Observable+Optional.swift │ ├── Occupiable.swift │ ├── OptionalType.swift │ ├── RxOptionalError.swift │ ├── SharedSequence+Occupiable.swift │ ├── SharedSequence+Optional.swift │ └── Supporting Files │ ├── Info.plist │ └── RxOptional.h ├── Tests ├── LinuxMain.swift └── RxOptionalTests │ ├── OccupiableOperatorsTests.swift │ ├── OptionalOperatorsTests.swift │ └── XCTestManifests.swift ├── cleanup.sh ├── pods.sh ├── project-carthage.yml ├── project-spm.yml └── scripts ├── bump-version.sh ├── carthage.sh └── xcframeworks.sh /.github/stale.yml: -------------------------------------------------------------------------------- 1 | daysUntilStale: 60 2 | daysUntilClose: 7 3 | exemptLabels: 4 | - pinned 5 | - security 6 | staleLabel: stale 7 | markComment: > 8 | This issue has been automatically marked as stale because it has not had 9 | recent activity. It will be closed if no further activity occurs. 10 | closeComment: > 11 | This issue has been automatically closed due to an extensive period of inactivity. 12 | If you believe this was done in error, please comment and one of the contributors 13 | will decide on reopening this issue. 14 | 15 | -------------------------------------------------------------------------------- /.github/workflows/create-release.yml: -------------------------------------------------------------------------------- 1 | name: Create release 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | 7 | jobs: 8 | build: 9 | if: "!contains(github.event.head_commit.message, 'skip ci')" 10 | runs-on: macos-11.0 11 | 12 | steps: 13 | - uses: actions/checkout@v2 14 | with: 15 | fetch-depth: 0 16 | 17 | - name: Fetch all tags 18 | run: git fetch --depth=1 origin +refs/tags/*:refs/tags/* 19 | 20 | - name: Bump version 21 | run: | 22 | chmod +x ./scripts/bump-version.sh 23 | ./scripts/bump-version.sh 24 | 25 | # - name: Changelog 26 | # uses: scottbrenner/generate-changelog-action@master 27 | # id: Changelog 28 | # env: 29 | # REPO: ${{ github.repository }} 30 | 31 | - name: Push changes 32 | uses: ad-m/github-push-action@master 33 | with: 34 | github_token: ${{ secrets.GITHUB_TOKEN }} 35 | branch: ${{ github.ref }} 36 | 37 | - name: Restore SPM Cache 38 | uses: actions/cache@v1 39 | with: 40 | path: .build 41 | key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }} 42 | restore-keys: | 43 | ${{ runner.os }}-spm- 44 | 45 | - name: Resolve dependencies 46 | run: | 47 | brew bundle 48 | bundle 49 | 50 | - name: Release XCFrameworks 51 | run: | 52 | chmod +x ./scripts/xcframeworks.sh 53 | ./scripts/xcframeworks.sh 54 | 55 | - name: Create Release 56 | id: create_release 57 | uses: actions/create-release@v1 58 | env: 59 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 60 | with: 61 | tag_name: ${{ env.RELEASE_VERSION }} 62 | release_name: RxOptional ${{ env.RELEASE_VERSION }} 63 | # body: | 64 | # ${{ steps.Changelog.outputs.changelog }} 65 | draft: false 66 | prerelease: false 67 | 68 | - name: Upload XCFramework 69 | uses: actions/upload-release-asset@v1 70 | env: 71 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 72 | with: 73 | upload_url: ${{ steps.create_release.outputs.upload_url }} 74 | asset_path: ./RxOptional.xcframework.zip 75 | asset_name: RxOptional.xcframework.zip 76 | asset_content_type: application/zip 77 | 78 | - name: Deploy to Cocoapods 79 | run: | 80 | set -eo pipefail 81 | export RELEASE_VERSION="$(git describe --abbrev=0 | tr -d '\n')" 82 | RELEASE_VERSION=${RELEASE_VERSION:1} 83 | pod lib lint --allow-warnings 84 | pod trunk push --allow-warnings 85 | env: 86 | COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }} 87 | -------------------------------------------------------------------------------- /.github/workflows/pull_request.yml: -------------------------------------------------------------------------------- 1 | name: Lint, build and test 2 | 3 | on: 4 | pull_request: 5 | branches: [main] 6 | 7 | jobs: 8 | build: 9 | runs-on: macos-latest 10 | 11 | steps: 12 | - uses: actions/checkout@v2 13 | with: 14 | fetch-depth: 0 15 | 16 | - name: Fetch all tags 17 | run: git fetch --depth=1 origin +refs/tags/*:refs/tags/* 18 | 19 | - name: Resolve dependencies 20 | run: | 21 | brew bundle 22 | bundle 23 | 24 | - name: Danger 25 | run: | 26 | bundle exec danger 27 | env: 28 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 29 | 30 | - name: Restore SPM Cache 31 | uses: actions/cache@v1 32 | with: 33 | path: .build 34 | key: ${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }} 35 | restore-keys: | 36 | ${{ runner.os }}-spm- 37 | 38 | - name: Build and test (SPM) 39 | run: | 40 | swift build 41 | swift test 42 | 43 | - name: Build Cocoapods iOS Demo 44 | run: | 45 | set -eo pipefail 46 | cd Examples 47 | xcodegen 48 | pod install --repo-update 49 | xcodebuild build -scheme 'RxOptionalDemo-iOS' -workspace 'RxOptionalDemo.xcworkspace' -sdk iphonesimulator -destination "platform=iOS simulator,name=iPhone 11" 50 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 4 | 5 | ## Build generated 6 | build/ 7 | DerivedData 8 | 9 | ## Various settings 10 | *.pbxuser 11 | !default.pbxuser 12 | *.mode1v3 13 | !default.mode1v3 14 | *.mode2v3 15 | !default.mode2v3 16 | *.perspectivev3 17 | !default.perspectivev3 18 | xcuserdata 19 | *.swp 20 | 21 | ## Other 22 | *.xccheckout 23 | *.moved-aside 24 | *.xcuserstate 25 | *.xcscmblueprint 26 | 27 | ## Obj-C/Swift specific 28 | *.hmap 29 | *.ipa 30 | 31 | # CocoaPods 32 | # 33 | # We recommend against adding the Pods directory to your .gitignore. However 34 | # you should judge for yourself, the pros and cons are mentioned at: 35 | # http://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control 36 | # 37 | Pods/ 38 | 39 | # Carthage 40 | # 41 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 42 | Carthage/Checkouts 43 | Carthage/Build 44 | 45 | # Swift Package Manager 46 | .build 47 | Package.resolved 48 | 49 | .DS_Store 50 | **/.idea/** 51 | 52 | RxOptional-SPM.xcodeproj -------------------------------------------------------------------------------- /.jazzy.yaml: -------------------------------------------------------------------------------- 1 | output: ../docs/RxOptional 2 | module: RxOptional 3 | xcodebuild_arguments: 4 | - -scheme 5 | - RxOptional iOS -------------------------------------------------------------------------------- /.swiftformat: -------------------------------------------------------------------------------- 1 | --allman false 2 | --binarygrouping none 3 | --commas inline 4 | --comments ignore 5 | --decimalgrouping 3,6 6 | --elseposition same-line 7 | --empty void 8 | --exponentcase lowercase 9 | --exponentgrouping disabled 10 | --fractiongrouping disabled 11 | --disable blankLinesAroundMark 12 | --header ignore 13 | --hexgrouping 4,8 14 | --hexliteralcase uppercase 15 | --patternlet hoist 16 | --ifdef indent 17 | --indent 2 18 | --indentcase false 19 | --linebreaks lf 20 | --octalgrouping none 21 | --operatorfunc nospace 22 | --patternlet hoist 23 | --ranges nospace 24 | --self remove 25 | --semicolons inline 26 | --stripunusedargs closure-only 27 | --trimwhitespace always 28 | --wraparguments after-first 29 | --wrapcollections before-first 30 | --enable blankLinesBetweenScopes 31 | --enable redundantVoidReturnType 32 | --enable strongifiedSelf 33 | --enable trailingClosures 34 | --enable trailingSpace 35 | --enable typeSugar 36 | --enable spaceInsideParens 37 | --enable spaceInsideBrackets 38 | --enable spaceInsideBraces 39 | --enable spaceAroundOperators 40 | --enable spaceAroundBraces 41 | --enable redundantParens 42 | --enable redundantNilInit 43 | --enable consecutiveSpaces 44 | --enable anyObjectProtocol 45 | --disable isEmpty -------------------------------------------------------------------------------- /.swiftlint.yml: -------------------------------------------------------------------------------- 1 | disabled_rules: 2 | - trailing_whitespace 3 | - trailing_comma 4 | - large_tuple 5 | - nesting 6 | - todo 7 | - operator_whitespace 8 | - colon 9 | - identifier_name 10 | 11 | opt_in_rules: # some rules are only opt-in 12 | - empty_count 13 | - yoda_condition 14 | # Find all the available rules by running: 15 | # swiftlint rules 16 | 17 | included: 18 | - Sources 19 | - Tests 20 | - RxOptionalExample.playground 21 | 22 | # excluded: # paths to ignore during linting. Takes precedence over `included`. 23 | 24 | # configurable rules can be customized from this configuration file 25 | # binary rules can set their severity level 26 | force_cast: warning # implicitly 27 | force_try: 28 | severity: warning # explicitly 29 | # rules that have both warning and error levels, can set just the warning level 30 | # implicitly 31 | line_length: 180 32 | # they can set both implicitly with an array 33 | function_body_length: 120 34 | type_body_length: 35 | - 400 # warning 36 | - 500 # error 37 | # or they can set both explicitly 38 | file_length: 39 | warning: 500 40 | error: 1200 41 | # naming rules can set warnings/errors for min_length and max_length 42 | # additionally they can set excluded names 43 | generic_type_name: 44 | min_length: 1 # only warning 45 | max_length: 30 46 | 47 | type_name: 48 | min_length: 2 # only warning 49 | max_length: # warning and error 50 | warning: 100 51 | error: 120 52 | excluded: iPhone # excluded via string 53 | identifier_name: 54 | min_length: 55 | warning: 1 56 | reporter: "xcode" 57 | -------------------------------------------------------------------------------- /.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.versionrc: -------------------------------------------------------------------------------- 1 | { 2 | "releaseCommitMessageFormat": "chore(release): {{currentTag}} [skip ci]", 3 | "compareUrlFormat": "{{host}}/{{owner}}/{{repository}}/branches/compare/{{currentTag}}%0D{{previousTag}}", 4 | "commitUrlFormat": "{{host}}/{{owner}}/{{repository}}/commits/{{hash}}" 5 | } 6 | -------------------------------------------------------------------------------- /Brewfile: -------------------------------------------------------------------------------- 1 | brew "xcodegen" -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 4 | 5 | ### 5.0.6 (2024-10-06) 6 | 7 | There are no actual code changes to this release, we've only removed the original author's e-mail from the repo based on their request. (See #112) 8 | 9 | ### [5.0.5](https://github.com/RxSwiftCommunity/RxOptional/branches/compare/v5.0.5%0Dv5.0.4) (2022-04-14) 10 | 11 | ### [5.0.4](https://github.com/RxSwiftCommunity/RxOptional/branches/compare/v5.0.4%0Dv5.0.3) (2021-10-05) 12 | 13 | ### [5.0.3](https://github.com/RxSwiftCommunity/RxOptional/branches/compare/v5.0.3%0Dv5.0.2) (2021-05-04) 14 | 15 | ### [5.0.2](https://github.com/RxSwiftCommunity/RxOptional/branches/compare/v5.0.2%0Dv5.0.1) (2021-03-31) 16 | 17 | ### [5.0.1](https://github.com/RxSwiftCommunity/RxOptional/branches/compare/v5.0.1%0Dv5.0.0) (2021-02-03) 18 | 19 | ## 5.0.0 (2021-01-20) 20 | 21 | 22 | ### ⚠ BREAKING CHANGES 23 | 24 | * - Moved circleci to githubci 25 | - Supports RxSwift 6.0 26 | - Release xcframeworks 27 | 28 | ### Features 29 | 30 | * Restructure for better support and maintenance ([64eea0c](https://github.com/RxSwiftCommunity/RxOptional/commits/64eea0c51152d1dc89c076a6df133e2b0191f37b)) 31 | 32 | 33 | ### Bug Fixes 34 | 35 | * Actions to resolve dependencies before running ([f04fd38](https://github.com/RxSwiftCommunity/RxOptional/commits/f04fd38f67c529ab70da0e3802898e833129aaec)) 36 | * Bump version script ([a7a1c20](https://github.com/RxSwiftCommunity/RxOptional/commits/a7a1c20ec46104b10c8bd45767dc326b4a0b3405)) 37 | * Commit podspec version bump ([141cc95](https://github.com/RxSwiftCommunity/RxOptional/commits/141cc95fcebc5707c81419849b9c88cfb059aa4c)) 38 | * Reenable cleanup script ([c6c73f5](https://github.com/RxSwiftCommunity/RxOptional/commits/c6c73f53280c1f20d7a8415482f6de0d42fe2112)) 39 | * Remove unused step in action ([8566368](https://github.com/RxSwiftCommunity/RxOptional/commits/8566368791b701ce309249c9167011261a188558)) 40 | 41 | # 4.1.0 42 | 43 | - Add suport for Swift Package Manager 44 | 45 | # 4.0.0 46 | 47 | - Requires RxSwift 5 & Xcode 10.2. 48 | - Minimum iOS deployment target is iOS 9. 49 | - Update WatchOS deployment target to 3.0. 50 | 51 | # 3.6.2 52 | 53 | - Updates RxSwift version. 54 | 55 | # 3.6.0 56 | 57 | - Updated for Swift 4.2 and Xcode 10. 58 | 59 | # 3.5.0 60 | 61 | - Loosen generic constraints to work with any SharingStrategy, instead of just Driver. 62 | 63 | # 3.4.0 64 | 65 | - Swift 4.1 compatibility 66 | 67 | # 3.3.0 68 | 69 | - Upgrades to RxSwift 4.0. 70 | 71 | # 3.2.0 72 | 73 | - Adds `filterNilKeepOptional`. 74 | 75 | # 3.1.3 76 | 77 | - RxSwift 3.0.0 support for Carthage. 78 | 79 | # 3.1.2 80 | 81 | - RxSwift 3.0.0-rc.1 support for Carthage. 82 | 83 | # 3.1.1 84 | 85 | - Improved Carthage support. 86 | 87 | # 3.1.0 88 | 89 | - Migrated Driver extensions into SharedSequenceConvertibleType 90 | 91 | # 3.0.0 92 | 93 | - Swift 3 compatibility 94 | 95 | # 2.1.0 96 | 97 | - Add `distinctUntilChanged` operator 98 | 99 | # 2.0.0 100 | 101 | - **Breaking Change**: Remove `fatalErrorOn*` operators 102 | - **Breaking Change**: Remove guarantees from `catchOnEmpty` operators 103 | 104 | # 1.2.0 105 | 106 | - Add unit tests 107 | - Move to RxSwiftCommunity 108 | - Deprecate 'fatalErrorOn*' operators 109 | 110 | # 1.1.0 111 | 112 | - During release builds `fatalError` are logged 113 | - Use guards 114 | 115 | # 1.0.0 116 | 117 | - First public release 118 | - Add all documentation 119 | 120 | # 0.1.1 121 | 122 | - Initial release 123 | -------------------------------------------------------------------------------- /Cartfile: -------------------------------------------------------------------------------- 1 | github "ReactiveX/RxSwift" ~> 6.0 -------------------------------------------------------------------------------- /Cartfile.private: -------------------------------------------------------------------------------- 1 | github "Quick/Quick" ~> 3.0 2 | github "Quick/Nimble" ~> 9.0 3 | -------------------------------------------------------------------------------- /Cartfile.resolved: -------------------------------------------------------------------------------- 1 | github "Quick/Nimble" "v9.0.0" 2 | github "Quick/Quick" "v3.0.0" 3 | github "ReactiveX/RxSwift" "6.0.0" 4 | -------------------------------------------------------------------------------- /Dangerfile: -------------------------------------------------------------------------------- 1 | # Sometimes it's a README fix, or something like that - which isn't relevant for 2 | # including in a project's CHANGELOG for example 3 | declared_trivial = (github.pr_title + github.pr_body).include?("#trivial") 4 | 5 | # Make it more obvious that a PR is a work in progress and shouldn't be merged yet 6 | warn("PR is classed as Work in Progress") if github.pr_title.include? "[WIP]" 7 | 8 | # Warn summary on pull request 9 | if github.pr_body.length < 5 10 | warn "Please provide a summary in the Pull Request description" 11 | end 12 | 13 | # If these are all empty something has gone wrong, better to raise it in a comment 14 | if git.modified_files.empty? && git.added_files.empty? && git.deleted_files.empty? 15 | fail "This PR has no changes at all, this is likely a developer issue." 16 | end 17 | 18 | # Warn when there is a big PR 19 | message("Big PR") if git.lines_of_code > 500 20 | warn("Huge PR") if git.lines_of_code > 1000 21 | fail("Enormous PR. Please split this pull request.") if git.lines_of_code > 3000 22 | 23 | # Warn Cartfile changes 24 | message("Cartfile changed") if git.modified_files.include?("Cartfile") 25 | message("Cartfile.resolved changed") if git.modified_files.include?("Cartfile.resolved") 26 | 27 | # Lint 28 | swiftlint.lint_all_files = true 29 | swiftlint.max_num_violations = 20 30 | swiftlint.config_file = ".swiftlint.yml" 31 | swiftlint.lint_files fail_on_error: true 32 | 33 | # xcov.report( 34 | # scheme: "RxOptional iOS", 35 | # project: "RxOptional.xcodeproj", 36 | # include_targets: "RxOptional.framework", 37 | # minimum_coverage_percentage: 20.0, 38 | # derived_data_path: "Build/", 39 | # ) 40 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source 'https://rubygems.org' 2 | 3 | gem 'cocoapods', '~> 1.10' 4 | gem 'danger', '~> 8.0' 5 | gem 'danger-swiftlint', '~> 0.20' 6 | gem 'jazzy', '~> 0.13' -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | CFPropertyList (3.0.7) 5 | base64 6 | nkf 7 | rexml 8 | activesupport (7.2.2.1) 9 | base64 10 | benchmark (>= 0.3) 11 | bigdecimal 12 | concurrent-ruby (~> 1.0, >= 1.3.1) 13 | connection_pool (>= 2.2.5) 14 | drb 15 | i18n (>= 1.6, < 2) 16 | logger (>= 1.4.2) 17 | minitest (>= 5.1) 18 | securerandom (>= 0.3) 19 | tzinfo (~> 2.0, >= 2.0.5) 20 | addressable (2.8.7) 21 | public_suffix (>= 2.0.2, < 7.0) 22 | algoliasearch (1.27.5) 23 | httpclient (~> 2.8, >= 2.8.3) 24 | json (>= 1.5.1) 25 | atomos (0.1.3) 26 | base64 (0.2.0) 27 | benchmark (0.4.0) 28 | bigdecimal (3.1.9) 29 | claide (1.1.0) 30 | claide-plugins (0.9.2) 31 | cork 32 | nap 33 | open4 (~> 1.3) 34 | cocoapods (1.16.2) 35 | addressable (~> 2.8) 36 | claide (>= 1.0.2, < 2.0) 37 | cocoapods-core (= 1.16.2) 38 | cocoapods-deintegrate (>= 1.0.3, < 2.0) 39 | cocoapods-downloader (>= 2.1, < 3.0) 40 | cocoapods-plugins (>= 1.0.0, < 2.0) 41 | cocoapods-search (>= 1.0.0, < 2.0) 42 | cocoapods-trunk (>= 1.6.0, < 2.0) 43 | cocoapods-try (>= 1.1.0, < 2.0) 44 | colored2 (~> 3.1) 45 | escape (~> 0.0.4) 46 | fourflusher (>= 2.3.0, < 3.0) 47 | gh_inspector (~> 1.0) 48 | molinillo (~> 0.8.0) 49 | nap (~> 1.0) 50 | ruby-macho (>= 2.3.0, < 3.0) 51 | xcodeproj (>= 1.27.0, < 2.0) 52 | cocoapods-core (1.16.2) 53 | activesupport (>= 5.0, < 8) 54 | addressable (~> 2.8) 55 | algoliasearch (~> 1.0) 56 | concurrent-ruby (~> 1.1) 57 | fuzzy_match (~> 2.0.4) 58 | nap (~> 1.0) 59 | netrc (~> 0.11) 60 | public_suffix (~> 4.0) 61 | typhoeus (~> 1.0) 62 | cocoapods-deintegrate (1.0.5) 63 | cocoapods-downloader (2.1) 64 | cocoapods-plugins (1.0.0) 65 | nap 66 | cocoapods-search (1.0.1) 67 | cocoapods-trunk (1.6.0) 68 | nap (>= 0.8, < 2.0) 69 | netrc (~> 0.11) 70 | cocoapods-try (1.2.0) 71 | colored2 (3.1.2) 72 | concurrent-ruby (1.3.4) 73 | connection_pool (2.4.1) 74 | cork (0.3.0) 75 | colored2 (~> 3.1) 76 | danger (8.6.1) 77 | claide (~> 1.0) 78 | claide-plugins (>= 0.9.2) 79 | colored2 (~> 3.1) 80 | cork (~> 0.1) 81 | faraday (>= 0.9.0, < 2.0) 82 | faraday-http-cache (~> 2.0) 83 | git (~> 1.7) 84 | kramdown (~> 2.3) 85 | kramdown-parser-gfm (~> 1.0) 86 | no_proxy_fix 87 | octokit (~> 4.7) 88 | terminal-table (>= 1, < 4) 89 | danger-swiftlint (0.37.0) 90 | danger 91 | rake (> 10) 92 | thor (~> 1.0.0) 93 | drb (2.2.1) 94 | escape (0.0.4) 95 | ethon (0.16.0) 96 | ffi (>= 1.15.0) 97 | faraday (1.10.4) 98 | faraday-em_http (~> 1.0) 99 | faraday-em_synchrony (~> 1.0) 100 | faraday-excon (~> 1.1) 101 | faraday-httpclient (~> 1.0) 102 | faraday-multipart (~> 1.0) 103 | faraday-net_http (~> 1.0) 104 | faraday-net_http_persistent (~> 1.0) 105 | faraday-patron (~> 1.0) 106 | faraday-rack (~> 1.0) 107 | faraday-retry (~> 1.0) 108 | ruby2_keywords (>= 0.0.4) 109 | faraday-em_http (1.0.0) 110 | faraday-em_synchrony (1.0.0) 111 | faraday-excon (1.1.0) 112 | faraday-http-cache (2.5.1) 113 | faraday (>= 0.8) 114 | faraday-httpclient (1.0.1) 115 | faraday-multipart (1.1.0) 116 | multipart-post (~> 2.0) 117 | faraday-net_http (1.0.2) 118 | faraday-net_http_persistent (1.2.0) 119 | faraday-patron (1.0.0) 120 | faraday-rack (1.0.0) 121 | faraday-retry (1.0.3) 122 | ffi (1.17.1) 123 | ffi (1.17.1-x86_64-darwin) 124 | fourflusher (2.3.1) 125 | fuzzy_match (2.0.4) 126 | gh_inspector (1.1.3) 127 | git (1.19.1) 128 | addressable (~> 2.8) 129 | rchardet (~> 1.8) 130 | httpclient (2.8.3) 131 | i18n (1.14.6) 132 | concurrent-ruby (~> 1.0) 133 | jazzy (0.15.3) 134 | cocoapods (~> 1.5) 135 | mustache (~> 1.1) 136 | open4 (~> 1.3) 137 | redcarpet (~> 3.4) 138 | rexml (>= 3.2.7, < 4.0) 139 | rouge (>= 2.0.6, < 5.0) 140 | sassc (~> 2.1) 141 | sqlite3 (~> 1.3) 142 | xcinvoke (~> 0.3.0) 143 | json (2.9.1) 144 | kramdown (2.5.1) 145 | rexml (>= 3.3.9) 146 | kramdown-parser-gfm (1.1.0) 147 | kramdown (~> 2.0) 148 | liferaft (0.0.6) 149 | logger (1.6.4) 150 | mini_portile2 (2.8.8) 151 | minitest (5.25.4) 152 | molinillo (0.8.0) 153 | multipart-post (2.4.1) 154 | mustache (1.1.1) 155 | nanaimo (0.4.0) 156 | nap (1.1.0) 157 | netrc (0.11.0) 158 | nkf (0.2.0) 159 | no_proxy_fix (0.1.2) 160 | octokit (4.25.1) 161 | faraday (>= 1, < 3) 162 | sawyer (~> 0.9) 163 | open4 (1.3.4) 164 | public_suffix (4.0.7) 165 | rake (13.2.1) 166 | rchardet (1.9.0) 167 | redcarpet (3.6.0) 168 | rexml (3.4.0) 169 | rouge (4.5.1) 170 | ruby-macho (2.5.1) 171 | ruby2_keywords (0.0.5) 172 | sassc (2.4.0) 173 | ffi (~> 1.9) 174 | sawyer (0.9.2) 175 | addressable (>= 2.3.5) 176 | faraday (>= 0.17.3, < 3) 177 | securerandom (0.4.1) 178 | sqlite3 (1.7.3) 179 | mini_portile2 (~> 2.8.0) 180 | sqlite3 (1.7.3-x86_64-darwin) 181 | terminal-table (3.0.2) 182 | unicode-display_width (>= 1.1.1, < 3) 183 | thor (1.0.1) 184 | typhoeus (1.4.1) 185 | ethon (>= 0.9.0) 186 | tzinfo (2.0.6) 187 | concurrent-ruby (~> 1.0) 188 | unicode-display_width (2.6.0) 189 | xcinvoke (0.3.0) 190 | liferaft (~> 0.0.6) 191 | xcodeproj (1.27.0) 192 | CFPropertyList (>= 2.3.3, < 4.0) 193 | atomos (~> 0.1.3) 194 | claide (>= 1.0.2, < 2.0) 195 | colored2 (~> 3.1) 196 | nanaimo (~> 0.4.0) 197 | rexml (>= 3.3.6, < 4.0) 198 | 199 | PLATFORMS 200 | ruby 201 | x86_64-darwin-20 202 | 203 | DEPENDENCIES 204 | cocoapods (~> 1.10) 205 | danger (~> 8.0) 206 | danger-swiftlint (~> 0.20) 207 | jazzy (~> 0.13) 208 | 209 | BUNDLED WITH 210 | 2.5.22 211 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2016 Thane Gill 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Thane Gill 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /Package.resolved: -------------------------------------------------------------------------------- 1 | { 2 | "object": { 3 | "pins": [ 4 | { 5 | "package": "CwlCatchException", 6 | "repositoryURL": "https://github.com/mattgallagher/CwlCatchException.git", 7 | "state": { 8 | "branch": null, 9 | "revision": "f809deb30dc5c9d9b78c872e553261a61177721a", 10 | "version": "2.0.0" 11 | } 12 | }, 13 | { 14 | "package": "CwlPreconditionTesting", 15 | "repositoryURL": "https://github.com/mattgallagher/CwlPreconditionTesting.git", 16 | "state": { 17 | "branch": null, 18 | "revision": "02b7a39a99c4da27abe03cab2053a9034379639f", 19 | "version": "2.0.0" 20 | } 21 | }, 22 | { 23 | "package": "Nimble", 24 | "repositoryURL": "https://github.com/Quick/Nimble.git", 25 | "state": { 26 | "branch": null, 27 | "revision": "e491a6731307bb23783bf664d003be9b2fa59ab5", 28 | "version": "9.0.0" 29 | } 30 | }, 31 | { 32 | "package": "Quick", 33 | "repositoryURL": "https://github.com/Quick/Quick.git", 34 | "state": { 35 | "branch": null, 36 | "revision": "0038bcbab4292f3b028632556507c124e5ba69f3", 37 | "version": "3.0.0" 38 | } 39 | }, 40 | { 41 | "package": "RxSwift", 42 | "repositoryURL": "https://github.com/ReactiveX/RxSwift.git", 43 | "state": { 44 | "branch": null, 45 | "revision": "c8742ed97fc2f0c015a5ea5eddefb064cd7532d2", 46 | "version": "6.0.0" 47 | } 48 | } 49 | ] 50 | }, 51 | "version": 1 52 | } 53 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.2 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package(name: "RxOptional", 7 | platforms: [ 8 | .macOS(.v10_10), .iOS(.v9), .tvOS(.v9), .watchOS(.v3) 9 | ], 10 | products: [ 11 | // Products define the executables and libraries produced by a package, and make them visible to other packages. 12 | .library(name: "RxOptional", 13 | targets: ["RxOptional"]) 14 | ], 15 | 16 | dependencies: [ 17 | // Dependencies declare other packages that this package depends on. 18 | // Dependencies declare other packages that this package depends on. 19 | .package(url: "https://github.com/ReactiveX/RxSwift.git", .upToNextMajor(from: "6.0.0")), 20 | // Development 21 | .package(url: "https://github.com/Quick/Quick.git", .upToNextMajor(from: "3.0.0")), // dev 22 | .package(url: "https://github.com/Quick/Nimble.git", .upToNextMajor(from: "9.0.0")) // dev 23 | ], 24 | 25 | targets: [ 26 | // Targets are the basic building blocks of a package. A target can define a module or a test suite. 27 | // Targets can depend on other targets in this package, and on products in packages which this package depends on. 28 | .target(name: "RxOptional", dependencies: [ 29 | .product(name: "RxSwift", package: "RxSwift"), 30 | .product(name: "RxCocoa", package: "RxSwift") 31 | ], 32 | path: "Sources"), 33 | .testTarget(name: "RxOptionalTests", dependencies: ["RxOptional", "Quick", "Nimble"]) // dev 34 | ], 35 | swiftLanguageVersions: [.v5]) 36 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RxOptional 2 | 3 | [![CircleCI](https://img.shields.io/circleci/project/github/RxSwiftCommunity/RxOptional/master.svg)](https://circleci.com/gh/RxSwiftCommunity/RxOptional/tree/master) 4 | [![Version](https://img.shields.io/cocoapods/v/RxOptional.svg?style=flat)](http://cocoapods.org/pods/RxOptional) 5 | [![License](https://img.shields.io/cocoapods/l/RxOptional.svg?style=flat)](http://cocoapods.org/pods/RxOptional) 6 | [![Platform](https://img.shields.io/cocoapods/p/RxOptional.svg?style=flat)](http://cocoapods.org/pods/RxOptional) 7 | 8 | RxSwift extensions for Swift optionals and "Occupiable" types. 9 | 10 | ## Usage 11 | 12 | All operators are also available on `Driver` and `Signal`, unless otherwise noted. 13 | 14 | ### Optional Operators 15 | 16 | ##### filterNil 17 | 18 | ```swift 19 | Observable 20 | .of("One", nil, "Three") 21 | .filterNil() 22 | // Type is now Observable 23 | .subscribe { print($0) } 24 | ``` 25 | 26 | ```text 27 | next(One) 28 | next(Three) 29 | completed 30 | ``` 31 | 32 | ##### replaceNilWith 33 | 34 | ```swift 35 | Observable 36 | .of("One", nil, "Three") 37 | .replaceNilWith("Two") 38 | // Type is now Observable 39 | .subscribe { print($0) } 40 | ``` 41 | 42 | ```text 43 | next(One) 44 | next(Two) 45 | next(Three) 46 | completed 47 | ``` 48 | 49 | ##### errorOnNil 50 | 51 | Unavailable on `Driver`, because `Driver`s cannot error out. 52 | 53 | By default errors with `RxOptionalError.foundNilWhileUnwrappingOptional`. 54 | 55 | ```swift 56 | Observable 57 | .of("One", nil, "Three") 58 | .errorOnNil() 59 | // Type is now Observable 60 | .subscribe { print($0) } 61 | ``` 62 | 63 | ```text 64 | next(One) 65 | error(Found nil while trying to unwrap type >) 66 | ``` 67 | 68 | ##### catchOnNil 69 | 70 | ```swift 71 | Observable 72 | .of("One", nil, "Three") 73 | .catchOnNil { 74 | return Observable.just("A String from a new Observable") 75 | } 76 | // Type is now Observable 77 | .subscribe { print($0) } 78 | ``` 79 | 80 | ```text 81 | next(One) 82 | next(A String from a new Observable) 83 | next(Three) 84 | completed 85 | ``` 86 | 87 | ##### distinctUntilChanged 88 | 89 | ```swift 90 | Observable 91 | .of(5, 6, 6, nil, nil, 3) 92 | .distinctUntilChanged() 93 | .subscribe { print($0) } 94 | ``` 95 | 96 | ```text 97 | next(Optional(5)) 98 | next(Optional(6)) 99 | next(nil) 100 | next(Optional(3)) 101 | completed 102 | ``` 103 | 104 | ### Occupiable Operators 105 | 106 | Occupiables are: 107 | 108 | - `String` 109 | - `Array` 110 | - `Dictionary` 111 | - `Set` 112 | 113 | Currently in Swift protocols cannot be extended to conform to other protocols. 114 | For now the types listed above conform to `Occupiable`. You can also conform 115 | custom types to `Occupiable`. 116 | 117 | ##### filterEmpty 118 | 119 | ```swift 120 | Observable<[String]> 121 | .of(["Single Element"], [], ["Two", "Elements"]) 122 | .filterEmpty() 123 | .subscribe { print($0) } 124 | ``` 125 | 126 | ```text 127 | next(["Single Element"]) 128 | next(["Two", "Elements"]) 129 | completed 130 | ``` 131 | 132 | ##### errorOnEmpty 133 | 134 | Unavailable on `Driver`, because `Driver`s cannot error out. 135 | 136 | By default errors with `RxOptionalError.emptyOccupiable`. 137 | 138 | ```swift 139 | Observable<[String]> 140 | .of(["Single Element"], [], ["Two", "Elements"]) 141 | .errorOnEmpty() 142 | .subscribe { print($0) } 143 | ``` 144 | 145 | ```text 146 | next(["Single Element"]) 147 | error(Empty occupiable of type >) 148 | ``` 149 | 150 | ##### catchOnEmpty 151 | 152 | ```swift 153 | Observable<[String]> 154 | .of(["Single Element"], [], ["Two", "Elements"]) 155 | .catchOnEmpty { 156 | return Observable<[String]>.just(["Not Empty"]) 157 | } 158 | .subscribe { print($0) } 159 | ``` 160 | 161 | ```text 162 | next(["Single Element"]) 163 | next(["Not Empty"]) 164 | next(["Two", "Elements"]) 165 | completed 166 | ``` 167 | 168 | ## Running Examples.playground 169 | 170 | - Run `pod install` in Example directory 171 | - Select RxOptional Examples target 172 | - Build 173 | - Show Debug Area (cmd+shift+Y) 174 | - Click blue play button in Debug Area 175 | 176 | ## Requirements 177 | 178 | - [RxSwift](https://github.com/ReactiveX/RxSwift) 179 | - [RxCocoa](https://github.com/ReactiveX/RxSwift) 180 | 181 | ## Installation 182 | 183 | ### [CocoaPods](https://guides.cocoapods.org/using/using-cocoapods.html) 184 | 185 | RxOptional is available through [CocoaPods](http://cocoapods.org). To install 186 | it, simply add the following line to your Podfile: 187 | 188 | ```ruby 189 | pod 'RxOptional' 190 | ``` 191 | 192 | ### [Carthage](https://github.com/Carthage/Carthage) 193 | 194 | Add this to `Cartfile` 195 | 196 | ``` 197 | github "RxSwiftCommunity/RxOptional" ~> 4.1.0 198 | ``` 199 | 200 | ``` 201 | $ carthage update 202 | ``` 203 | 204 | ### [Swift Package Manager](https://swift.org/package-manager) 205 | 206 | To use RxOptional as a Swift Package Manager package just add the following in your Package.swift file. 207 | 208 | ```swift 209 | import PackageDescription 210 | 211 | let package = Package( 212 | name: "ProjectName", 213 | dependencies: [ 214 | .Package(url: "https://github.com/RxSwiftCommunity/RxOptional") 215 | ] 216 | ) 217 | ``` 218 | 219 | ## Author 220 | 221 | Thane Gill 222 | 223 | ## License 224 | 225 | RxOptional is available under the MIT license. See the LICENSE file for more info. 226 | -------------------------------------------------------------------------------- /RxOptional.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "RxOptional" 3 | # Version to always follow latest tag, with fallback to major 4 | s.version = "5.0.6" 5 | s.license = "MIT" 6 | s.summary = "RxSwift extensions for Swift optionals and Occupiable types" 7 | 8 | s.description = <<-DESC 9 | RxSwift extensions for Swift optionals and "Occupiable" types. 10 | DESC 11 | 12 | s.homepage = "https://github.com/RxSwiftCommunity/RxOptional" 13 | s.authors = { "RxSwift Community" => "community@rxswift.org" } 14 | s.source = { :git => "https://github.com/RxSwiftCommunity/RxOptional.git", :tag => "v" + s.version.to_s } 15 | s.swift_version = "5.1" 16 | 17 | s.ios.deployment_target = "11.0" 18 | s.osx.deployment_target = "12.3" 19 | s.watchos.deployment_target = "4.0" 20 | s.tvos.deployment_target = "11.0" 21 | 22 | s.source_files = "Sources/RxOptional/*.swift" 23 | s.requires_arc = true 24 | 25 | s.frameworks = "Foundation" 26 | s.dependency "RxSwift", "~> 6.0" 27 | s.dependency "RxCocoa", "~> 6.0" 28 | end 29 | -------------------------------------------------------------------------------- /RxOptional.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 51; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 000BD50B0AFF467055827627 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FAFC6873E87A10E0976D0F20 /* Nimble.framework */; }; 11 | 0189A1BB9E6304AB13BBBA1C /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0CC12B5EDFAD80CA7AF60F84 /* Nimble.framework */; }; 12 | 01CB35237B6DA8AC2A530FBA /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2247F253B77B2C7B7C7F4949 /* Quick.framework */; }; 13 | 044AA0C99D8038E868604877 /* Observable+Optional.swift in Sources */ = {isa = PBXBuildFile; fileRef = A125E26BDF738D2B2A6202BF /* Observable+Optional.swift */; }; 14 | 05DA8BB8CFA7523A3B249052 /* XCTestManifests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44FC88FFB2CC39892B4EFD32 /* XCTestManifests.swift */; }; 15 | 064E3E76C201985F40B83D65 /* Quick.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E92F0264BAC6136A79209222 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 16 | 13C697CE2CCBFACBD5531B70 /* Nimble.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = FAFC6873E87A10E0976D0F20 /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 17 | 1764F95CDAB104376D26B7DA /* OptionalType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 858209A38226FACEC8E72F01 /* OptionalType.swift */; }; 18 | 187FCFE934CFB364A6764F00 /* Observable+Optional.swift in Sources */ = {isa = PBXBuildFile; fileRef = A125E26BDF738D2B2A6202BF /* Observable+Optional.swift */; }; 19 | 20651DBEE76021407BCA7E3E /* Occupiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E97AA2CD3DD0D0D830C0E1A /* Occupiable.swift */; }; 20 | 2635596B686B33DEDFE43B3D /* RxSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D1C8DB5DCD91AEE9C8A3F780 /* RxSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 21 | 2C6B194C98F945DC149AB54B /* RxOptionalError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81A42060607D345E90B247A9 /* RxOptionalError.swift */; }; 22 | 2CA52F2500F5477E34EBC755 /* RxOptional macOS.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DA2BA7EDA36C2F7998475CF0 /* RxOptional macOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 23 | 2FA140723E1385B282D4D7A9 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 732FC3AC808B5B9617EEC7CE /* Quick.framework */; }; 24 | 30A311DA190F3D0B9C954F71 /* Nimble.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0CC12B5EDFAD80CA7AF60F84 /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 25 | 396A8FB2561438EC2083A99A /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8CB4E994750B1F697A40594E /* RxSwift.framework */; }; 26 | 3A5CEA20498726E63C4BB598 /* RxCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9E677309EBF1F0AB90EF5B3F /* RxCocoa.framework */; }; 27 | 3C6E9708CEFE699C3C6D7661 /* OptionalOperatorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02D944ECA20D955D4B060C77 /* OptionalOperatorsTests.swift */; }; 28 | 3DFF267FDE42DBA93A90363C /* RxOptionalError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81A42060607D345E90B247A9 /* RxOptionalError.swift */; }; 29 | 4019F792CA6A2FB672D165F9 /* RxCocoa.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C153F760FF053539F5510716 /* RxCocoa.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 30 | 419FA8DA0B974EE6CDE14090 /* OptionalType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 858209A38226FACEC8E72F01 /* OptionalType.swift */; }; 31 | 42F7CA0560304FC1D06BAA65 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D1C8DB5DCD91AEE9C8A3F780 /* RxSwift.framework */; }; 32 | 4712D24B4812B278345EAA6A /* RxOptional.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B6F8B84B08FC20621F94BBC /* RxOptional.h */; settings = {ATTRIBUTES = (Public, ); }; }; 33 | 48D56DC4312CF4F9622EE1EF /* XCTestManifests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44FC88FFB2CC39892B4EFD32 /* XCTestManifests.swift */; }; 34 | 5040E5CCAF5942002B74817E /* OptionalType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 858209A38226FACEC8E72F01 /* OptionalType.swift */; }; 35 | 52AD08974C058EC79D5A1DA5 /* RxOptional iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = F69BF78978CDB72ED600BBEE /* RxOptional iOS.framework */; }; 36 | 54497D9B18234E414BE1F461 /* RxCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C153F760FF053539F5510716 /* RxCocoa.framework */; }; 37 | 54692641C9F5ED2420A13C82 /* RxOptional iOS.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = F69BF78978CDB72ED600BBEE /* RxOptional iOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 38 | 55AB52B176FDA8935CA11712 /* RxOptional macOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA2BA7EDA36C2F7998475CF0 /* RxOptional macOS.framework */; }; 39 | 56FBD7BC7478DB29E609246F /* Occupiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E97AA2CD3DD0D0D830C0E1A /* Occupiable.swift */; }; 40 | 581CF9B17343BA5D37681EA3 /* Occupiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E97AA2CD3DD0D0D830C0E1A /* Occupiable.swift */; }; 41 | 5A82256F804CBC2810DB667A /* RxCocoa.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7CD7A384FF6847C3277EEF3F /* RxCocoa.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 42 | 5FF9B6AF1EA2B41BF61149CD /* RxCocoa.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9E677309EBF1F0AB90EF5B3F /* RxCocoa.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 43 | 624F64815969F8E37C50A652 /* RxCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C1679BA9C35567D5F504FE32 /* RxCocoa.framework */; }; 44 | 64F3EDA83E5F65A73365C2EF /* RxOptional.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B6F8B84B08FC20621F94BBC /* RxOptional.h */; settings = {ATTRIBUTES = (Public, ); }; }; 45 | 661668935F4D9B4A2FBA3FAD /* Observable+Occupiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB87D9F1A78D37B6147D4DA5 /* Observable+Occupiable.swift */; }; 46 | 673055954AD9043C6BDFAD9C /* SharedSequence+Optional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA3031434D921796B780D82 /* SharedSequence+Optional.swift */; }; 47 | 70DA4EABF427830FCD3CB601 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C55530428263FAED4EB4ADEC /* RxSwift.framework */; }; 48 | 7F9E871C818BADF9FDE23329 /* RxOptional tvOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 37E304B8E9B54DB2D6281F46 /* RxOptional tvOS.framework */; }; 49 | 7FD2C379DC54A289596BB700 /* OptionalOperatorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02D944ECA20D955D4B060C77 /* OptionalOperatorsTests.swift */; }; 50 | 8207476E41AFF8FCC0D53F8C /* RxOptional.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B6F8B84B08FC20621F94BBC /* RxOptional.h */; settings = {ATTRIBUTES = (Public, ); }; }; 51 | 886DED726292CFEF6D3BC118 /* OccupiableOperatorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EBAF4DD97C6BC69E0085F77 /* OccupiableOperatorsTests.swift */; }; 52 | 8E6DA53CDD03221981843432 /* SharedSequence+Optional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA3031434D921796B780D82 /* SharedSequence+Optional.swift */; }; 53 | 900DE61BCB0672CD78B1526D /* OccupiableOperatorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EBAF4DD97C6BC69E0085F77 /* OccupiableOperatorsTests.swift */; }; 54 | 9457D1D790D8C6F2DD2A49AC /* RxOptionalError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81A42060607D345E90B247A9 /* RxOptionalError.swift */; }; 55 | 9A5EC302705D9D55686AEF70 /* OptionalType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 858209A38226FACEC8E72F01 /* OptionalType.swift */; }; 56 | 9D4F9F617F5BD082337B4E19 /* RxSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = C55530428263FAED4EB4ADEC /* RxSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 57 | 9FEC6425C9697C2BB9C734DB /* Nimble.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 8FE3D7B8CE3525490933B21B /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 58 | B741B98CCAD36BBBAE0A5185 /* XCTestManifests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44FC88FFB2CC39892B4EFD32 /* XCTestManifests.swift */; }; 59 | BAA5F1EE5652A97562AD58D4 /* RxOptionalError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 81A42060607D345E90B247A9 /* RxOptionalError.swift */; }; 60 | BE7DE589D0C9403DB9E7D9EF /* SharedSequence+Occupiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69FD2A06CC523C21E0D8548B /* SharedSequence+Occupiable.swift */; }; 61 | C3F7265C293A824E8AE14C96 /* Occupiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8E97AA2CD3DD0D0D830C0E1A /* Occupiable.swift */; }; 62 | C666907E86E8335302B10173 /* SharedSequence+Optional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA3031434D921796B780D82 /* SharedSequence+Optional.swift */; }; 63 | C89EC80689518816E663194C /* OptionalOperatorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 02D944ECA20D955D4B060C77 /* OptionalOperatorsTests.swift */; }; 64 | CE96D5B0552BF66D099562D6 /* SharedSequence+Occupiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69FD2A06CC523C21E0D8548B /* SharedSequence+Occupiable.swift */; }; 65 | CF2A7F10B6CB312D1FC2103E /* Observable+Optional.swift in Sources */ = {isa = PBXBuildFile; fileRef = A125E26BDF738D2B2A6202BF /* Observable+Optional.swift */; }; 66 | CF87F131C080F0A1EBF62A26 /* RxSwift.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 2F901A32FE130D2832D7923C /* RxSwift.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 67 | D3097E79B6C04E9051B6DEE3 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E92F0264BAC6136A79209222 /* Quick.framework */; }; 68 | D31F7923A2E787977FA083A9 /* Quick.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 732FC3AC808B5B9617EEC7CE /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 69 | D39548268F529B62E3B5459A /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8FE3D7B8CE3525490933B21B /* Nimble.framework */; }; 70 | D87354414F5364D3F8F18B4E /* RxOptional.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B6F8B84B08FC20621F94BBC /* RxOptional.h */; settings = {ATTRIBUTES = (Public, ); }; }; 71 | D8D6EC702226BABD9D7915DF /* SharedSequence+Optional.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CA3031434D921796B780D82 /* SharedSequence+Optional.swift */; }; 72 | D9FF640FFF56491F6FA2CB47 /* SharedSequence+Occupiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69FD2A06CC523C21E0D8548B /* SharedSequence+Occupiable.swift */; }; 73 | DF147FDD2285BF53693069B5 /* OccupiableOperatorsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5EBAF4DD97C6BC69E0085F77 /* OccupiableOperatorsTests.swift */; }; 74 | E666B56802A3C20AB0D486CF /* SharedSequence+Occupiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 69FD2A06CC523C21E0D8548B /* SharedSequence+Occupiable.swift */; }; 75 | E6B6AC26A338A8887FFC1012 /* Observable+Occupiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB87D9F1A78D37B6147D4DA5 /* Observable+Occupiable.swift */; }; 76 | E9C044AAA31B80E95AEDA4C9 /* Quick.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 2247F253B77B2C7B7C7F4949 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 77 | EF3278EE5C59887057C03B2E /* RxOptional tvOS.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 37E304B8E9B54DB2D6281F46 /* RxOptional tvOS.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 78 | F500B32C301B0D6C6D4F2428 /* Observable+Occupiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB87D9F1A78D37B6147D4DA5 /* Observable+Occupiable.swift */; }; 79 | F7E5258592F58D48509ADD51 /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2F901A32FE130D2832D7923C /* RxSwift.framework */; }; 80 | F8A613756AF9EBEB87C4ECA0 /* Observable+Occupiable.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB87D9F1A78D37B6147D4DA5 /* Observable+Occupiable.swift */; }; 81 | FA7545955B3616E837F6B3CE /* Observable+Optional.swift in Sources */ = {isa = PBXBuildFile; fileRef = A125E26BDF738D2B2A6202BF /* Observable+Optional.swift */; }; 82 | FF68C51B63D8F1B5F2B9CE75 /* RxCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7CD7A384FF6847C3277EEF3F /* RxCocoa.framework */; }; 83 | /* End PBXBuildFile section */ 84 | 85 | /* Begin PBXContainerItemProxy section */ 86 | 2183009D206FCBE8C081CD56 /* PBXContainerItemProxy */ = { 87 | isa = PBXContainerItemProxy; 88 | containerPortal = 54001DEDA5CA627B9FD8FD3C /* Project object */; 89 | proxyType = 1; 90 | remoteGlobalIDString = 6F69539CB7F6307A6DBF3899; 91 | remoteInfo = "RxOptional iOS"; 92 | }; 93 | 2F4CBEBD0E6A1A4CA12BE919 /* PBXContainerItemProxy */ = { 94 | isa = PBXContainerItemProxy; 95 | containerPortal = 54001DEDA5CA627B9FD8FD3C /* Project object */; 96 | proxyType = 1; 97 | remoteGlobalIDString = 1CD2B6EA4FA6F3E24B74D63F; 98 | remoteInfo = "RxOptional tvOS"; 99 | }; 100 | 587E2CAE59202D0A38B9A562 /* PBXContainerItemProxy */ = { 101 | isa = PBXContainerItemProxy; 102 | containerPortal = 54001DEDA5CA627B9FD8FD3C /* Project object */; 103 | proxyType = 1; 104 | remoteGlobalIDString = 6A00D0484A59D091E8911045; 105 | remoteInfo = "RxOptional macOS"; 106 | }; 107 | /* End PBXContainerItemProxy section */ 108 | 109 | /* Begin PBXCopyFilesBuildPhase section */ 110 | 28EE978238BD64741D4C7DB2 /* Embed Frameworks */ = { 111 | isa = PBXCopyFilesBuildPhase; 112 | buildActionMask = 2147483647; 113 | dstPath = ""; 114 | dstSubfolderSpec = 10; 115 | files = ( 116 | 2CA52F2500F5477E34EBC755 /* RxOptional macOS.framework in Embed Frameworks */, 117 | 9FEC6425C9697C2BB9C734DB /* Nimble.framework in Embed Frameworks */, 118 | D31F7923A2E787977FA083A9 /* Quick.framework in Embed Frameworks */, 119 | 5A82256F804CBC2810DB667A /* RxCocoa.framework in Embed Frameworks */, 120 | 9D4F9F617F5BD082337B4E19 /* RxSwift.framework in Embed Frameworks */, 121 | ); 122 | name = "Embed Frameworks"; 123 | runOnlyForDeploymentPostprocessing = 0; 124 | }; 125 | 33314C03BDAD7CDAD7753EAA /* Embed Frameworks */ = { 126 | isa = PBXCopyFilesBuildPhase; 127 | buildActionMask = 2147483647; 128 | dstPath = ""; 129 | dstSubfolderSpec = 10; 130 | files = ( 131 | EF3278EE5C59887057C03B2E /* RxOptional tvOS.framework in Embed Frameworks */, 132 | 13C697CE2CCBFACBD5531B70 /* Nimble.framework in Embed Frameworks */, 133 | 064E3E76C201985F40B83D65 /* Quick.framework in Embed Frameworks */, 134 | 5FF9B6AF1EA2B41BF61149CD /* RxCocoa.framework in Embed Frameworks */, 135 | 2635596B686B33DEDFE43B3D /* RxSwift.framework in Embed Frameworks */, 136 | ); 137 | name = "Embed Frameworks"; 138 | runOnlyForDeploymentPostprocessing = 0; 139 | }; 140 | 641C1BF05BC5334B533DBF62 /* Embed Frameworks */ = { 141 | isa = PBXCopyFilesBuildPhase; 142 | buildActionMask = 2147483647; 143 | dstPath = ""; 144 | dstSubfolderSpec = 10; 145 | files = ( 146 | 54692641C9F5ED2420A13C82 /* RxOptional iOS.framework in Embed Frameworks */, 147 | 30A311DA190F3D0B9C954F71 /* Nimble.framework in Embed Frameworks */, 148 | E9C044AAA31B80E95AEDA4C9 /* Quick.framework in Embed Frameworks */, 149 | 4019F792CA6A2FB672D165F9 /* RxCocoa.framework in Embed Frameworks */, 150 | CF87F131C080F0A1EBF62A26 /* RxSwift.framework in Embed Frameworks */, 151 | ); 152 | name = "Embed Frameworks"; 153 | runOnlyForDeploymentPostprocessing = 0; 154 | }; 155 | /* End PBXCopyFilesBuildPhase section */ 156 | 157 | /* Begin PBXFileReference section */ 158 | 02D944ECA20D955D4B060C77 /* OptionalOperatorsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionalOperatorsTests.swift; sourceTree = ""; }; 159 | 0B6F8B84B08FC20621F94BBC /* RxOptional.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RxOptional.h; sourceTree = ""; }; 160 | 0CC12B5EDFAD80CA7AF60F84 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Nimble.framework; sourceTree = ""; }; 161 | 1B7655DD09E6FBBC65422899 /* RxOptionalTests macOS.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "RxOptionalTests macOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 162 | 2247F253B77B2C7B7C7F4949 /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Quick.framework; sourceTree = ""; }; 163 | 2F901A32FE130D2832D7923C /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = RxSwift.framework; sourceTree = ""; }; 164 | 37E304B8E9B54DB2D6281F46 /* RxOptional tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = "RxOptional tvOS.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 165 | 42B73550C55898B45112C8A7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 166 | 44FC88FFB2CC39892B4EFD32 /* XCTestManifests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCTestManifests.swift; sourceTree = ""; }; 167 | 5CA3031434D921796B780D82 /* SharedSequence+Optional.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SharedSequence+Optional.swift"; sourceTree = ""; }; 168 | 5EBAF4DD97C6BC69E0085F77 /* OccupiableOperatorsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OccupiableOperatorsTests.swift; sourceTree = ""; }; 169 | 69FD2A06CC523C21E0D8548B /* SharedSequence+Occupiable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SharedSequence+Occupiable.swift"; sourceTree = ""; }; 170 | 732FC3AC808B5B9617EEC7CE /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Quick.framework; sourceTree = ""; }; 171 | 7CD7A384FF6847C3277EEF3F /* RxCocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = RxCocoa.framework; sourceTree = ""; }; 172 | 81A42060607D345E90B247A9 /* RxOptionalError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RxOptionalError.swift; sourceTree = ""; }; 173 | 858209A38226FACEC8E72F01 /* OptionalType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionalType.swift; sourceTree = ""; }; 174 | 8CB4E994750B1F697A40594E /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = RxSwift.framework; sourceTree = ""; }; 175 | 8E97AA2CD3DD0D0D830C0E1A /* Occupiable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Occupiable.swift; sourceTree = ""; }; 176 | 8FE3D7B8CE3525490933B21B /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Nimble.framework; sourceTree = ""; }; 177 | 9E677309EBF1F0AB90EF5B3F /* RxCocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = RxCocoa.framework; sourceTree = ""; }; 178 | A125E26BDF738D2B2A6202BF /* Observable+Optional.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Observable+Optional.swift"; sourceTree = ""; }; 179 | BF34A8D0BE70F26739BD5097 /* RxOptionalTests iOS.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = "RxOptionalTests iOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 180 | C153F760FF053539F5510716 /* RxCocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = RxCocoa.framework; sourceTree = ""; }; 181 | C1679BA9C35567D5F504FE32 /* RxCocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = RxCocoa.framework; sourceTree = ""; }; 182 | C55530428263FAED4EB4ADEC /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = RxSwift.framework; sourceTree = ""; }; 183 | CB87D9F1A78D37B6147D4DA5 /* Observable+Occupiable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Observable+Occupiable.swift"; sourceTree = ""; }; 184 | CEC38EC84F9C77E55FDD6708 /* RxOptional watchOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = "RxOptional watchOS.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 185 | D1C8DB5DCD91AEE9C8A3F780 /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = RxSwift.framework; sourceTree = ""; }; 186 | D4DD625AF54CF2767D5FAA20 /* RxOptionalTests tvOS.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = "RxOptionalTests tvOS.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 187 | DA2BA7EDA36C2F7998475CF0 /* RxOptional macOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = "RxOptional macOS.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 188 | E92F0264BAC6136A79209222 /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Quick.framework; sourceTree = ""; }; 189 | F69BF78978CDB72ED600BBEE /* RxOptional iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = "RxOptional iOS.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; 190 | FAFC6873E87A10E0976D0F20 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = Nimble.framework; sourceTree = ""; }; 191 | /* End PBXFileReference section */ 192 | 193 | /* Begin PBXFrameworksBuildPhase section */ 194 | 4A283B28B5E7758DA08D899C /* Frameworks */ = { 195 | isa = PBXFrameworksBuildPhase; 196 | buildActionMask = 2147483647; 197 | files = ( 198 | 7F9E871C818BADF9FDE23329 /* RxOptional tvOS.framework in Frameworks */, 199 | 000BD50B0AFF467055827627 /* Nimble.framework in Frameworks */, 200 | D3097E79B6C04E9051B6DEE3 /* Quick.framework in Frameworks */, 201 | ); 202 | runOnlyForDeploymentPostprocessing = 0; 203 | }; 204 | 8BA354BAFBA21B9C59F367EE /* Frameworks */ = { 205 | isa = PBXFrameworksBuildPhase; 206 | buildActionMask = 2147483647; 207 | files = ( 208 | 55AB52B176FDA8935CA11712 /* RxOptional macOS.framework in Frameworks */, 209 | D39548268F529B62E3B5459A /* Nimble.framework in Frameworks */, 210 | 2FA140723E1385B282D4D7A9 /* Quick.framework in Frameworks */, 211 | ); 212 | runOnlyForDeploymentPostprocessing = 0; 213 | }; 214 | 91572F5C6ED68D2D916DA745 /* Frameworks */ = { 215 | isa = PBXFrameworksBuildPhase; 216 | buildActionMask = 2147483647; 217 | files = ( 218 | 52AD08974C058EC79D5A1DA5 /* RxOptional iOS.framework in Frameworks */, 219 | 0189A1BB9E6304AB13BBBA1C /* Nimble.framework in Frameworks */, 220 | 01CB35237B6DA8AC2A530FBA /* Quick.framework in Frameworks */, 221 | ); 222 | runOnlyForDeploymentPostprocessing = 0; 223 | }; 224 | 94D0CDC77A85CB3B73CF4B41 /* Frameworks */ = { 225 | isa = PBXFrameworksBuildPhase; 226 | buildActionMask = 2147483647; 227 | files = ( 228 | FF68C51B63D8F1B5F2B9CE75 /* RxCocoa.framework in Frameworks */, 229 | 70DA4EABF427830FCD3CB601 /* RxSwift.framework in Frameworks */, 230 | ); 231 | runOnlyForDeploymentPostprocessing = 0; 232 | }; 233 | C76065511DCCB4F2DCB478B0 /* Frameworks */ = { 234 | isa = PBXFrameworksBuildPhase; 235 | buildActionMask = 2147483647; 236 | files = ( 237 | 624F64815969F8E37C50A652 /* RxCocoa.framework in Frameworks */, 238 | 396A8FB2561438EC2083A99A /* RxSwift.framework in Frameworks */, 239 | ); 240 | runOnlyForDeploymentPostprocessing = 0; 241 | }; 242 | CA2DD4BA8907534D073DAA30 /* Frameworks */ = { 243 | isa = PBXFrameworksBuildPhase; 244 | buildActionMask = 2147483647; 245 | files = ( 246 | 54497D9B18234E414BE1F461 /* RxCocoa.framework in Frameworks */, 247 | F7E5258592F58D48509ADD51 /* RxSwift.framework in Frameworks */, 248 | ); 249 | runOnlyForDeploymentPostprocessing = 0; 250 | }; 251 | FA69B763073EB943E50D4C31 /* Frameworks */ = { 252 | isa = PBXFrameworksBuildPhase; 253 | buildActionMask = 2147483647; 254 | files = ( 255 | 3A5CEA20498726E63C4BB598 /* RxCocoa.framework in Frameworks */, 256 | 42F7CA0560304FC1D06BAA65 /* RxSwift.framework in Frameworks */, 257 | ); 258 | runOnlyForDeploymentPostprocessing = 0; 259 | }; 260 | /* End PBXFrameworksBuildPhase section */ 261 | 262 | /* Begin PBXGroup section */ 263 | 08AB2D62844A2647E9FB4EAF /* Frameworks */ = { 264 | isa = PBXGroup; 265 | children = ( 266 | CFC59C2F105D3BB00893E158 /* Carthage */, 267 | ); 268 | name = Frameworks; 269 | sourceTree = ""; 270 | }; 271 | 51904C1107C14322C90D93E7 /* Supporting Files */ = { 272 | isa = PBXGroup; 273 | children = ( 274 | 42B73550C55898B45112C8A7 /* Info.plist */, 275 | 0B6F8B84B08FC20621F94BBC /* RxOptional.h */, 276 | ); 277 | path = "Supporting Files"; 278 | sourceTree = ""; 279 | }; 280 | 51EDEA8B3CC1C5E4371795EE /* tvOS */ = { 281 | isa = PBXGroup; 282 | children = ( 283 | FAFC6873E87A10E0976D0F20 /* Nimble.framework */, 284 | E92F0264BAC6136A79209222 /* Quick.framework */, 285 | 9E677309EBF1F0AB90EF5B3F /* RxCocoa.framework */, 286 | D1C8DB5DCD91AEE9C8A3F780 /* RxSwift.framework */, 287 | ); 288 | path = tvOS; 289 | sourceTree = ""; 290 | }; 291 | 5995B79176C5ADF92DB922BD /* iOS */ = { 292 | isa = PBXGroup; 293 | children = ( 294 | 0CC12B5EDFAD80CA7AF60F84 /* Nimble.framework */, 295 | 2247F253B77B2C7B7C7F4949 /* Quick.framework */, 296 | C153F760FF053539F5510716 /* RxCocoa.framework */, 297 | 2F901A32FE130D2832D7923C /* RxSwift.framework */, 298 | ); 299 | path = iOS; 300 | sourceTree = ""; 301 | }; 302 | 6A4F5786DA2A95CE667375D2 /* RxOptional */ = { 303 | isa = PBXGroup; 304 | children = ( 305 | CB87D9F1A78D37B6147D4DA5 /* Observable+Occupiable.swift */, 306 | A125E26BDF738D2B2A6202BF /* Observable+Optional.swift */, 307 | 8E97AA2CD3DD0D0D830C0E1A /* Occupiable.swift */, 308 | 858209A38226FACEC8E72F01 /* OptionalType.swift */, 309 | 81A42060607D345E90B247A9 /* RxOptionalError.swift */, 310 | 69FD2A06CC523C21E0D8548B /* SharedSequence+Occupiable.swift */, 311 | 5CA3031434D921796B780D82 /* SharedSequence+Optional.swift */, 312 | 51904C1107C14322C90D93E7 /* Supporting Files */, 313 | ); 314 | name = RxOptional; 315 | path = Sources/RxOptional; 316 | sourceTree = ""; 317 | }; 318 | 89D0A64CBFA71FD3C4F77922 /* Mac */ = { 319 | isa = PBXGroup; 320 | children = ( 321 | 8FE3D7B8CE3525490933B21B /* Nimble.framework */, 322 | 732FC3AC808B5B9617EEC7CE /* Quick.framework */, 323 | 7CD7A384FF6847C3277EEF3F /* RxCocoa.framework */, 324 | C55530428263FAED4EB4ADEC /* RxSwift.framework */, 325 | ); 326 | path = Mac; 327 | sourceTree = ""; 328 | }; 329 | 8B0E1322337CBD4407AB44CE = { 330 | isa = PBXGroup; 331 | children = ( 332 | 6A4F5786DA2A95CE667375D2 /* RxOptional */, 333 | BA630C521A3B8673F7CFD067 /* RxOptionalTests */, 334 | 08AB2D62844A2647E9FB4EAF /* Frameworks */, 335 | 9FDFB0D148865C4684394AA4 /* Products */, 336 | ); 337 | indentWidth = 2; 338 | sourceTree = ""; 339 | tabWidth = 2; 340 | usesTabs = 0; 341 | }; 342 | 9FDFB0D148865C4684394AA4 /* Products */ = { 343 | isa = PBXGroup; 344 | children = ( 345 | F69BF78978CDB72ED600BBEE /* RxOptional iOS.framework */, 346 | DA2BA7EDA36C2F7998475CF0 /* RxOptional macOS.framework */, 347 | 37E304B8E9B54DB2D6281F46 /* RxOptional tvOS.framework */, 348 | CEC38EC84F9C77E55FDD6708 /* RxOptional watchOS.framework */, 349 | BF34A8D0BE70F26739BD5097 /* RxOptionalTests iOS.xctest */, 350 | 1B7655DD09E6FBBC65422899 /* RxOptionalTests macOS.xctest */, 351 | D4DD625AF54CF2767D5FAA20 /* RxOptionalTests tvOS.xctest */, 352 | ); 353 | name = Products; 354 | sourceTree = ""; 355 | }; 356 | BA630C521A3B8673F7CFD067 /* RxOptionalTests */ = { 357 | isa = PBXGroup; 358 | children = ( 359 | 5EBAF4DD97C6BC69E0085F77 /* OccupiableOperatorsTests.swift */, 360 | 02D944ECA20D955D4B060C77 /* OptionalOperatorsTests.swift */, 361 | 44FC88FFB2CC39892B4EFD32 /* XCTestManifests.swift */, 362 | ); 363 | name = RxOptionalTests; 364 | path = Tests/RxOptionalTests; 365 | sourceTree = ""; 366 | }; 367 | CFC59C2F105D3BB00893E158 /* Carthage */ = { 368 | isa = PBXGroup; 369 | children = ( 370 | 5995B79176C5ADF92DB922BD /* iOS */, 371 | 89D0A64CBFA71FD3C4F77922 /* Mac */, 372 | 51EDEA8B3CC1C5E4371795EE /* tvOS */, 373 | E77329B4272F2FAB7AB37132 /* watchOS */, 374 | ); 375 | name = Carthage; 376 | path = Carthage/Build; 377 | sourceTree = ""; 378 | }; 379 | E77329B4272F2FAB7AB37132 /* watchOS */ = { 380 | isa = PBXGroup; 381 | children = ( 382 | C1679BA9C35567D5F504FE32 /* RxCocoa.framework */, 383 | 8CB4E994750B1F697A40594E /* RxSwift.framework */, 384 | ); 385 | path = watchOS; 386 | sourceTree = ""; 387 | }; 388 | /* End PBXGroup section */ 389 | 390 | /* Begin PBXHeadersBuildPhase section */ 391 | 1369ABC15B27D02392E50C39 /* Headers */ = { 392 | isa = PBXHeadersBuildPhase; 393 | buildActionMask = 2147483647; 394 | files = ( 395 | 64F3EDA83E5F65A73365C2EF /* RxOptional.h in Headers */, 396 | ); 397 | runOnlyForDeploymentPostprocessing = 0; 398 | }; 399 | F47D899323035233F06352E4 /* Headers */ = { 400 | isa = PBXHeadersBuildPhase; 401 | buildActionMask = 2147483647; 402 | files = ( 403 | 4712D24B4812B278345EAA6A /* RxOptional.h in Headers */, 404 | ); 405 | runOnlyForDeploymentPostprocessing = 0; 406 | }; 407 | F7191B77B9B8C819E490277F /* Headers */ = { 408 | isa = PBXHeadersBuildPhase; 409 | buildActionMask = 2147483647; 410 | files = ( 411 | D87354414F5364D3F8F18B4E /* RxOptional.h in Headers */, 412 | ); 413 | runOnlyForDeploymentPostprocessing = 0; 414 | }; 415 | FBD945841902839A4D61E393 /* Headers */ = { 416 | isa = PBXHeadersBuildPhase; 417 | buildActionMask = 2147483647; 418 | files = ( 419 | 8207476E41AFF8FCC0D53F8C /* RxOptional.h in Headers */, 420 | ); 421 | runOnlyForDeploymentPostprocessing = 0; 422 | }; 423 | /* End PBXHeadersBuildPhase section */ 424 | 425 | /* Begin PBXNativeTarget section */ 426 | 05FC215B00A883816D509533 /* RxOptional watchOS */ = { 427 | isa = PBXNativeTarget; 428 | buildConfigurationList = 586050AEFBCCA9375C08B3AE /* Build configuration list for PBXNativeTarget "RxOptional watchOS" */; 429 | buildPhases = ( 430 | 1369ABC15B27D02392E50C39 /* Headers */, 431 | 8A515D8A2EA112793AB4B73C /* Sources */, 432 | C76065511DCCB4F2DCB478B0 /* Frameworks */, 433 | ); 434 | buildRules = ( 435 | ); 436 | dependencies = ( 437 | ); 438 | name = "RxOptional watchOS"; 439 | productName = "RxOptional watchOS"; 440 | productReference = CEC38EC84F9C77E55FDD6708 /* RxOptional watchOS.framework */; 441 | productType = "com.apple.product-type.framework"; 442 | }; 443 | 1CD2B6EA4FA6F3E24B74D63F /* RxOptional tvOS */ = { 444 | isa = PBXNativeTarget; 445 | buildConfigurationList = 5EDBE0EF5462688A5DEFA804 /* Build configuration list for PBXNativeTarget "RxOptional tvOS" */; 446 | buildPhases = ( 447 | FBD945841902839A4D61E393 /* Headers */, 448 | 50D4CBC351BCF3FA44BBACB9 /* Sources */, 449 | FA69B763073EB943E50D4C31 /* Frameworks */, 450 | ); 451 | buildRules = ( 452 | ); 453 | dependencies = ( 454 | ); 455 | name = "RxOptional tvOS"; 456 | productName = "RxOptional tvOS"; 457 | productReference = 37E304B8E9B54DB2D6281F46 /* RxOptional tvOS.framework */; 458 | productType = "com.apple.product-type.framework"; 459 | }; 460 | 65A933B3482F525E66DC8D53 /* RxOptionalTests macOS */ = { 461 | isa = PBXNativeTarget; 462 | buildConfigurationList = 1F4539CDF7017ACBF3E5391E /* Build configuration list for PBXNativeTarget "RxOptionalTests macOS" */; 463 | buildPhases = ( 464 | D3F741A79BF0F7AA373702EE /* Sources */, 465 | 8BA354BAFBA21B9C59F367EE /* Frameworks */, 466 | 28EE978238BD64741D4C7DB2 /* Embed Frameworks */, 467 | ); 468 | buildRules = ( 469 | ); 470 | dependencies = ( 471 | 2F1B3D17AF462A473860DFB6 /* PBXTargetDependency */, 472 | ); 473 | name = "RxOptionalTests macOS"; 474 | productName = "RxOptionalTests macOS"; 475 | productReference = 1B7655DD09E6FBBC65422899 /* RxOptionalTests macOS.xctest */; 476 | productType = "com.apple.product-type.bundle.unit-test"; 477 | }; 478 | 6A00D0484A59D091E8911045 /* RxOptional macOS */ = { 479 | isa = PBXNativeTarget; 480 | buildConfigurationList = 092EE7FC6ED5AFAAD763CD3C /* Build configuration list for PBXNativeTarget "RxOptional macOS" */; 481 | buildPhases = ( 482 | F7191B77B9B8C819E490277F /* Headers */, 483 | 50C07610F38D383D122B8BC7 /* Sources */, 484 | 94D0CDC77A85CB3B73CF4B41 /* Frameworks */, 485 | ); 486 | buildRules = ( 487 | ); 488 | dependencies = ( 489 | ); 490 | name = "RxOptional macOS"; 491 | productName = "RxOptional macOS"; 492 | productReference = DA2BA7EDA36C2F7998475CF0 /* RxOptional macOS.framework */; 493 | productType = "com.apple.product-type.framework"; 494 | }; 495 | 6F69539CB7F6307A6DBF3899 /* RxOptional iOS */ = { 496 | isa = PBXNativeTarget; 497 | buildConfigurationList = 2A649AACAF2F640C63CEF3E7 /* Build configuration list for PBXNativeTarget "RxOptional iOS" */; 498 | buildPhases = ( 499 | F47D899323035233F06352E4 /* Headers */, 500 | A8DCCAC1365067F51492EE9F /* Sources */, 501 | CA2DD4BA8907534D073DAA30 /* Frameworks */, 502 | ); 503 | buildRules = ( 504 | ); 505 | dependencies = ( 506 | ); 507 | name = "RxOptional iOS"; 508 | productName = "RxOptional iOS"; 509 | productReference = F69BF78978CDB72ED600BBEE /* RxOptional iOS.framework */; 510 | productType = "com.apple.product-type.framework"; 511 | }; 512 | 7B1875DF13DB304EC80B85DB /* RxOptionalTests iOS */ = { 513 | isa = PBXNativeTarget; 514 | buildConfigurationList = 0D8B4433B4CC9D03F0D32932 /* Build configuration list for PBXNativeTarget "RxOptionalTests iOS" */; 515 | buildPhases = ( 516 | CBAC33288F9909852C60862F /* Sources */, 517 | 91572F5C6ED68D2D916DA745 /* Frameworks */, 518 | 641C1BF05BC5334B533DBF62 /* Embed Frameworks */, 519 | ); 520 | buildRules = ( 521 | ); 522 | dependencies = ( 523 | 2917A5EB65BE4F3E1A61B3BD /* PBXTargetDependency */, 524 | ); 525 | name = "RxOptionalTests iOS"; 526 | productName = "RxOptionalTests iOS"; 527 | productReference = BF34A8D0BE70F26739BD5097 /* RxOptionalTests iOS.xctest */; 528 | productType = "com.apple.product-type.bundle.unit-test"; 529 | }; 530 | D04DF7B7DF49D9E0BCCD6327 /* RxOptionalTests tvOS */ = { 531 | isa = PBXNativeTarget; 532 | buildConfigurationList = 586066C3D7B5E1D2E9B15AF8 /* Build configuration list for PBXNativeTarget "RxOptionalTests tvOS" */; 533 | buildPhases = ( 534 | F0E682D95555D3DD864631BF /* Sources */, 535 | 4A283B28B5E7758DA08D899C /* Frameworks */, 536 | 33314C03BDAD7CDAD7753EAA /* Embed Frameworks */, 537 | ); 538 | buildRules = ( 539 | ); 540 | dependencies = ( 541 | 2C7DAA9FF54F91CA36807480 /* PBXTargetDependency */, 542 | ); 543 | name = "RxOptionalTests tvOS"; 544 | productName = "RxOptionalTests tvOS"; 545 | productReference = D4DD625AF54CF2767D5FAA20 /* RxOptionalTests tvOS.xctest */; 546 | productType = "com.apple.product-type.bundle.unit-test"; 547 | }; 548 | /* End PBXNativeTarget section */ 549 | 550 | /* Begin PBXProject section */ 551 | 54001DEDA5CA627B9FD8FD3C /* Project object */ = { 552 | isa = PBXProject; 553 | attributes = { 554 | LastUpgradeCheck = 1230; 555 | ORGANIZATIONNAME = RxSwiftCommunity; 556 | TargetAttributes = { 557 | }; 558 | }; 559 | buildConfigurationList = D213AF7FE420057F215728B9 /* Build configuration list for PBXProject "RxOptional" */; 560 | compatibilityVersion = "Xcode 10.0"; 561 | developmentRegion = en; 562 | hasScannedForEncodings = 0; 563 | knownRegions = ( 564 | Base, 565 | en, 566 | ); 567 | mainGroup = 8B0E1322337CBD4407AB44CE; 568 | projectDirPath = ""; 569 | projectRoot = ""; 570 | targets = ( 571 | 6F69539CB7F6307A6DBF3899 /* RxOptional iOS */, 572 | 6A00D0484A59D091E8911045 /* RxOptional macOS */, 573 | 1CD2B6EA4FA6F3E24B74D63F /* RxOptional tvOS */, 574 | 05FC215B00A883816D509533 /* RxOptional watchOS */, 575 | 7B1875DF13DB304EC80B85DB /* RxOptionalTests iOS */, 576 | 65A933B3482F525E66DC8D53 /* RxOptionalTests macOS */, 577 | D04DF7B7DF49D9E0BCCD6327 /* RxOptionalTests tvOS */, 578 | ); 579 | }; 580 | /* End PBXProject section */ 581 | 582 | /* Begin PBXSourcesBuildPhase section */ 583 | 50C07610F38D383D122B8BC7 /* Sources */ = { 584 | isa = PBXSourcesBuildPhase; 585 | buildActionMask = 2147483647; 586 | files = ( 587 | E6B6AC26A338A8887FFC1012 /* Observable+Occupiable.swift in Sources */, 588 | CF2A7F10B6CB312D1FC2103E /* Observable+Optional.swift in Sources */, 589 | C3F7265C293A824E8AE14C96 /* Occupiable.swift in Sources */, 590 | 1764F95CDAB104376D26B7DA /* OptionalType.swift in Sources */, 591 | BAA5F1EE5652A97562AD58D4 /* RxOptionalError.swift in Sources */, 592 | BE7DE589D0C9403DB9E7D9EF /* SharedSequence+Occupiable.swift in Sources */, 593 | 8E6DA53CDD03221981843432 /* SharedSequence+Optional.swift in Sources */, 594 | ); 595 | runOnlyForDeploymentPostprocessing = 0; 596 | }; 597 | 50D4CBC351BCF3FA44BBACB9 /* Sources */ = { 598 | isa = PBXSourcesBuildPhase; 599 | buildActionMask = 2147483647; 600 | files = ( 601 | F8A613756AF9EBEB87C4ECA0 /* Observable+Occupiable.swift in Sources */, 602 | FA7545955B3616E837F6B3CE /* Observable+Optional.swift in Sources */, 603 | 581CF9B17343BA5D37681EA3 /* Occupiable.swift in Sources */, 604 | 5040E5CCAF5942002B74817E /* OptionalType.swift in Sources */, 605 | 3DFF267FDE42DBA93A90363C /* RxOptionalError.swift in Sources */, 606 | CE96D5B0552BF66D099562D6 /* SharedSequence+Occupiable.swift in Sources */, 607 | C666907E86E8335302B10173 /* SharedSequence+Optional.swift in Sources */, 608 | ); 609 | runOnlyForDeploymentPostprocessing = 0; 610 | }; 611 | 8A515D8A2EA112793AB4B73C /* Sources */ = { 612 | isa = PBXSourcesBuildPhase; 613 | buildActionMask = 2147483647; 614 | files = ( 615 | F500B32C301B0D6C6D4F2428 /* Observable+Occupiable.swift in Sources */, 616 | 187FCFE934CFB364A6764F00 /* Observable+Optional.swift in Sources */, 617 | 56FBD7BC7478DB29E609246F /* Occupiable.swift in Sources */, 618 | 419FA8DA0B974EE6CDE14090 /* OptionalType.swift in Sources */, 619 | 9457D1D790D8C6F2DD2A49AC /* RxOptionalError.swift in Sources */, 620 | E666B56802A3C20AB0D486CF /* SharedSequence+Occupiable.swift in Sources */, 621 | D8D6EC702226BABD9D7915DF /* SharedSequence+Optional.swift in Sources */, 622 | ); 623 | runOnlyForDeploymentPostprocessing = 0; 624 | }; 625 | A8DCCAC1365067F51492EE9F /* Sources */ = { 626 | isa = PBXSourcesBuildPhase; 627 | buildActionMask = 2147483647; 628 | files = ( 629 | 661668935F4D9B4A2FBA3FAD /* Observable+Occupiable.swift in Sources */, 630 | 044AA0C99D8038E868604877 /* Observable+Optional.swift in Sources */, 631 | 20651DBEE76021407BCA7E3E /* Occupiable.swift in Sources */, 632 | 9A5EC302705D9D55686AEF70 /* OptionalType.swift in Sources */, 633 | 2C6B194C98F945DC149AB54B /* RxOptionalError.swift in Sources */, 634 | D9FF640FFF56491F6FA2CB47 /* SharedSequence+Occupiable.swift in Sources */, 635 | 673055954AD9043C6BDFAD9C /* SharedSequence+Optional.swift in Sources */, 636 | ); 637 | runOnlyForDeploymentPostprocessing = 0; 638 | }; 639 | CBAC33288F9909852C60862F /* Sources */ = { 640 | isa = PBXSourcesBuildPhase; 641 | buildActionMask = 2147483647; 642 | files = ( 643 | 900DE61BCB0672CD78B1526D /* OccupiableOperatorsTests.swift in Sources */, 644 | 3C6E9708CEFE699C3C6D7661 /* OptionalOperatorsTests.swift in Sources */, 645 | B741B98CCAD36BBBAE0A5185 /* XCTestManifests.swift in Sources */, 646 | ); 647 | runOnlyForDeploymentPostprocessing = 0; 648 | }; 649 | D3F741A79BF0F7AA373702EE /* Sources */ = { 650 | isa = PBXSourcesBuildPhase; 651 | buildActionMask = 2147483647; 652 | files = ( 653 | 886DED726292CFEF6D3BC118 /* OccupiableOperatorsTests.swift in Sources */, 654 | C89EC80689518816E663194C /* OptionalOperatorsTests.swift in Sources */, 655 | 05DA8BB8CFA7523A3B249052 /* XCTestManifests.swift in Sources */, 656 | ); 657 | runOnlyForDeploymentPostprocessing = 0; 658 | }; 659 | F0E682D95555D3DD864631BF /* Sources */ = { 660 | isa = PBXSourcesBuildPhase; 661 | buildActionMask = 2147483647; 662 | files = ( 663 | DF147FDD2285BF53693069B5 /* OccupiableOperatorsTests.swift in Sources */, 664 | 7FD2C379DC54A289596BB700 /* OptionalOperatorsTests.swift in Sources */, 665 | 48D56DC4312CF4F9622EE1EF /* XCTestManifests.swift in Sources */, 666 | ); 667 | runOnlyForDeploymentPostprocessing = 0; 668 | }; 669 | /* End PBXSourcesBuildPhase section */ 670 | 671 | /* Begin PBXTargetDependency section */ 672 | 2917A5EB65BE4F3E1A61B3BD /* PBXTargetDependency */ = { 673 | isa = PBXTargetDependency; 674 | target = 6F69539CB7F6307A6DBF3899 /* RxOptional iOS */; 675 | targetProxy = 2183009D206FCBE8C081CD56 /* PBXContainerItemProxy */; 676 | }; 677 | 2C7DAA9FF54F91CA36807480 /* PBXTargetDependency */ = { 678 | isa = PBXTargetDependency; 679 | target = 1CD2B6EA4FA6F3E24B74D63F /* RxOptional tvOS */; 680 | targetProxy = 2F4CBEBD0E6A1A4CA12BE919 /* PBXContainerItemProxy */; 681 | }; 682 | 2F1B3D17AF462A473860DFB6 /* PBXTargetDependency */ = { 683 | isa = PBXTargetDependency; 684 | target = 6A00D0484A59D091E8911045 /* RxOptional macOS */; 685 | targetProxy = 587E2CAE59202D0A38B9A562 /* PBXContainerItemProxy */; 686 | }; 687 | /* End PBXTargetDependency section */ 688 | 689 | /* Begin XCBuildConfiguration section */ 690 | 1E53E3CD95EE732B757D3DA4 /* Debug */ = { 691 | isa = XCBuildConfiguration; 692 | buildSettings = { 693 | ALWAYS_SEARCH_USER_PATHS = NO; 694 | CLANG_ANALYZER_NONNULL = YES; 695 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 696 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 697 | CLANG_CXX_LIBRARY = "libc++"; 698 | CLANG_ENABLE_MODULES = YES; 699 | CLANG_ENABLE_OBJC_ARC = YES; 700 | CLANG_ENABLE_OBJC_WEAK = YES; 701 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 702 | CLANG_WARN_BOOL_CONVERSION = YES; 703 | CLANG_WARN_COMMA = YES; 704 | CLANG_WARN_CONSTANT_CONVERSION = YES; 705 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 706 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 707 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 708 | CLANG_WARN_EMPTY_BODY = YES; 709 | CLANG_WARN_ENUM_CONVERSION = YES; 710 | CLANG_WARN_INFINITE_RECURSION = YES; 711 | CLANG_WARN_INT_CONVERSION = YES; 712 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 713 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 714 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 715 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 716 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 717 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 718 | CLANG_WARN_STRICT_PROTOTYPES = YES; 719 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 720 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 721 | CLANG_WARN_UNREACHABLE_CODE = YES; 722 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 723 | COPY_PHASE_STRIP = NO; 724 | DEBUG_INFORMATION_FORMAT = dwarf; 725 | ENABLE_STRICT_OBJC_MSGSEND = YES; 726 | ENABLE_TESTABILITY = YES; 727 | GCC_C_LANGUAGE_STANDARD = gnu11; 728 | GCC_DYNAMIC_NO_PIC = NO; 729 | GCC_NO_COMMON_BLOCKS = YES; 730 | GCC_OPTIMIZATION_LEVEL = 0; 731 | GCC_PREPROCESSOR_DEFINITIONS = ( 732 | "$(inherited)", 733 | "DEBUG=1", 734 | ); 735 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 736 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 737 | GCC_WARN_UNDECLARED_SELECTOR = YES; 738 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 739 | GCC_WARN_UNUSED_FUNCTION = YES; 740 | GCC_WARN_UNUSED_VARIABLE = YES; 741 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 742 | MACOSX_DEPLOYMENT_TARGET = 10.10; 743 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 744 | MTL_FAST_MATH = YES; 745 | ONLY_ACTIVE_ARCH = YES; 746 | PRODUCT_NAME = "$(TARGET_NAME)"; 747 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 748 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 749 | SWIFT_VERSION = 5.0; 750 | TVOS_DEPLOYMENT_TARGET = 10.0; 751 | WATCHOS_DEPLOYMENT_TARGET = 3.0; 752 | }; 753 | name = Debug; 754 | }; 755 | 460F1BA73CA5D423D47DD8F1 /* Release */ = { 756 | isa = XCBuildConfiguration; 757 | buildSettings = { 758 | BUNDLE_LOADER = "$(TEST_HOST)"; 759 | FRAMEWORK_SEARCH_PATHS = ( 760 | "$(inherited)", 761 | "$(PROJECT_DIR)/Carthage/Build/tvOS", 762 | ); 763 | LD_RUNPATH_SEARCH_PATHS = ( 764 | "$(inherited)", 765 | "@executable_path/Frameworks", 766 | "@loader_path/Frameworks", 767 | ); 768 | SDKROOT = appletvos; 769 | TARGETED_DEVICE_FAMILY = 3; 770 | }; 771 | name = Release; 772 | }; 773 | 53236B28032D121139C35E13 /* Debug */ = { 774 | isa = XCBuildConfiguration; 775 | buildSettings = { 776 | BUNDLE_LOADER = "$(TEST_HOST)"; 777 | CODE_SIGN_IDENTITY = ""; 778 | COMBINE_HIDPI_IMAGES = YES; 779 | FRAMEWORK_SEARCH_PATHS = ( 780 | "$(inherited)", 781 | "$(PROJECT_DIR)/Carthage/Build/Mac", 782 | ); 783 | LD_RUNPATH_SEARCH_PATHS = ( 784 | "$(inherited)", 785 | "@executable_path/../Frameworks", 786 | "@loader_path/../Frameworks", 787 | ); 788 | SDKROOT = macosx; 789 | }; 790 | name = Debug; 791 | }; 792 | 5EE31B389B1643072F0DBB45 /* Debug */ = { 793 | isa = XCBuildConfiguration; 794 | buildSettings = { 795 | BUILD_LIBRARY_FOR_DISTRIBUTION = YES; 796 | CODE_SIGN_IDENTITY = ""; 797 | CURRENT_PROJECT_VERSION = 1; 798 | DEFINES_MODULE = YES; 799 | DYLIB_COMPATIBILITY_VERSION = 1; 800 | DYLIB_CURRENT_VERSION = 1; 801 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 802 | FRAMEWORK_SEARCH_PATHS = ( 803 | "$(inherited)", 804 | "$(PROJECT_DIR)/Carthage/Build/tvOS", 805 | ); 806 | INFOPLIST_FILE = "Sources/RxOptional/Supporting Files/Info.plist"; 807 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 808 | LD_RUNPATH_SEARCH_PATHS = ( 809 | "$(inherited)", 810 | "@executable_path/Frameworks", 811 | ); 812 | PRODUCT_BUNDLE_IDENTIFIER = "RxSwiftCommunity.RxOptional.RxOptional-tvOS"; 813 | PRODUCT_NAME = RxOptional; 814 | SDKROOT = appletvos; 815 | SKIP_INSTALL = NO; 816 | TARGETED_DEVICE_FAMILY = 3; 817 | VERSIONING_SYSTEM = "apple-generic"; 818 | }; 819 | name = Debug; 820 | }; 821 | 62F7B06B01B28CC0C587DF5F /* Release */ = { 822 | isa = XCBuildConfiguration; 823 | buildSettings = { 824 | ALWAYS_SEARCH_USER_PATHS = NO; 825 | CLANG_ANALYZER_NONNULL = YES; 826 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 827 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 828 | CLANG_CXX_LIBRARY = "libc++"; 829 | CLANG_ENABLE_MODULES = YES; 830 | CLANG_ENABLE_OBJC_ARC = YES; 831 | CLANG_ENABLE_OBJC_WEAK = YES; 832 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 833 | CLANG_WARN_BOOL_CONVERSION = YES; 834 | CLANG_WARN_COMMA = YES; 835 | CLANG_WARN_CONSTANT_CONVERSION = YES; 836 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 837 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 838 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 839 | CLANG_WARN_EMPTY_BODY = YES; 840 | CLANG_WARN_ENUM_CONVERSION = YES; 841 | CLANG_WARN_INFINITE_RECURSION = YES; 842 | CLANG_WARN_INT_CONVERSION = YES; 843 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 844 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 845 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 846 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 847 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 848 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 849 | CLANG_WARN_STRICT_PROTOTYPES = YES; 850 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 851 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 852 | CLANG_WARN_UNREACHABLE_CODE = YES; 853 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 854 | COPY_PHASE_STRIP = NO; 855 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 856 | ENABLE_NS_ASSERTIONS = NO; 857 | ENABLE_STRICT_OBJC_MSGSEND = YES; 858 | GCC_C_LANGUAGE_STANDARD = gnu11; 859 | GCC_NO_COMMON_BLOCKS = YES; 860 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 861 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 862 | GCC_WARN_UNDECLARED_SELECTOR = YES; 863 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 864 | GCC_WARN_UNUSED_FUNCTION = YES; 865 | GCC_WARN_UNUSED_VARIABLE = YES; 866 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 867 | MACOSX_DEPLOYMENT_TARGET = 10.10; 868 | MTL_ENABLE_DEBUG_INFO = NO; 869 | MTL_FAST_MATH = YES; 870 | PRODUCT_NAME = "$(TARGET_NAME)"; 871 | SWIFT_COMPILATION_MODE = wholemodule; 872 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 873 | SWIFT_VERSION = 5.0; 874 | TVOS_DEPLOYMENT_TARGET = 10.0; 875 | WATCHOS_DEPLOYMENT_TARGET = 3.0; 876 | }; 877 | name = Release; 878 | }; 879 | 63D5213F45E41CC2131871E1 /* Release */ = { 880 | isa = XCBuildConfiguration; 881 | buildSettings = { 882 | BUILD_LIBRARY_FOR_DISTRIBUTION = YES; 883 | CODE_SIGN_IDENTITY = ""; 884 | CURRENT_PROJECT_VERSION = 1; 885 | DEFINES_MODULE = YES; 886 | DYLIB_COMPATIBILITY_VERSION = 1; 887 | DYLIB_CURRENT_VERSION = 1; 888 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 889 | FRAMEWORK_SEARCH_PATHS = ( 890 | "$(inherited)", 891 | "$(PROJECT_DIR)/Carthage/Build/iOS", 892 | ); 893 | INFOPLIST_FILE = "Sources/RxOptional/Supporting Files/Info.plist"; 894 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 895 | LD_RUNPATH_SEARCH_PATHS = ( 896 | "$(inherited)", 897 | "@executable_path/Frameworks", 898 | ); 899 | PRODUCT_BUNDLE_IDENTIFIER = "RxSwiftCommunity.RxOptional.RxOptional-iOS"; 900 | PRODUCT_NAME = RxOptional; 901 | SDKROOT = iphoneos; 902 | SKIP_INSTALL = NO; 903 | SUPPORTS_MACCATALYST = NO; 904 | TARGETED_DEVICE_FAMILY = "1,2"; 905 | VERSIONING_SYSTEM = "apple-generic"; 906 | }; 907 | name = Release; 908 | }; 909 | 82FA5E0CF9914AFA86F07F8E /* Release */ = { 910 | isa = XCBuildConfiguration; 911 | buildSettings = { 912 | BUNDLE_LOADER = "$(TEST_HOST)"; 913 | FRAMEWORK_SEARCH_PATHS = ( 914 | "$(inherited)", 915 | "$(PROJECT_DIR)/Carthage/Build/iOS", 916 | ); 917 | LD_RUNPATH_SEARCH_PATHS = ( 918 | "$(inherited)", 919 | "@executable_path/Frameworks", 920 | "@loader_path/Frameworks", 921 | ); 922 | SDKROOT = iphoneos; 923 | TARGETED_DEVICE_FAMILY = "1,2"; 924 | }; 925 | name = Release; 926 | }; 927 | 897EBEABB77CA12FB0626D76 /* Release */ = { 928 | isa = XCBuildConfiguration; 929 | buildSettings = { 930 | BUILD_LIBRARY_FOR_DISTRIBUTION = YES; 931 | CODE_SIGN_IDENTITY = ""; 932 | CURRENT_PROJECT_VERSION = 1; 933 | DEFINES_MODULE = YES; 934 | DYLIB_COMPATIBILITY_VERSION = 1; 935 | DYLIB_CURRENT_VERSION = 1; 936 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 937 | FRAMEWORK_SEARCH_PATHS = ( 938 | "$(inherited)", 939 | "$(PROJECT_DIR)/Carthage/Build/watchOS", 940 | ); 941 | INFOPLIST_FILE = "Sources/RxOptional/Supporting Files/Info.plist"; 942 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 943 | PRODUCT_BUNDLE_IDENTIFIER = "RxSwiftCommunity.RxOptional.RxOptional-watchOS"; 944 | PRODUCT_NAME = RxOptional; 945 | SDKROOT = watchos; 946 | SKIP_INSTALL = NO; 947 | TARGETED_DEVICE_FAMILY = 4; 948 | VERSIONING_SYSTEM = "apple-generic"; 949 | }; 950 | name = Release; 951 | }; 952 | 9CB6F0272CE9CD5F006D986B /* Debug */ = { 953 | isa = XCBuildConfiguration; 954 | buildSettings = { 955 | BUNDLE_LOADER = "$(TEST_HOST)"; 956 | FRAMEWORK_SEARCH_PATHS = ( 957 | "$(inherited)", 958 | "$(PROJECT_DIR)/Carthage/Build/tvOS", 959 | ); 960 | LD_RUNPATH_SEARCH_PATHS = ( 961 | "$(inherited)", 962 | "@executable_path/Frameworks", 963 | "@loader_path/Frameworks", 964 | ); 965 | SDKROOT = appletvos; 966 | TARGETED_DEVICE_FAMILY = 3; 967 | }; 968 | name = Debug; 969 | }; 970 | A1F5CB27FEAA15D6C7A4178E /* Debug */ = { 971 | isa = XCBuildConfiguration; 972 | buildSettings = { 973 | BUNDLE_LOADER = "$(TEST_HOST)"; 974 | FRAMEWORK_SEARCH_PATHS = ( 975 | "$(inherited)", 976 | "$(PROJECT_DIR)/Carthage/Build/iOS", 977 | ); 978 | LD_RUNPATH_SEARCH_PATHS = ( 979 | "$(inherited)", 980 | "@executable_path/Frameworks", 981 | "@loader_path/Frameworks", 982 | ); 983 | SDKROOT = iphoneos; 984 | TARGETED_DEVICE_FAMILY = "1,2"; 985 | }; 986 | name = Debug; 987 | }; 988 | B323C6ADF92AE0012115869E /* Release */ = { 989 | isa = XCBuildConfiguration; 990 | buildSettings = { 991 | BUILD_LIBRARY_FOR_DISTRIBUTION = YES; 992 | CODE_SIGN_IDENTITY = ""; 993 | COMBINE_HIDPI_IMAGES = YES; 994 | CURRENT_PROJECT_VERSION = 1; 995 | DEFINES_MODULE = YES; 996 | DYLIB_COMPATIBILITY_VERSION = 1; 997 | DYLIB_CURRENT_VERSION = 1; 998 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 999 | FRAMEWORK_SEARCH_PATHS = ( 1000 | "$(inherited)", 1001 | "$(PROJECT_DIR)/Carthage/Build/Mac", 1002 | ); 1003 | INFOPLIST_FILE = "Sources/RxOptional/Supporting Files/Info.plist"; 1004 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1005 | LD_RUNPATH_SEARCH_PATHS = ( 1006 | "$(inherited)", 1007 | "@executable_path/../Frameworks", 1008 | ); 1009 | PRODUCT_BUNDLE_IDENTIFIER = "RxSwiftCommunity.RxOptional.RxOptional-macOS"; 1010 | PRODUCT_NAME = RxOptional; 1011 | SDKROOT = macosx; 1012 | SKIP_INSTALL = NO; 1013 | VERSIONING_SYSTEM = "apple-generic"; 1014 | }; 1015 | name = Release; 1016 | }; 1017 | B9ACD980DA8916BE21A58FC8 /* Debug */ = { 1018 | isa = XCBuildConfiguration; 1019 | buildSettings = { 1020 | BUILD_LIBRARY_FOR_DISTRIBUTION = YES; 1021 | CODE_SIGN_IDENTITY = ""; 1022 | CURRENT_PROJECT_VERSION = 1; 1023 | DEFINES_MODULE = YES; 1024 | DYLIB_COMPATIBILITY_VERSION = 1; 1025 | DYLIB_CURRENT_VERSION = 1; 1026 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1027 | FRAMEWORK_SEARCH_PATHS = ( 1028 | "$(inherited)", 1029 | "$(PROJECT_DIR)/Carthage/Build/iOS", 1030 | ); 1031 | INFOPLIST_FILE = "Sources/RxOptional/Supporting Files/Info.plist"; 1032 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1033 | LD_RUNPATH_SEARCH_PATHS = ( 1034 | "$(inherited)", 1035 | "@executable_path/Frameworks", 1036 | ); 1037 | PRODUCT_BUNDLE_IDENTIFIER = "RxSwiftCommunity.RxOptional.RxOptional-iOS"; 1038 | PRODUCT_NAME = RxOptional; 1039 | SDKROOT = iphoneos; 1040 | SKIP_INSTALL = NO; 1041 | SUPPORTS_MACCATALYST = NO; 1042 | TARGETED_DEVICE_FAMILY = "1,2"; 1043 | VERSIONING_SYSTEM = "apple-generic"; 1044 | }; 1045 | name = Debug; 1046 | }; 1047 | D8E8E4D1945D118E1E8C54E4 /* Release */ = { 1048 | isa = XCBuildConfiguration; 1049 | buildSettings = { 1050 | BUNDLE_LOADER = "$(TEST_HOST)"; 1051 | CODE_SIGN_IDENTITY = ""; 1052 | COMBINE_HIDPI_IMAGES = YES; 1053 | FRAMEWORK_SEARCH_PATHS = ( 1054 | "$(inherited)", 1055 | "$(PROJECT_DIR)/Carthage/Build/Mac", 1056 | ); 1057 | LD_RUNPATH_SEARCH_PATHS = ( 1058 | "$(inherited)", 1059 | "@executable_path/../Frameworks", 1060 | "@loader_path/../Frameworks", 1061 | ); 1062 | SDKROOT = macosx; 1063 | }; 1064 | name = Release; 1065 | }; 1066 | DF87BEC29C8610C912261F1A /* Debug */ = { 1067 | isa = XCBuildConfiguration; 1068 | buildSettings = { 1069 | BUILD_LIBRARY_FOR_DISTRIBUTION = YES; 1070 | CODE_SIGN_IDENTITY = ""; 1071 | CURRENT_PROJECT_VERSION = 1; 1072 | DEFINES_MODULE = YES; 1073 | DYLIB_COMPATIBILITY_VERSION = 1; 1074 | DYLIB_CURRENT_VERSION = 1; 1075 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1076 | FRAMEWORK_SEARCH_PATHS = ( 1077 | "$(inherited)", 1078 | "$(PROJECT_DIR)/Carthage/Build/watchOS", 1079 | ); 1080 | INFOPLIST_FILE = "Sources/RxOptional/Supporting Files/Info.plist"; 1081 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1082 | PRODUCT_BUNDLE_IDENTIFIER = "RxSwiftCommunity.RxOptional.RxOptional-watchOS"; 1083 | PRODUCT_NAME = RxOptional; 1084 | SDKROOT = watchos; 1085 | SKIP_INSTALL = NO; 1086 | TARGETED_DEVICE_FAMILY = 4; 1087 | VERSIONING_SYSTEM = "apple-generic"; 1088 | }; 1089 | name = Debug; 1090 | }; 1091 | E834288DC5EC9EB264B1D101 /* Release */ = { 1092 | isa = XCBuildConfiguration; 1093 | buildSettings = { 1094 | BUILD_LIBRARY_FOR_DISTRIBUTION = YES; 1095 | CODE_SIGN_IDENTITY = ""; 1096 | CURRENT_PROJECT_VERSION = 1; 1097 | DEFINES_MODULE = YES; 1098 | DYLIB_COMPATIBILITY_VERSION = 1; 1099 | DYLIB_CURRENT_VERSION = 1; 1100 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1101 | FRAMEWORK_SEARCH_PATHS = ( 1102 | "$(inherited)", 1103 | "$(PROJECT_DIR)/Carthage/Build/tvOS", 1104 | ); 1105 | INFOPLIST_FILE = "Sources/RxOptional/Supporting Files/Info.plist"; 1106 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1107 | LD_RUNPATH_SEARCH_PATHS = ( 1108 | "$(inherited)", 1109 | "@executable_path/Frameworks", 1110 | ); 1111 | PRODUCT_BUNDLE_IDENTIFIER = "RxSwiftCommunity.RxOptional.RxOptional-tvOS"; 1112 | PRODUCT_NAME = RxOptional; 1113 | SDKROOT = appletvos; 1114 | SKIP_INSTALL = NO; 1115 | TARGETED_DEVICE_FAMILY = 3; 1116 | VERSIONING_SYSTEM = "apple-generic"; 1117 | }; 1118 | name = Release; 1119 | }; 1120 | F07D0CB410D449E2B5D99E6E /* Debug */ = { 1121 | isa = XCBuildConfiguration; 1122 | buildSettings = { 1123 | BUILD_LIBRARY_FOR_DISTRIBUTION = YES; 1124 | CODE_SIGN_IDENTITY = ""; 1125 | COMBINE_HIDPI_IMAGES = YES; 1126 | CURRENT_PROJECT_VERSION = 1; 1127 | DEFINES_MODULE = YES; 1128 | DYLIB_COMPATIBILITY_VERSION = 1; 1129 | DYLIB_CURRENT_VERSION = 1; 1130 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 1131 | FRAMEWORK_SEARCH_PATHS = ( 1132 | "$(inherited)", 1133 | "$(PROJECT_DIR)/Carthage/Build/Mac", 1134 | ); 1135 | INFOPLIST_FILE = "Sources/RxOptional/Supporting Files/Info.plist"; 1136 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 1137 | LD_RUNPATH_SEARCH_PATHS = ( 1138 | "$(inherited)", 1139 | "@executable_path/../Frameworks", 1140 | ); 1141 | PRODUCT_BUNDLE_IDENTIFIER = "RxSwiftCommunity.RxOptional.RxOptional-macOS"; 1142 | PRODUCT_NAME = RxOptional; 1143 | SDKROOT = macosx; 1144 | SKIP_INSTALL = NO; 1145 | VERSIONING_SYSTEM = "apple-generic"; 1146 | }; 1147 | name = Debug; 1148 | }; 1149 | /* End XCBuildConfiguration section */ 1150 | 1151 | /* Begin XCConfigurationList section */ 1152 | 092EE7FC6ED5AFAAD763CD3C /* Build configuration list for PBXNativeTarget "RxOptional macOS" */ = { 1153 | isa = XCConfigurationList; 1154 | buildConfigurations = ( 1155 | F07D0CB410D449E2B5D99E6E /* Debug */, 1156 | B323C6ADF92AE0012115869E /* Release */, 1157 | ); 1158 | defaultConfigurationIsVisible = 0; 1159 | defaultConfigurationName = Release; 1160 | }; 1161 | 0D8B4433B4CC9D03F0D32932 /* Build configuration list for PBXNativeTarget "RxOptionalTests iOS" */ = { 1162 | isa = XCConfigurationList; 1163 | buildConfigurations = ( 1164 | A1F5CB27FEAA15D6C7A4178E /* Debug */, 1165 | 82FA5E0CF9914AFA86F07F8E /* Release */, 1166 | ); 1167 | defaultConfigurationIsVisible = 0; 1168 | defaultConfigurationName = Release; 1169 | }; 1170 | 1F4539CDF7017ACBF3E5391E /* Build configuration list for PBXNativeTarget "RxOptionalTests macOS" */ = { 1171 | isa = XCConfigurationList; 1172 | buildConfigurations = ( 1173 | 53236B28032D121139C35E13 /* Debug */, 1174 | D8E8E4D1945D118E1E8C54E4 /* Release */, 1175 | ); 1176 | defaultConfigurationIsVisible = 0; 1177 | defaultConfigurationName = Release; 1178 | }; 1179 | 2A649AACAF2F640C63CEF3E7 /* Build configuration list for PBXNativeTarget "RxOptional iOS" */ = { 1180 | isa = XCConfigurationList; 1181 | buildConfigurations = ( 1182 | B9ACD980DA8916BE21A58FC8 /* Debug */, 1183 | 63D5213F45E41CC2131871E1 /* Release */, 1184 | ); 1185 | defaultConfigurationIsVisible = 0; 1186 | defaultConfigurationName = Release; 1187 | }; 1188 | 586050AEFBCCA9375C08B3AE /* Build configuration list for PBXNativeTarget "RxOptional watchOS" */ = { 1189 | isa = XCConfigurationList; 1190 | buildConfigurations = ( 1191 | DF87BEC29C8610C912261F1A /* Debug */, 1192 | 897EBEABB77CA12FB0626D76 /* Release */, 1193 | ); 1194 | defaultConfigurationIsVisible = 0; 1195 | defaultConfigurationName = Release; 1196 | }; 1197 | 586066C3D7B5E1D2E9B15AF8 /* Build configuration list for PBXNativeTarget "RxOptionalTests tvOS" */ = { 1198 | isa = XCConfigurationList; 1199 | buildConfigurations = ( 1200 | 9CB6F0272CE9CD5F006D986B /* Debug */, 1201 | 460F1BA73CA5D423D47DD8F1 /* Release */, 1202 | ); 1203 | defaultConfigurationIsVisible = 0; 1204 | defaultConfigurationName = Release; 1205 | }; 1206 | 5EDBE0EF5462688A5DEFA804 /* Build configuration list for PBXNativeTarget "RxOptional tvOS" */ = { 1207 | isa = XCConfigurationList; 1208 | buildConfigurations = ( 1209 | 5EE31B389B1643072F0DBB45 /* Debug */, 1210 | E834288DC5EC9EB264B1D101 /* Release */, 1211 | ); 1212 | defaultConfigurationIsVisible = 0; 1213 | defaultConfigurationName = Release; 1214 | }; 1215 | D213AF7FE420057F215728B9 /* Build configuration list for PBXProject "RxOptional" */ = { 1216 | isa = XCConfigurationList; 1217 | buildConfigurations = ( 1218 | 1E53E3CD95EE732B757D3DA4 /* Debug */, 1219 | 62F7B06B01B28CC0C587DF5F /* Release */, 1220 | ); 1221 | defaultConfigurationIsVisible = 0; 1222 | defaultConfigurationName = Release; 1223 | }; 1224 | /* End XCConfigurationList section */ 1225 | }; 1226 | rootObject = 54001DEDA5CA627B9FD8FD3C /* Project object */; 1227 | } 1228 | -------------------------------------------------------------------------------- /RxOptional.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /RxOptional.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /RxOptional.xcodeproj/xcshareddata/xcschemes/RxOptional iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 46 | 47 | 49 | 55 | 56 | 57 | 58 | 59 | 65 | 66 | 67 | 68 | 69 | 70 | 80 | 81 | 87 | 88 | 89 | 90 | 91 | 92 | 98 | 100 | 106 | 107 | 108 | 109 | 110 | 111 | 113 | 114 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /RxOptional.xcodeproj/xcshareddata/xcschemes/RxOptional macOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 46 | 47 | 49 | 55 | 56 | 57 | 58 | 59 | 65 | 66 | 67 | 68 | 69 | 70 | 80 | 81 | 87 | 88 | 89 | 90 | 91 | 92 | 98 | 100 | 106 | 107 | 108 | 109 | 110 | 111 | 113 | 114 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /RxOptional.xcodeproj/xcshareddata/xcschemes/RxOptional tvOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 46 | 47 | 49 | 55 | 56 | 57 | 58 | 59 | 65 | 66 | 67 | 68 | 69 | 70 | 80 | 81 | 87 | 88 | 89 | 90 | 91 | 92 | 98 | 100 | 106 | 107 | 108 | 109 | 110 | 111 | 113 | 114 | 117 | 118 | 119 | -------------------------------------------------------------------------------- /RxOptional.xcodeproj/xcshareddata/xcschemes/RxOptional watchOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 31 | 32 | 33 | 34 | 40 | 41 | 42 | 43 | 53 | 54 | 60 | 61 | 62 | 63 | 64 | 65 | 71 | 73 | 79 | 80 | 81 | 82 | 83 | 84 | 86 | 87 | 90 | 91 | 92 | -------------------------------------------------------------------------------- /RxOptionalExample.playground/Contents.swift: -------------------------------------------------------------------------------- 1 | import RxCocoa 2 | import RxOptional 3 | import RxSwift 4 | 5 | public func example(description: String, action: () -> Void) { 6 | print("\n--- \(description) example ---") 7 | action() 8 | } 9 | 10 | // : All operators are also available on `Driver`, unless otherwise noted. 11 | 12 | // : ## Optionals 13 | 14 | example("filterNil") { 15 | _ = Observable 16 | .of("One", nil, "Three") 17 | .filterNil() 18 | // Type is now Observable 19 | .subscribe { print($0) } 20 | } 21 | 22 | example("replaceNilWith") { 23 | _ = Observable 24 | .of("One", nil, "Three") 25 | .replaceNilWith("Two") 26 | // Type is now Observable 27 | .subscribe { print($0) } 28 | } 29 | 30 | #if !swift(>=3.3) || (swift(>=4.0) && !swift(>=4.1)) 31 | example("distinctUntilChanged") { 32 | _ = Observable 33 | .of(5, 6, 6, nil, nil, 3) 34 | .distinctUntilChanged() 35 | .subscribe { print($0) } 36 | } 37 | #endif 38 | 39 | /*: 40 | Unavailable on `Driver`, because `Driver`s cannot error out. 41 | 42 | By default, errors with `RxOptionalError.FoundNilWhileUnwrappingOptional`. 43 | */ 44 | example("errorOnNil") { 45 | _ = Observable 46 | .of("One", nil, "Three") 47 | .errorOnNil() 48 | // Type is now Observable 49 | .subscribe { print($0) } 50 | } 51 | 52 | example("catchOnNil") { 53 | _ = Observable 54 | .of("One", nil, "Three") 55 | .catchOnNil { 56 | Observable.just("A String from a new Observable") 57 | } 58 | // Type is now Observable 59 | .subscribe { print($0) } 60 | } 61 | 62 | // : ## Occupilables 63 | 64 | example("filterEmpty") { 65 | _ = Observable<[String]> 66 | .of(["Single Element"], [], ["Two", "Elements"]) 67 | .filterEmpty() 68 | .subscribe { print($0) } 69 | } 70 | 71 | /*: 72 | Unavailable on `Driver`, because `Driver`s cannot error out. 73 | 74 | By default, errors with `RxOptionalError.EmptyOccupiable`. 75 | */ 76 | example("errorOnEmpty") { 77 | _ = Observable<[String]> 78 | .of(["Single Element"], [], ["Two", "Elements"]) 79 | .errorOnEmpty() 80 | .subscribe { print($0) } 81 | } 82 | 83 | example("catchOnEmpty") { 84 | _ = Observable<[String]> 85 | .of(["Single Element"], [], ["Two", "Elements"]) 86 | .catchOnEmpty { 87 | Observable<[String]>.just(["Not Empty"]) 88 | } 89 | .subscribe { print($0) } 90 | } 91 | -------------------------------------------------------------------------------- /RxOptionalExample.playground/contents.xcplayground: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /Sources/RxOptional/Observable+Occupiable.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import RxSwift 3 | 4 | public extension ObservableType where Element: Occupiable { 5 | /** 6 | Filter out empty occupiable elements. 7 | 8 | - returns: `Observable` of source `Observable`'s occupiable elements, with empty occupiable elements filtered out. 9 | */ 10 | 11 | func filterEmpty() -> Observable { 12 | return flatMap { element -> Observable in 13 | guard element.isNotEmpty else { 14 | return Observable.empty() 15 | } 16 | return Observable.just(element) 17 | } 18 | } 19 | 20 | /** 21 | Replaces empty occupiable elements with result returned by `handler`. 22 | 23 | - parameter handler: empty handler throwing function that returns `Observable` of non-empty occupiable elements. 24 | 25 | - returns: `Observable` of the source `Observable`'s occupiable elements, with empty occupiable elements replaced by the handler's returned non-empty occupiable elements. 26 | */ 27 | 28 | func catchOnEmpty(_ handler: @escaping () throws -> Observable) -> Observable { 29 | return flatMap { element -> Observable in 30 | guard element.isNotEmpty else { 31 | return try handler() 32 | } 33 | return Observable.just(element) 34 | } 35 | } 36 | 37 | /** 38 | Throws an error if the source `Observable` contains an empty occupiable element; otherwise returns original source `Observable` of non-empty occupiable elements. 39 | 40 | - parameter error: error to throw when an empty occupiable element is encountered. Defaults to `RxOptionalError.EmptyOccupiable`. 41 | 42 | - throws: `error` if an empty occupiable element is encountered. 43 | 44 | - returns: original source `Observable` of non-empty occupiable elements if it contains no empty occupiable elements. 45 | */ 46 | 47 | func errorOnEmpty(_ error: Error = RxOptionalError.emptyOccupiable(Element.self)) -> Observable { 48 | return map { element in 49 | guard element.isNotEmpty else { 50 | throw error 51 | } 52 | return element 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /Sources/RxOptional/Observable+Optional.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import RxSwift 3 | 4 | // Some code originally from here: https://github.com/artsy/eidolon/blob/24e36a69bbafb4ef6dbe4d98b575ceb4e1d8345f/Kiosk/Observable%2BOperators.swift#L42-L62 5 | // Credit to Artsy and @ashfurrow 6 | 7 | public extension ObservableType where Element: OptionalType { 8 | /** 9 | Unwraps and filters out `nil` elements. 10 | 11 | - returns: `Observable` of source `Observable`'s elements, with `nil` elements filtered out. 12 | */ 13 | 14 | func filterNil() -> Observable { 15 | return flatMap { element -> Observable in 16 | guard let value = element.value else { 17 | return Observable.empty() 18 | } 19 | return Observable.just(value) 20 | } 21 | } 22 | 23 | /** 24 | 25 | Filters out `nil` elements. Similar to `filterNil`, but keeps the elements of the observable 26 | wrapped in Optionals. This is often useful for binding to a UIBindingObserver with an optional type. 27 | 28 | - returns: `Observable` of source `Observable`'s elements, with `nil` elements filtered out. 29 | */ 30 | 31 | func filterNilKeepOptional() -> Observable { 32 | return filter { element -> Bool in 33 | element.value != nil 34 | } 35 | } 36 | 37 | /** 38 | Throws an error if the source `Observable` contains an empty element; otherwise returns original source `Observable` of non-empty elements. 39 | 40 | - parameter error: error to throw when an empty element is encountered. Defaults to `RxOptionalError.FoundNilWhileUnwrappingOptional`. 41 | 42 | - throws: `error` if an empty element is encountered. 43 | 44 | - returns: original source `Observable` of non-empty elements if it contains no empty elements. 45 | */ 46 | 47 | func errorOnNil(_ error: Error = RxOptionalError.foundNilWhileUnwrappingOptional(Element.self)) -> Observable { 48 | return map { element -> Element.Wrapped in 49 | guard let value = element.value else { 50 | throw error 51 | } 52 | return value 53 | } 54 | } 55 | 56 | /** 57 | Unwraps optional elements and replaces `nil` elements with `valueOnNil`. 58 | 59 | - parameter valueOnNil: value to use when `nil` is encountered. 60 | 61 | - returns: `Observable` of the source `Observable`'s unwrapped elements, with `nil` elements replaced by `valueOnNil`. 62 | */ 63 | 64 | func replaceNilWith(_ valueOnNil: Element.Wrapped) -> Observable { 65 | return map { element -> Element.Wrapped in 66 | guard let value = element.value else { 67 | return valueOnNil 68 | } 69 | return value 70 | } 71 | } 72 | 73 | /** 74 | Unwraps optional elements and replaces `nil` elements with result returned by `handler`. 75 | 76 | - parameter handler: `nil` handler throwing function that returns `Observable` of non-`nil` elements. 77 | 78 | - returns: `Observable` of the source `Observable`'s unwrapped elements, with `nil` elements replaced by the handler's returned non-`nil` elements. 79 | */ 80 | 81 | func catchOnNil(_ handler: @escaping () throws -> Observable) -> Observable { 82 | return flatMap { element -> Observable in 83 | guard let value = element.value else { 84 | return try handler() 85 | } 86 | return Observable.just(value) 87 | } 88 | } 89 | } 90 | 91 | #if !swift(>=3.3) || (swift(>=4.0) && !swift(>=4.1)) 92 | public extension ObservableType where Element: OptionalType, Element.Wrapped: Equatable { 93 | /** 94 | Returns an observable sequence that contains only distinct contiguous elements according to equality operator. 95 | 96 | - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html) 97 | 98 | - returns: An observable sequence only containing the distinct contiguous elements, based on equality operator, from the source sequence. 99 | */ 100 | 101 | func distinctUntilChanged() -> Observable { 102 | return distinctUntilChanged { (lhs, rhs) -> Bool in 103 | lhs.value == rhs.value 104 | } 105 | } 106 | } 107 | #endif 108 | -------------------------------------------------------------------------------- /Sources/RxOptional/Occupiable.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // Originally from here: https://github.com/artsy/eidolon/blob/f95c0a5bf1e90358320529529d6bf431ada04c3f/Kiosk/App/SwiftExtensions.swift#L23-L40 4 | // Credit to Artsy and @ashfurrow 5 | 6 | // Anything that can hold a value (strings, arrays, etc.) 7 | public protocol Occupiable { 8 | var isEmpty: Bool { get } 9 | var isNotEmpty: Bool { get } 10 | } 11 | 12 | public extension Occupiable { 13 | var isNotEmpty: Bool { 14 | return !isEmpty 15 | } 16 | } 17 | 18 | extension String: Occupiable {} 19 | // I can't think of a way to combine these collection types. Suggestions welcomed! 20 | extension Array: Occupiable {} 21 | extension Dictionary: Occupiable {} 22 | extension Set: Occupiable {} 23 | -------------------------------------------------------------------------------- /Sources/RxOptional/OptionalType.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | // Originally from here: https://github.com/artsy/eidolon/blob/24e36a69bbafb4ef6dbe4d98b575ceb4e1d8345f/Kiosk/Observable%2BOperators.swift#L30-L40 4 | // Credit to Artsy and @ashfurrow 5 | 6 | public protocol OptionalType { 7 | associatedtype Wrapped 8 | var value: Wrapped? { get } 9 | } 10 | 11 | extension Optional: OptionalType { 12 | /// Cast `Optional` to `Wrapped?` 13 | public var value: Wrapped? { 14 | return self 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Sources/RxOptional/RxOptionalError.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | public enum RxOptionalError: Error, CustomStringConvertible { 4 | case foundNilWhileUnwrappingOptional(Any.Type) 5 | case emptyOccupiable(Any.Type) 6 | 7 | public var description: String { 8 | switch self { 9 | case let .foundNilWhileUnwrappingOptional(type): 10 | return "Found nil while trying to unwrap type <\(String(describing: type))>" 11 | case let .emptyOccupiable(type): 12 | return "Empty occupiable of type <\(String(describing: type))>" 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Sources/RxOptional/SharedSequence+Occupiable.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | import RxCocoa 3 | 4 | public extension SharedSequenceConvertibleType where Element: Occupiable { 5 | /** 6 | Filters out empty elements. 7 | 8 | - returns: `Driver` of source `Driver`'s elements, with empty elements filtered out. 9 | */ 10 | 11 | func filterEmpty() -> SharedSequence { 12 | return flatMap { element -> SharedSequence in 13 | guard element.isNotEmpty else { 14 | return SharedSequence.empty() 15 | } 16 | return SharedSequence.just(element) 17 | } 18 | } 19 | 20 | /** 21 | Replaces empty elements with result returned by `handler`. 22 | 23 | - parameter handler: empty handler function that returns `Driver` of non-empty elements. 24 | 25 | - returns: `Driver` of the source `Driver`'s elements, with empty elements replaced by the handler's returned non-empty elements. 26 | */ 27 | 28 | func catchOnEmpty(_ handler: @escaping () -> SharedSequence) -> SharedSequence { 29 | return flatMap { element -> SharedSequence in 30 | guard element.isNotEmpty else { 31 | return handler() 32 | } 33 | return SharedSequence.just(element) 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Sources/RxOptional/SharedSequence+Optional.swift: -------------------------------------------------------------------------------- 1 | import RxCocoa 2 | 3 | public extension SharedSequenceConvertibleType where Element: OptionalType { 4 | /** 5 | Unwraps and filters out `nil` elements. 6 | 7 | - returns: `Driver` of source `Driver`'s elements, with `nil` elements filtered out. 8 | */ 9 | 10 | func filterNil() -> SharedSequence { 11 | return flatMap { element -> SharedSequence in 12 | guard let value = element.value else { 13 | return SharedSequence.empty() 14 | } 15 | return SharedSequence.just(value) 16 | } 17 | } 18 | 19 | /** 20 | Unwraps optional elements and replaces `nil` elements with `valueOnNil`. 21 | 22 | - parameter valueOnNil: value to use when `nil` is encountered. 23 | 24 | - returns: `Driver` of the source `Driver`'s unwrapped elements, with `nil` elements replaced by `valueOnNil`. 25 | */ 26 | 27 | func replaceNilWith(_ valueOnNil: Element.Wrapped) -> SharedSequence { 28 | return map { element -> Element.Wrapped in 29 | guard let value = element.value else { 30 | return valueOnNil 31 | } 32 | return value 33 | } 34 | } 35 | 36 | /** 37 | Unwraps optional elements and replaces `nil` elements with result returned by `handler`. 38 | 39 | - parameter handler: `nil` handler function that returns `Driver` of non-`nil` elements. 40 | 41 | - returns: `Driver` of the source `Driver`'s unwrapped elements, with `nil` elements replaced by the handler's returned non-`nil` elements. 42 | */ 43 | 44 | func catchOnNil(_ handler: @escaping () -> SharedSequence) -> SharedSequence { 45 | return flatMap { element -> SharedSequence in 46 | guard let value = element.value else { 47 | return handler() 48 | } 49 | return SharedSequence.just(value) 50 | } 51 | } 52 | } 53 | 54 | #if !swift(>=3.3) || (swift(>=4.0) && !swift(>=4.1)) 55 | public extension SharedSequenceConvertibleType where Element: OptionalType, Element.Wrapped: Equatable { 56 | /** 57 | Returns an observable sequence that contains only distinct contiguous elements according to equality operator. 58 | 59 | - seealso: [distinct operator on reactivex.io](http://reactivex.io/documentation/operators/distinct.html) 60 | 61 | - returns: An observable sequence only containing the distinct contiguous elements, based on equality operator, from the source sequence. 62 | */ 63 | 64 | func distinctUntilChanged() -> SharedSequence { 65 | return distinctUntilChanged { (lhs, rhs) -> Bool in 66 | lhs.value == rhs.value 67 | } 68 | } 69 | } 70 | #endif 71 | -------------------------------------------------------------------------------- /Sources/RxOptional/Supporting Files/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Sources/RxOptional/Supporting Files/RxOptional.h: -------------------------------------------------------------------------------- 1 | // 2 | // RxOptional.h 3 | // RxOptional 4 | // 5 | // Created by muukii on 9/19/16. 6 | // Copyright © 2016 muukii. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for RxOptional. 12 | FOUNDATION_EXPORT double RxOptionalVersionNumber; 13 | 14 | //! Project version string for RxOptional. 15 | FOUNDATION_EXPORT const unsigned char RxOptionalVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /Tests/LinuxMain.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | 3 | import RxOptionalTests 4 | 5 | var tests = [XCTestCaseEntry]() 6 | tests += RxOptionalTests.__allTests() 7 | 8 | XCTMain(tests) 9 | -------------------------------------------------------------------------------- /Tests/RxOptionalTests/OccupiableOperatorsTests.swift: -------------------------------------------------------------------------------- 1 | import Nimble 2 | import Quick 3 | import RxCocoa 4 | import RxOptional 5 | import RxSwift 6 | 7 | class OccupiableOperatorsSpec: QuickSpec { 8 | override func spec() { 9 | describe("filterEmpty") { 10 | context("Observable") { 11 | it("filters out empty arrays") { 12 | Observable<[Int]> 13 | .of([1], [], [3, 4], [5]) 14 | .filterEmpty() 15 | .toArray() 16 | .subscribe(onSuccess: { 17 | expect($0[0]).to(equal([1])) 18 | expect($0[1]).to(equal([3, 4])) 19 | expect($0[2]).to(equal([5])) 20 | }) 21 | .dispose() 22 | } 23 | 24 | it("filters out empty strings") { 25 | Observable 26 | .of("one", "", "three", "four") 27 | .filterEmpty() 28 | .toArray() 29 | .subscribe(onSuccess: { 30 | expect($0).to(equal(["one", "three", "four"])) 31 | }) 32 | .dispose() 33 | } 34 | } 35 | 36 | context("Driver") { 37 | it("filters out empty arrays") { 38 | Driver<[Int]> 39 | .of([1], [], [3, 4], [5]) 40 | .filterEmpty() 41 | .asObservable() 42 | .toArray() 43 | .subscribe(onSuccess: { 44 | expect($0[0]).to(equal([1])) 45 | expect($0[1]).to(equal([3, 4])) 46 | expect($0[2]).to(equal([5])) 47 | }) 48 | .dispose() 49 | } 50 | 51 | it("filters out empty strings") { 52 | Driver 53 | .of("one", "", "three", "four") 54 | .filterEmpty() 55 | .asObservable() 56 | .toArray() 57 | .subscribe(onSuccess: { 58 | expect($0).to(equal(["one", "three", "four"])) 59 | }) 60 | .dispose() 61 | } 62 | } 63 | } 64 | 65 | describe("catchOnEmpty") { 66 | context("Observable") { 67 | it("emits default error") { 68 | Observable<[Int]> 69 | .of([1], [], [3, 4], [5]) 70 | .catchOnEmpty { 71 | Observable<[Int]>.just([2]) 72 | } 73 | .toArray() 74 | .subscribe(onSuccess: { 75 | expect($0[0]).to(equal([1])) 76 | expect($0[1]).to(equal([2])) 77 | expect($0[2]).to(equal([3, 4])) 78 | expect($0[3]).to(equal([5])) 79 | }) 80 | .dispose() 81 | } 82 | } 83 | 84 | context("Driver") { 85 | Driver<[Int]> 86 | .of([1], [], [3, 4], [5]) 87 | .catchOnEmpty { 88 | Driver<[Int]>.just([2]) 89 | } 90 | .asObservable() 91 | .toArray() 92 | .subscribe(onSuccess: { 93 | expect($0[0]).to(equal([1])) 94 | expect($0[1]).to(equal([2])) 95 | expect($0[2]).to(equal([3, 4])) 96 | expect($0[3]).to(equal([5])) 97 | }) 98 | .dispose() 99 | } 100 | } 101 | 102 | describe("errorOnEmpty") { 103 | context("Observable") { 104 | Observable<[Int]> 105 | .of([1], [], [3, 4], [5]) 106 | .errorOnEmpty() 107 | .toArray() 108 | .subscribe { event in 109 | switch event { 110 | case let .success(element): 111 | expect(element[0]).to(equal([1])) 112 | expect(element[1]).to(equal([3, 4])) 113 | expect(element[2]).to(equal([5])) 114 | case let .failure(error): 115 | // FIXME: There should be a better way to do this and to check a more specific error. 116 | expect { throw error } 117 | .to(throwError(errorType: RxOptionalError.self)) 118 | } 119 | } 120 | .dispose() 121 | } 122 | } 123 | } 124 | } 125 | -------------------------------------------------------------------------------- /Tests/RxOptionalTests/OptionalOperatorsTests.swift: -------------------------------------------------------------------------------- 1 | import Nimble 2 | import Quick 3 | import RxCocoa 4 | import RxOptional 5 | import RxSwift 6 | 7 | class OptionalOperatorsSpec: QuickSpec { 8 | override func spec() { 9 | describe("filterNil") { 10 | context("Observable") { 11 | it("unwraps the optional") { 12 | // Check on compile 13 | let _: Observable = Observable 14 | .just(nil) 15 | .filterNil() 16 | } 17 | 18 | it("filters nil values") { 19 | Observable 20 | .of(1, nil, 3, 4) 21 | .filterNil() 22 | .toArray() 23 | .subscribe(onSuccess: { 24 | expect($0).to(equal([1, 3, 4])) 25 | }) 26 | .dispose() 27 | } 28 | 29 | it("filters nil values and keeps types") { 30 | Observable 31 | .of(1, nil, 3, 4) 32 | .filterNilKeepOptional() 33 | .toArray() 34 | .subscribe(onSuccess: { 35 | expect($0).to(equal([1, 3, 4])) 36 | }) 37 | .dispose() 38 | } 39 | } 40 | 41 | context("Driver") { 42 | it("unwraps the optional") { 43 | // Check on compile 44 | let _: Driver = Driver 45 | .just(nil) 46 | .filterNil() 47 | } 48 | 49 | it("filters nil values") { 50 | Driver 51 | .of(1, nil, 3, 4) 52 | .filterNil() 53 | .asObservable() 54 | .toArray() 55 | .subscribe(onSuccess: { 56 | expect($0).to(equal([1, 3, 4])) 57 | }) 58 | .dispose() 59 | } 60 | } 61 | 62 | context("Signal") { 63 | it("unwraps the optional") { 64 | // Check on compile 65 | let _: Signal = Signal 66 | .just(nil) 67 | .filterNil() 68 | } 69 | 70 | it("filters nil values") { 71 | Signal 72 | .of(1, nil, 3, 4) 73 | .filterNil() 74 | .asObservable() 75 | .toArray() 76 | .subscribe(onSuccess: { 77 | expect($0).to(equal([1, 3, 4])) 78 | }) 79 | .dispose() 80 | } 81 | } 82 | } 83 | 84 | describe("Error On Nil") { 85 | context("Observable") { 86 | it("unwraps the optional") { 87 | // Check on compile 88 | let _: Observable = Observable 89 | .just(nil) 90 | .errorOnNil() 91 | } 92 | 93 | it("throws default error") { 94 | Observable 95 | .of(1, nil, 3, 4) 96 | .errorOnNil() 97 | .toArray() 98 | .subscribe { event in 99 | switch event { 100 | case let .success(element): 101 | expect(element).to(equal([1])) 102 | case let .failure(error): 103 | // FIXME: There should be a better way to do this and to check a more specific error. 104 | expect { throw error } 105 | .to(throwError(errorType: RxOptionalError.self)) 106 | } 107 | } 108 | .dispose() 109 | } 110 | } 111 | } 112 | 113 | describe("replaceNilWith") { 114 | context("Observable") { 115 | it("unwraps the optional") { 116 | // Check on compile 117 | let _: Observable = Observable 118 | .just(nil) 119 | .replaceNilWith(0) 120 | } 121 | 122 | it("replaces nil values") { 123 | Observable 124 | .of(1, nil, 3, 4) 125 | .replaceNilWith(2) 126 | .toArray() 127 | .subscribe(onSuccess: { 128 | expect($0).to(equal([1, 2, 3, 4])) 129 | }) 130 | .dispose() 131 | } 132 | } 133 | 134 | context("Driver") { 135 | it("unwraps the optional") { 136 | // Check on compile 137 | let _: Driver = Driver 138 | .just(nil) 139 | .replaceNilWith(0) 140 | } 141 | 142 | it("replaces nil values") { 143 | Driver 144 | .of(1, nil, 3, 4) 145 | .replaceNilWith(2) 146 | .asObservable() 147 | .toArray() 148 | .subscribe(onSuccess: { 149 | expect($0).to(equal([1, 2, 3, 4])) 150 | }) 151 | .dispose() 152 | } 153 | } 154 | } 155 | 156 | describe("catchOnNil") { 157 | context("Observable") { 158 | it("unwraps the optional") { 159 | // Check on compile 160 | let _: Observable = Observable 161 | .just(nil) 162 | .catchOnNil { 163 | Observable.just(0) 164 | } 165 | } 166 | 167 | it("catches nil and continues with new observable") { 168 | Observable 169 | .of(1, nil, 3, 4) 170 | .catchOnNil { 171 | Observable.just(2) 172 | } 173 | .toArray() 174 | .subscribe(onSuccess: { 175 | expect($0).to(equal([1, 2, 3, 4])) 176 | }) 177 | .dispose() 178 | } 179 | } 180 | 181 | context("Driver") { 182 | it("unwraps the optional") { 183 | // Check on compile 184 | let _: Driver = Driver 185 | .just(nil) 186 | .catchOnNil { 187 | Driver.just(0) 188 | } 189 | } 190 | 191 | it("catches nil and continues with new observable") { 192 | Driver 193 | .of(1, nil, 3, 4) 194 | .catchOnNil { 195 | Driver.just(2) 196 | } 197 | .asObservable() 198 | .toArray() 199 | .subscribe(onSuccess: { 200 | expect($0).to(equal([1, 2, 3, 4])) 201 | }) 202 | .dispose() 203 | } 204 | } 205 | } 206 | } 207 | } 208 | -------------------------------------------------------------------------------- /Tests/RxOptionalTests/XCTestManifests.swift: -------------------------------------------------------------------------------- 1 | #if !canImport(ObjectiveC) 2 | import XCTest 3 | 4 | extension OccupiableOperatorsSpec { 5 | // DO NOT MODIFY: This is autogenerated, use: 6 | // `swift test --generate-linuxmain` 7 | // to regenerate. 8 | static let __allTests__OccupiableOperatorsSpec = [ 9 | ("filterEmpty__Observable__filters_out_empty_arrays", filterEmpty__Observable__filters_out_empty_arrays), 10 | ("filterEmpty__Observable__filters_out_empty_strings", filterEmpty__Observable__filters_out_empty_strings), 11 | ("filterEmpty__Driver__filters_out_empty_arrays", filterEmpty__Driver__filters_out_empty_arrays), 12 | ("filterEmpty__Driver__filters_out_empty_strings", filterEmpty__Driver__filters_out_empty_strings), 13 | ("catchOnEmpty__Observable__emits_default_error", catchOnEmpty__Observable__emits_default_error) 14 | ] 15 | } 16 | 17 | extension OptionalOperatorsSpec { 18 | // DO NOT MODIFY: This is autogenerated, use: 19 | // `swift test --generate-linuxmain` 20 | // to regenerate. 21 | static let __allTests__OptionalOperatorsSpec = [ 22 | ("filterNil__Observable__unwraps_the_optional", filterNil__Observable__unwraps_the_optional), 23 | ("filterNil__Observable__filters_nil_values", filterNil__Observable__filters_nil_values), 24 | ("filterNil__Observable__filters_nil_values_and_keeps_types", filterNil__Observable__filters_nil_values_and_keeps_types), 25 | ("filterNil__Driver__unwraps_the_optional", filterNil__Driver__unwraps_the_optional), 26 | ("filterNil__Driver__filters_nil_values", filterNil__Driver__filters_nil_values), 27 | ("filterNil__Signal__unwraps_the_optional", filterNil__Signal__unwraps_the_optional), 28 | ("filterNil__Signal__filters_nil_values", filterNil__Signal__filters_nil_values), 29 | ("Error_On_Nil__Observable__unwraps_the_optional", Error_On_Nil__Observable__unwraps_the_optional), 30 | ("Error_On_Nil__Observable__throws_default_error", Error_On_Nil__Observable__throws_default_error), 31 | ("replaceNilWith__Observable__unwraps_the_optional", replaceNilWith__Observable__unwraps_the_optional), 32 | ("replaceNilWith__Observable__replaces_nil_values", replaceNilWith__Observable__replaces_nil_values), 33 | ("replaceNilWith__Driver__unwraps_the_optional", replaceNilWith__Driver__unwraps_the_optional), 34 | ("replaceNilWith__Driver__replaces_nil_values", replaceNilWith__Driver__replaces_nil_values), 35 | ("catchOnNil__Observable__unwraps_the_optional", catchOnNil__Observable__unwraps_the_optional), 36 | ("catchOnNil__Observable__catches_nil_and_continues_with_new_observable", catchOnNil__Observable__catches_nil_and_continues_with_new_observable), 37 | ("catchOnNil__Driver__unwraps_the_optional", catchOnNil__Driver__unwraps_the_optional), 38 | ("catchOnNil__Driver__catches_nil_and_continues_with_new_observable", catchOnNil__Driver__catches_nil_and_continues_with_new_observable) 39 | ] 40 | } 41 | 42 | public func __allTests() -> [XCTestCaseEntry] { 43 | return [ 44 | testCase(OccupiableOperatorsSpec.__allTests__OccupiableOperatorsSpec), 45 | testCase(OptionalOperatorsSpec.__allTests__OptionalOperatorsSpec) 46 | ] 47 | } 48 | #endif 49 | -------------------------------------------------------------------------------- /cleanup.sh: -------------------------------------------------------------------------------- 1 | if which swiftformat >/dev/null; then 2 | `which swiftformat` "Sources" --config .swiftformat --quiet 3 | `which swiftformat` "Tests" --config .swiftformat --quiet 4 | `which swiftformat` "Package.swift" --config .swiftformat --quiet 5 | `which swiftformat` "RxOptionalExample.playground/Contents.swift" --config .swiftformat --quiet 6 | else 7 | echo "error: swiftformat not installed, do `sh setup.sh` to install swiftformat." 8 | exit 1 9 | fi 10 | 11 | if which swiftlint >/dev/null; then 12 | `which swiftlint` autocorrect --quiet 13 | else 14 | echo "error: SwiftLint not installed, do `sh setup.sh` to install SwiftLint." 15 | exit 1 16 | fi 17 | 18 | if which xcodegen >/dev/null; then 19 | `which xcodegen` --spec project-carthage.yml 20 | else 21 | echo "error: XcodeGen not installed, do `sh setup.sh` to install XcodeGen." 22 | exit 1 23 | fi -------------------------------------------------------------------------------- /pods.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -eo pipefail 3 | export RELEASE_VERSION="$(git describe --abbrev=0 | tr -d '\n')" 4 | RELEASE_VERSION=${RELEASE_VERSION:1} 5 | pod lib lint --allow-warnings 6 | pod trunk push --allow-warnings -------------------------------------------------------------------------------- /project-carthage.yml: -------------------------------------------------------------------------------- 1 | name: RxOptional 2 | options: 3 | minimumXcodeGenVersion: "2.15.1" 4 | developmentLanguage: en 5 | usesTabs: false 6 | indentWidth: 2 7 | tabWidth: 2 8 | xcodeVersion: "1230" 9 | deploymentTarget: 10 | iOS: "10.0" 11 | macOS: "10.10" 12 | tvOS: "10.0" 13 | watchOS: "3.0" 14 | carthageExecutablePath: "`which carthage`" 15 | defaultConfig: "Release" 16 | configs: 17 | Debug: debug 18 | Release: release 19 | attributes: 20 | ORGANIZATIONNAME: RxSwiftCommunity 21 | schemes: 22 | RxOptional iOS: 23 | scheme: {} 24 | build: 25 | parallelizeBuild: true 26 | buildImplicitDependencies: true 27 | targets: 28 | RxOptional iOS: all 29 | RxOptionalTests iOS: [test] 30 | run: 31 | config: Debug 32 | test: 33 | config: Debug 34 | gatherCoverageData: true 35 | targets: 36 | - RxOptionalTests iOS 37 | profile: 38 | config: Release 39 | analyze: 40 | config: Debug 41 | archive: 42 | config: Release 43 | revealArchiveInOrganizer: true 44 | RxOptional macOS: 45 | scheme: {} 46 | build: 47 | parallelizeBuild: true 48 | buildImplicitDependencies: true 49 | targets: 50 | RxOptional macOS: all 51 | RxOptionalTests macOS: [test] 52 | run: 53 | config: Debug 54 | test: 55 | config: Debug 56 | gatherCoverageData: true 57 | targets: 58 | - RxOptionalTests macOS 59 | profile: 60 | config: Release 61 | analyze: 62 | config: Debug 63 | archive: 64 | config: Release 65 | revealArchiveInOrganizer: true 66 | RxOptional watchOS: 67 | scheme: {} 68 | build: 69 | parallelizeBuild: true 70 | buildImplicitDependencies: true 71 | targets: 72 | RxOptional watchOS: all 73 | run: 74 | config: Debug 75 | profile: 76 | config: Release 77 | analyze: 78 | config: Debug 79 | archive: 80 | config: Release 81 | revealArchiveInOrganizer: true 82 | RxOptional tvOS: 83 | scheme: {} 84 | build: 85 | parallelizeBuild: true 86 | buildImplicitDependencies: true 87 | targets: 88 | RxOptional tvOS: all 89 | RxOptionalTests tvOS: [test] 90 | run: 91 | config: Debug 92 | test: 93 | config: Debug 94 | gatherCoverageData: true 95 | targets: 96 | - RxOptionalTests tvOS 97 | profile: 98 | config: Release 99 | analyze: 100 | config: Debug 101 | archive: 102 | config: Release 103 | revealArchiveInOrganizer: true 104 | targets: 105 | RxOptional iOS: 106 | settings: 107 | PRODUCT_NAME: RxOptional 108 | PRODUCT_BUNDLE_IDENTIFIER: RxSwiftCommunity.RxOptional.RxOptional-iOS 109 | BUILD_LIBRARY_FOR_DISTRIBUTION: YES 110 | SKIP_INSTALL: NO 111 | SUPPORTS_MACCATALYST: NO 112 | platform: iOS 113 | type: framework 114 | sources: 115 | - Sources/RxOptional 116 | dependencies: 117 | - carthage: RxCocoa 118 | - carthage: RxSwift 119 | RxOptional macOS: 120 | settings: 121 | PRODUCT_NAME: RxOptional 122 | PRODUCT_BUNDLE_IDENTIFIER: RxSwiftCommunity.RxOptional.RxOptional-macOS 123 | BUILD_LIBRARY_FOR_DISTRIBUTION: YES 124 | SKIP_INSTALL: NO 125 | platform: macOS 126 | type: framework 127 | sources: 128 | - Sources/RxOptional 129 | dependencies: 130 | - carthage: RxCocoa 131 | - carthage: RxSwift 132 | RxOptional tvOS: 133 | settings: 134 | PRODUCT_NAME: RxOptional 135 | PRODUCT_BUNDLE_IDENTIFIER: RxSwiftCommunity.RxOptional.RxOptional-tvOS 136 | BUILD_LIBRARY_FOR_DISTRIBUTION: YES 137 | SKIP_INSTALL: NO 138 | platform: tvOS 139 | type: framework 140 | sources: 141 | - Sources/RxOptional 142 | dependencies: 143 | - carthage: RxCocoa 144 | - carthage: RxSwift 145 | RxOptional watchOS: 146 | settings: 147 | PRODUCT_NAME: RxOptional 148 | PRODUCT_BUNDLE_IDENTIFIER: RxSwiftCommunity.RxOptional.RxOptional-watchOS 149 | BUILD_LIBRARY_FOR_DISTRIBUTION: YES 150 | SKIP_INSTALL: NO 151 | platform: watchOS 152 | type: framework 153 | sources: 154 | - Sources/RxOptional 155 | dependencies: 156 | - carthage: RxCocoa 157 | - carthage: RxSwift 158 | RxOptionalTests iOS: 159 | platform: iOS 160 | type: bundle.unit-test 161 | sources: 162 | - path: Tests/RxOptionalTests 163 | dependencies: 164 | - target: RxOptional iOS 165 | - carthage: Nimble 166 | - carthage: Quick 167 | RxOptionalTests macOS: 168 | platform: macOS 169 | type: bundle.unit-test 170 | settings: 171 | CODE_SIGN_IDENTITY: "" 172 | sources: 173 | - path: Tests/RxOptionalTests 174 | dependencies: 175 | - target: RxOptional macOS 176 | - carthage: Nimble 177 | - carthage: Quick 178 | RxOptionalTests tvOS: 179 | platform: tvOS 180 | type: bundle.unit-test 181 | sources: 182 | - path: Tests/RxOptionalTests 183 | dependencies: 184 | - target: RxOptional tvOS 185 | - carthage: Nimble 186 | - carthage: Quick 187 | -------------------------------------------------------------------------------- /project-spm.yml: -------------------------------------------------------------------------------- 1 | name: RxOptional-SPM 2 | options: 3 | minimumXcodeGenVersion: "2.15.1" 4 | developmentLanguage: en 5 | usesTabs: false 6 | indentWidth: 2 7 | tabWidth: 2 8 | xcodeVersion: "1230" 9 | deploymentTarget: 10 | iOS: "10.0" 11 | macOS: "10.10" 12 | tvOS: "10.0" 13 | watchOS: "3.0" 14 | carthageExecutablePath: "`which carthage`" 15 | defaultConfig: "Release" 16 | configs: 17 | Debug: debug 18 | Release: release 19 | attributes: 20 | ORGANIZATIONNAME: RxSwiftCommunity 21 | schemes: 22 | RxOptional iOS: 23 | scheme: {} 24 | build: 25 | parallelizeBuild: true 26 | buildImplicitDependencies: true 27 | targets: 28 | RxOptional iOS: all 29 | run: 30 | config: Debug 31 | test: 32 | config: Debug 33 | gatherCoverageData: true 34 | profile: 35 | config: Release 36 | analyze: 37 | config: Debug 38 | archive: 39 | config: Release 40 | revealArchiveInOrganizer: true 41 | RxOptional macOS: 42 | scheme: {} 43 | build: 44 | parallelizeBuild: true 45 | buildImplicitDependencies: true 46 | targets: 47 | RxOptional macOS: all 48 | run: 49 | config: Debug 50 | test: 51 | config: Debug 52 | gatherCoverageData: true 53 | profile: 54 | config: Release 55 | analyze: 56 | config: Debug 57 | archive: 58 | config: Release 59 | revealArchiveInOrganizer: true 60 | RxOptional watchOS: 61 | scheme: {} 62 | build: 63 | parallelizeBuild: true 64 | buildImplicitDependencies: true 65 | targets: 66 | RxOptional watchOS: all 67 | run: 68 | config: Debug 69 | profile: 70 | config: Release 71 | analyze: 72 | config: Debug 73 | archive: 74 | config: Release 75 | revealArchiveInOrganizer: true 76 | RxOptional tvOS: 77 | scheme: {} 78 | build: 79 | parallelizeBuild: true 80 | buildImplicitDependencies: true 81 | targets: 82 | RxOptional tvOS: all 83 | run: 84 | config: Debug 85 | test: 86 | config: Debug 87 | gatherCoverageData: true 88 | profile: 89 | config: Release 90 | analyze: 91 | config: Debug 92 | archive: 93 | config: Release 94 | revealArchiveInOrganizer: true 95 | packages: 96 | RxSwift: 97 | url: https://github.com/ReactiveX/RxSwift.git 98 | from: 6.0.0 99 | targets: 100 | RxOptional iOS: 101 | settings: 102 | PRODUCT_NAME: RxOptional 103 | PRODUCT_BUNDLE_IDENTIFIER: RxSwiftCommunity.RxOptional.RxOptional-iOS 104 | BUILD_LIBRARY_FOR_DISTRIBUTION: YES 105 | SKIP_INSTALL: NO 106 | SUPPORTS_MACCATALYST: NO 107 | platform: iOS 108 | type: framework 109 | sources: 110 | - Sources/RxOptional 111 | dependencies: 112 | - package: RxSwift 113 | product: RxSwift 114 | - package: RxSwift 115 | product: RxCocoa 116 | RxOptional macOS: 117 | settings: 118 | PRODUCT_NAME: RxOptional 119 | PRODUCT_BUNDLE_IDENTIFIER: RxSwiftCommunity.RxOptional.RxOptional-macOS 120 | BUILD_LIBRARY_FOR_DISTRIBUTION: YES 121 | SKIP_INSTALL: NO 122 | platform: macOS 123 | type: framework 124 | sources: 125 | - Sources/RxOptional 126 | dependencies: 127 | - package: RxSwift 128 | product: RxSwift 129 | - package: RxSwift 130 | product: RxCocoa 131 | RxOptional tvOS: 132 | settings: 133 | PRODUCT_NAME: RxOptional 134 | PRODUCT_BUNDLE_IDENTIFIER: RxSwiftCommunity.RxOptional.RxOptional-tvOS 135 | BUILD_LIBRARY_FOR_DISTRIBUTION: YES 136 | SKIP_INSTALL: NO 137 | platform: tvOS 138 | type: framework 139 | sources: 140 | - Sources/RxOptional 141 | dependencies: 142 | - package: RxSwift 143 | product: RxSwift 144 | - package: RxSwift 145 | product: RxCocoa 146 | RxOptional watchOS: 147 | settings: 148 | PRODUCT_NAME: RxOptional 149 | PRODUCT_BUNDLE_IDENTIFIER: RxSwiftCommunity.RxOptional.RxOptional-watchOS 150 | BUILD_LIBRARY_FOR_DISTRIBUTION: YES 151 | SKIP_INSTALL: NO 152 | platform: watchOS 153 | type: framework 154 | sources: 155 | - Sources/RxOptional 156 | dependencies: 157 | - package: RxSwift 158 | product: RxSwift 159 | - package: RxSwift 160 | product: RxCocoa 161 | -------------------------------------------------------------------------------- /scripts/bump-version.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | git config --global user.name "RxOptional Maintainers" 5 | git config --global user.email "rxoptional@rxswift.org" 6 | npx standard-version 7 | echo "RELEASE_VERSION=$(git describe --abbrev=0 | tr -d '\n')" >> $GITHUB_ENV 8 | export VERSION="$(git describe --abbrev=0 | tr -d '\n')" 9 | VERSION=${VERSION:1} 10 | echo $VERSION 11 | npx podspec-bump -w -i "$VERSION" 12 | git add -A 13 | git commit --amend --no-edit -------------------------------------------------------------------------------- /scripts/carthage.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # carthage.sh 4 | # Usage example: ./carthage.sh build --platform iOS 5 | 6 | set -euo pipefail 7 | 8 | xcconfig=$(mktemp /tmp/static.xcconfig.XXXXXX) 9 | trap 'rm -f "$xcconfig"' INT TERM HUP EXIT 10 | 11 | # For Xcode 12 make sure EXCLUDED_ARCHS is set to arm architectures otherwise 12 | # the build will fail on lipo due to duplicate architectures. 13 | 14 | CURRENT_XCODE_VERSION=$(xcodebuild -version | grep "Build version" | cut -d' ' -f3) 15 | echo "EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64__XCODE_1200__BUILD_$CURRENT_XCODE_VERSION = arm64 arm64e armv7 armv7s armv6 armv8" >> $xcconfig 16 | 17 | echo 'EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64__XCODE_1200 = $(EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64__XCODE_1200__BUILD_$(XCODE_PRODUCT_BUILD_VERSION))' >> $xcconfig 18 | echo 'EXCLUDED_ARCHS = $(inherited) $(EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_$(EFFECTIVE_PLATFORM_SUFFIX)__NATIVE_ARCH_64_BIT_$(NATIVE_ARCH_64_BIT)__XCODE_$(XCODE_VERSION_MAJOR))' >> $xcconfig 19 | 20 | export XCODE_XCCONFIG_FILE="$xcconfig" 21 | carthage build "$@" -------------------------------------------------------------------------------- /scripts/xcframeworks.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -euo pipefail 4 | rm -rf RxOptional-SPM.xcodeproj 5 | rm -rf xcarchives/* 6 | rm -rf RxOptional.xcframework.zip 7 | rm -rf RxOptional.xcframework 8 | 9 | xcodegen --spec project-spm.yml 10 | 11 | xcodebuild archive -quiet -project RxOptional-SPM.xcodeproj -configuration Release -scheme "RxOptional iOS" -destination "generic/platform=iOS" -archivePath "xcarchives/RxOptional-iOS" SKIP_INSTALL=NO SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES OTHER_CFLAGS="-fembed-bitcode" BITCODE_GENERATION_MODE="bitcode" ENABLE_BITCODE=YES | xcpretty --color --simple 12 | xcodebuild archive -quiet -project RxOptional-SPM.xcodeproj -configuration Release -scheme "RxOptional iOS" -destination "generic/platform=iOS Simulator" -archivePath "xcarchives/RxOptional-iOS-Simulator" SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES OTHER_CFLAGS="-fembed-bitcode" BITCODE_GENERATION_MODE="bitcode" ENABLE_BITCODE=YES | xcpretty --color --simple 13 | xcodebuild archive -quiet -project RxOptional-SPM.xcodeproj -configuration Release -scheme "RxOptional tvOS" -destination "generic/platform=tvOS" -archivePath "xcarchives/RxOptional-tvOS" SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES OTHER_CFLAGS="-fembed-bitcode" BITCODE_GENERATION_MODE="bitcode" ENABLE_BITCODE=YES | xcpretty --color --simple 14 | xcodebuild archive -quiet -project RxOptional-SPM.xcodeproj -configuration Release -scheme "RxOptional tvOS" -destination "generic/platform=tvOS Simulator" -archivePath "xcarchives/RxOptional-tvOS-Simulator" SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES OTHER_CFLAGS="-fembed-bitcode" BITCODE_GENERATION_MODE="bitcode" ENABLE_BITCODE=YES | xcpretty --color --simple 15 | xcodebuild archive -quiet -project RxOptional-SPM.xcodeproj -configuration Release -scheme "RxOptional macOS" -destination "generic/platform=macOS" -archivePath "xcarchives/RxOptional-macOS" SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES OTHER_CFLAGS="-fembed-bitcode" BITCODE_GENERATION_MODE="bitcode" ENABLE_BITCODE=YES | xcpretty --color --simple 16 | xcodebuild archive -quiet -project RxOptional-SPM.xcodeproj -configuration Release -scheme "RxOptional watchOS" -destination "generic/platform=watchOS" -archivePath "xcarchives/RxOptional-watchOS" SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES OTHER_CFLAGS="-fembed-bitcode" BITCODE_GENERATION_MODE="bitcode" ENABLE_BITCODE=YES | xcpretty --color --simple 17 | xcodebuild archive -quiet -project RxOptional-SPM.xcodeproj -configuration Release -scheme "RxOptional watchOS" -destination "generic/platform=watchOS Simulator" -archivePath "xcarchives/RxOptional-watchOS-Simulator" SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES OTHER_CFLAGS="-fembed-bitcode" BITCODE_GENERATION_MODE="bitcode" ENABLE_BITCODE=YES | xcpretty --color --simple 18 | 19 | xcodebuild -create-xcframework \ 20 | -framework "xcarchives/RxOptional-iOS-Simulator.xcarchive/Products/Library/Frameworks/RxOptional.framework" \ 21 | -debug-symbols ""$(pwd)"/xcarchives/RxOptional-iOS-Simulator.xcarchive/dSYMs/RxOptional.framework.dSYM" \ 22 | -framework "xcarchives/RxOptional-iOS.xcarchive/Products/Library/Frameworks/RxOptional.framework" \ 23 | -debug-symbols ""$(pwd)"/xcarchives/RxOptional-iOS.xcarchive/dSYMs/RxOptional.framework.dSYM" \ 24 | -framework "xcarchives/RxOptional-tvOS-Simulator.xcarchive/Products/Library/Frameworks/RxOptional.framework" \ 25 | -debug-symbols ""$(pwd)"/xcarchives/RxOptional-tvOS-Simulator.xcarchive/dSYMs/RxOptional.framework.dSYM" \ 26 | -framework "xcarchives/RxOptional-tvOS.xcarchive/Products/Library/Frameworks/RxOptional.framework" \ 27 | -debug-symbols ""$(pwd)"/xcarchives/RxOptional-tvOS.xcarchive/dSYMs/RxOptional.framework.dSYM" \ 28 | -framework "xcarchives/RxOptional-macOS.xcarchive/Products/Library/Frameworks/RxOptional.framework" \ 29 | -debug-symbols ""$(pwd)"/xcarchives/RxOptional-macOS.xcarchive/dSYMs/RxOptional.framework.dSYM" \ 30 | -framework "xcarchives/RxOptional-watchOS-Simulator.xcarchive/Products/Library/Frameworks/RxOptional.framework" \ 31 | -debug-symbols ""$(pwd)"/xcarchives/RxOptional-watchOS-Simulator.xcarchive/dSYMs/RxOptional.framework.dSYM" \ 32 | -framework "xcarchives/RxOptional-watchOS.xcarchive/Products/Library/Frameworks/RxOptional.framework" \ 33 | -debug-symbols ""$(pwd)"/xcarchives/RxOptional-watchOS.xcarchive/dSYMs/RxOptional.framework.dSYM" \ 34 | -output "RxOptional.xcframework" 35 | 36 | zip -r RxOptional.xcframework.zip RxOptional.xcframework 37 | rm -rf xcarchives/* 38 | rm -rf RxOptional.xcframework 39 | rm -rf RxOptional-SPM.xcodeproj --------------------------------------------------------------------------------