├── .gitignore ├── .travis.yml ├── Cartfile ├── Cartfile.resolved ├── LICENSE ├── Package.swift ├── README.md ├── RxBiBinding macOS ├── Info.plist └── RxBiBinding_macOS.h ├── RxBiBinding.podspec ├── RxBiBinding.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcshareddata │ └── xcschemes │ ├── RxBiBinding macOS.xcscheme │ └── RxBiBinding.xcscheme ├── RxBiBinding.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── RxBiBinding ├── Assets │ └── .gitkeep ├── Classes │ ├── .gitkeep │ ├── AnyObservableType.swift │ ├── RxChannel.swift │ └── RxChannelTerminal.swift ├── Info.plist └── RxBiBinding.h ├── RxBiBindingTests ├── Info.plist └── RxBiBindingTests.swift └── carthage.sh /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X 2 | .DS_Store 3 | 4 | # Xcode 5 | .swiftpm/ 6 | build/ 7 | *.pbxuser 8 | !default.pbxuser 9 | *.mode1v3 10 | !default.mode1v3 11 | *.mode2v3 12 | !default.mode2v3 13 | *.perspectivev3 14 | !default.perspectivev3 15 | xcuserdata/ 16 | *.xccheckout 17 | profile 18 | *.moved-aside 19 | DerivedData 20 | *.hmap 21 | *.ipa 22 | *~ 23 | .build/ 24 | Package.resolved 25 | 26 | # Bundler 27 | .bundle 28 | 29 | # Add this line if you want to avoid checking in source code from Carthage dependencies. 30 | Carthage/Checkouts 31 | Carthage/Build 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 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control 36 | # 37 | # Note: if you ignore the Pods directory, make sure to uncomment 38 | # `pod install` in .travis.yml 39 | # 40 | Pods/ 41 | Podfile.lock 42 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | osx_image: xcode12.2 2 | language: swift 3 | 4 | install: true 5 | 6 | env: 7 | - BUILD="gem install cocoapods --pre --no-rdoc --no-ri --no-document --quiet; pod repo update && pod lib lint RxBiBinding.podspec --verbose --allow-warnings" 8 | - BUILD="./carthage.sh build --platform iOS" 9 | - BUILD="carthage update --platform macOS && carthage build --no-skip-current --platform macOS" 10 | 11 | script: eval "${BUILD}" 12 | -------------------------------------------------------------------------------- /Cartfile: -------------------------------------------------------------------------------- 1 | github "ReactiveX/RxSwift" ~> 6.0 2 | -------------------------------------------------------------------------------- /Cartfile.resolved: -------------------------------------------------------------------------------- 1 | github "ReactiveX/RxSwift" "6.0.0" 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) RxSwiftCommunity 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 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.0 2 | 3 | import PackageDescription 4 | 5 | let package = Package( 6 | name: "RxBiBinding", 7 | platforms: [ 8 | .macOS(.v10_10), .iOS(.v10) 9 | ], 10 | products: [ 11 | .library( 12 | name: "RxBiBinding", 13 | targets: ["RxBiBinding"] 14 | ) 15 | ], 16 | dependencies: [ 17 | .package(url: "https://github.com/ReactiveX/RxSwift.git", from: "6.0.0" ) 18 | ], 19 | targets: [ 20 | .target( 21 | name: "RxBiBinding", 22 | dependencies: ["RxSwift", "RxCocoa"], 23 | path: "RxBiBinding" 24 | ) 25 | ] 26 | ) 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RxBiBinding 2 | 3 | [![Build Status](https://travis-ci.org/RxSwiftCommunity/RxBiBinding.svg?branch=master)](https://travis-ci.org/RxSwiftCommunity/RxBiBinding) 4 | [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 5 | [![Version](https://img.shields.io/cocoapods/v/RxBiBinding.svg?style=flat)](https://cocoapods.org/pods/RxBiBinding) 6 | [![License](https://img.shields.io/cocoapods/l/RxBiBinding.svg?style=flat)](https://cocoapods.org/pods/RxBiBinding) 7 | [![Platform](https://img.shields.io/cocoapods/p/RxBiBinding.svg?style=flat)](https://cocoapods.org/pods/RxBiBinding) 8 | 9 | ## Example 10 | 11 | Binding between two ControlProperty 12 | ```swift 13 | let disposeBag = DisposeBag() 14 | 15 | var textFieldFirst = UITextField() 16 | var textFieldSecond = UITextField() 17 | 18 | (textFieldFirst.rx.text <-> textFieldSecond.rx.text).disposed(by: disposeBag) 19 | ``` 20 | 21 | Binding between two BehaviorRelay 22 | ```swift 23 | let disposeBag = DisposeBag() 24 | 25 | var textFirst = BehaviorRelay(value: "") 26 | var textSecond = BehaviorRelay(value: "") 27 | 28 | (textFirst <-> textSecond).disposed(by: disposeBag) 29 | ``` 30 | 31 | Binding between ControlProperty and BehaviorRelay 32 | ```swift 33 | let disposeBag = DisposeBag() 34 | 35 | var text = BehaviorRelay(value: "") 36 | var textField = UITextField() 37 | 38 | (textField.rx.text <-> text).disposed(by: disposeBag) 39 | ``` 40 | 41 | ## Requirements 42 | 43 | iOS >= 10 44 | 45 | ## Installation 46 | 47 | RxBiBinding is available through [CocoaPods](https://cocoapods.org). To install 48 | it, simply add the following line to your Podfile: 49 | 50 | ```ruby 51 | pod 'RxBiBinding' 52 | ``` 53 | 54 | Carthage 55 | ``` 56 | carthage update --platform ios 57 | ``` 58 | 59 | ## Thanks 60 | 61 | This solution is based on [ReactiveCocoa](https://github.com/ReactiveCocoa/ReactiveCocoa) (Obj-C version) 62 | 63 | ## License 64 | 65 | RxBiBinding is available under the MIT license. See the LICENSE file for more info. 66 | Copyright (c) RxSwiftCommunity 67 | -------------------------------------------------------------------------------- /RxBiBinding macOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 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 | $(MARKETING_VERSION) 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSHumanReadableCopyright 22 | Copyright © 2019 xyz.amakushkin.RxBiBinding. All rights reserved. 23 | 24 | 25 | -------------------------------------------------------------------------------- /RxBiBinding macOS/RxBiBinding_macOS.h: -------------------------------------------------------------------------------- 1 | // 2 | // RxBiBinding_macOS.h 3 | // RxBiBinding macOS 4 | // 5 | // Created by Александр Макушкин on 26/05/2019. 6 | // Copyright © 2019 xyz.amakushkin.RxBiBinding. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for RxBiBinding_macOS. 12 | FOUNDATION_EXPORT double RxBiBinding_macOSVersionNumber; 13 | 14 | //! Project version string for RxBiBinding_macOS. 15 | FOUNDATION_EXPORT const unsigned char RxBiBinding_macOSVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /RxBiBinding.podspec: -------------------------------------------------------------------------------- 1 | # 2 | # Be sure to run `pod lib lint RxBiBinding.podspec' to ensure this is a 3 | # valid spec before submitting. 4 | # 5 | # Any lines starting with a # are optional, but their use is encouraged 6 | # To learn more about a Podspec see https://guides.cocoapods.org/syntax/podspec.html 7 | # 8 | 9 | Pod::Spec.new do |s| 10 | s.name = 'RxBiBinding' 11 | s.version = '0.3.5' 12 | s.summary = 'Bidirectional binding. Inspired by ReactiveCocoa' 13 | 14 | # This description is used to generate tags and improve search results. 15 | # * Think: What does it do? Why did you write it? What is the focus? 16 | # * Try to keep it short, snappy and to the point. 17 | # * Write the description between the DESC delimiters below. 18 | # * Finally, don't worry about the indent, CocoaPods strips it! 19 | 20 | s.description = <<-DESC 21 | Reactive bidirectional (two-way) binding between RxControlProperties and RxVariables. Of course you can use this library and for NSObject 22 | DESC 23 | 24 | s.homepage = 'https://github.com/RxSwiftCommunity/RxBiBinding' 25 | # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' 26 | s.license = { :type => 'MIT', :file => 'LICENSE' } 27 | s.author = { 'Davarg' => 'maka-dava@yandex.ru' } 28 | s.source = { :git => 'https://github.com/RxSwiftCommunity/RxBiBinding.git', :tag => s.version.to_s } 29 | s.social_media_url = 'https://twitter.com/Underbridgins' 30 | 31 | s.ios.deployment_target = '10.0' 32 | s.osx.deployment_target = '10.9' 33 | s.swift_version = '5.0' 34 | s.source_files = 'RxBiBinding/Classes/**/*' 35 | 36 | # s.resource_bundles = { 37 | # 'RxBiBinding' => ['RxBiBinding/Assets/*.png'] 38 | # } 39 | 40 | # s.public_header_files = 'Pod/Classes/**/*.h' 41 | # s.frameworks = 'UIKit', 'MapKit' 42 | s.dependency "RxSwift", "~> 6.0" 43 | s.dependency "RxCocoa", "~> 6.0" 44 | end 45 | -------------------------------------------------------------------------------- /RxBiBinding.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 50; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | D911417E21688EBC007FB459 /* RxBiBinding.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D911417421688EBC007FB459 /* RxBiBinding.framework */; }; 11 | D911418321688EBC007FB459 /* RxBiBindingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = D911418221688EBC007FB459 /* RxBiBindingTests.swift */; }; 12 | D911418521688EBC007FB459 /* RxBiBinding.h in Headers */ = {isa = PBXBuildFile; fileRef = D911417721688EBC007FB459 /* RxBiBinding.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 | D911419321688F58007FB459 /* AnyObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = D911418E21688F58007FB459 /* AnyObservableType.swift */; }; 14 | D911419421688F58007FB459 /* AnyObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = D911418E21688F58007FB459 /* AnyObservableType.swift */; }; 15 | D911419921688F58007FB459 /* RxChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D911419121688F58007FB459 /* RxChannel.swift */; }; 16 | D911419A21688F58007FB459 /* RxChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D911419121688F58007FB459 /* RxChannel.swift */; }; 17 | D911419B21688F58007FB459 /* RxChannelTerminal.swift in Sources */ = {isa = PBXBuildFile; fileRef = D911419221688F58007FB459 /* RxChannelTerminal.swift */; }; 18 | D911419C21688F58007FB459 /* RxChannelTerminal.swift in Sources */ = {isa = PBXBuildFile; fileRef = D911419221688F58007FB459 /* RxChannelTerminal.swift */; }; 19 | D9250AFA22A3A57D00DD96BC /* RxCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 30A70930216E12AE0056D6A8 /* RxCocoa.framework */; }; 20 | D9250AFB22A3A57D00DD96BC /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 30A7092F216E12AE0056D6A8 /* RxSwift.framework */; }; 21 | D9250AFE22A3A59200DD96BC /* RxSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D9250AFC22A3A59200DD96BC /* RxSwift.framework */; }; 22 | D9250AFF22A3A59200DD96BC /* RxCocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D9250AFD22A3A59200DD96BC /* RxCocoa.framework */; }; 23 | D9250B0022A3A5AD00DD96BC /* AnyObservableType.swift in Sources */ = {isa = PBXBuildFile; fileRef = D911418E21688F58007FB459 /* AnyObservableType.swift */; }; 24 | D9250B0122A3A5AD00DD96BC /* RxChannel.swift in Sources */ = {isa = PBXBuildFile; fileRef = D911419121688F58007FB459 /* RxChannel.swift */; }; 25 | D9250B0222A3A5AD00DD96BC /* RxChannelTerminal.swift in Sources */ = {isa = PBXBuildFile; fileRef = D911419221688F58007FB459 /* RxChannelTerminal.swift */; }; 26 | D9250B0322A3A5AD00DD96BC /* RxBiBinding.h in Headers */ = {isa = PBXBuildFile; fileRef = D911417721688EBC007FB459 /* RxBiBinding.h */; }; 27 | D9FD6739229AFEA400A75585 /* RxBiBinding_macOS.h in Headers */ = {isa = PBXBuildFile; fileRef = D9FD6737229AFEA400A75585 /* RxBiBinding_macOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; 28 | /* End PBXBuildFile section */ 29 | 30 | /* Begin PBXContainerItemProxy section */ 31 | D911417F21688EBC007FB459 /* PBXContainerItemProxy */ = { 32 | isa = PBXContainerItemProxy; 33 | containerPortal = D911416B21688EBB007FB459 /* Project object */; 34 | proxyType = 1; 35 | remoteGlobalIDString = D911417321688EBC007FB459; 36 | remoteInfo = RxBiBinding; 37 | }; 38 | /* End PBXContainerItemProxy section */ 39 | 40 | /* Begin PBXFileReference section */ 41 | 30A7092F216E12AE0056D6A8 /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = Carthage/Build/iOS/RxSwift.framework; sourceTree = ""; }; 42 | 30A70930216E12AE0056D6A8 /* RxCocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxCocoa.framework; path = Carthage/Build/iOS/RxCocoa.framework; sourceTree = ""; }; 43 | D911417421688EBC007FB459 /* RxBiBinding.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxBiBinding.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | D911417721688EBC007FB459 /* RxBiBinding.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RxBiBinding.h; sourceTree = ""; }; 45 | D911417821688EBC007FB459 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 46 | D911417D21688EBC007FB459 /* RxBiBindingTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RxBiBindingTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 47 | D911418221688EBC007FB459 /* RxBiBindingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RxBiBindingTests.swift; sourceTree = ""; }; 48 | D911418421688EBC007FB459 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 49 | D911418E21688F58007FB459 /* AnyObservableType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnyObservableType.swift; sourceTree = ""; }; 50 | D911419121688F58007FB459 /* RxChannel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxChannel.swift; sourceTree = ""; }; 51 | D911419221688F58007FB459 /* RxChannelTerminal.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RxChannelTerminal.swift; sourceTree = ""; }; 52 | D9250AFC22A3A59200DD96BC /* RxSwift.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxSwift.framework; path = Carthage/Build/Mac/RxSwift.framework; sourceTree = ""; }; 53 | D9250AFD22A3A59200DD96BC /* RxCocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = RxCocoa.framework; path = Carthage/Build/Mac/RxCocoa.framework; sourceTree = ""; }; 54 | D9FD6735229AFEA400A75585 /* RxBiBinding_macOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RxBiBinding_macOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 55 | D9FD6737229AFEA400A75585 /* RxBiBinding_macOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RxBiBinding_macOS.h; sourceTree = ""; }; 56 | D9FD6738229AFEA400A75585 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 57 | /* End PBXFileReference section */ 58 | 59 | /* Begin PBXFrameworksBuildPhase section */ 60 | D911417121688EBC007FB459 /* Frameworks */ = { 61 | isa = PBXFrameworksBuildPhase; 62 | buildActionMask = 2147483647; 63 | files = ( 64 | D9250AFA22A3A57D00DD96BC /* RxCocoa.framework in Frameworks */, 65 | D9250AFB22A3A57D00DD96BC /* RxSwift.framework in Frameworks */, 66 | ); 67 | runOnlyForDeploymentPostprocessing = 0; 68 | }; 69 | D911417A21688EBC007FB459 /* Frameworks */ = { 70 | isa = PBXFrameworksBuildPhase; 71 | buildActionMask = 2147483647; 72 | files = ( 73 | D911417E21688EBC007FB459 /* RxBiBinding.framework in Frameworks */, 74 | ); 75 | runOnlyForDeploymentPostprocessing = 0; 76 | }; 77 | D9FD6732229AFEA400A75585 /* Frameworks */ = { 78 | isa = PBXFrameworksBuildPhase; 79 | buildActionMask = 2147483647; 80 | files = ( 81 | D9250AFE22A3A59200DD96BC /* RxSwift.framework in Frameworks */, 82 | D9250AFF22A3A59200DD96BC /* RxCocoa.framework in Frameworks */, 83 | ); 84 | runOnlyForDeploymentPostprocessing = 0; 85 | }; 86 | /* End PBXFrameworksBuildPhase section */ 87 | 88 | /* Begin PBXGroup section */ 89 | 30A7092E216E12AE0056D6A8 /* Frameworks */ = { 90 | isa = PBXGroup; 91 | children = ( 92 | D9250AFD22A3A59200DD96BC /* RxCocoa.framework */, 93 | D9250AFC22A3A59200DD96BC /* RxSwift.framework */, 94 | 30A70930216E12AE0056D6A8 /* RxCocoa.framework */, 95 | 30A7092F216E12AE0056D6A8 /* RxSwift.framework */, 96 | ); 97 | name = Frameworks; 98 | sourceTree = ""; 99 | }; 100 | D911416A21688EBB007FB459 = { 101 | isa = PBXGroup; 102 | children = ( 103 | D911417621688EBC007FB459 /* RxBiBinding */, 104 | D911418121688EBC007FB459 /* RxBiBindingTests */, 105 | D9FD6736229AFEA400A75585 /* RxBiBinding macOS */, 106 | D911417521688EBC007FB459 /* Products */, 107 | 30A7092E216E12AE0056D6A8 /* Frameworks */, 108 | F9A60825CDFB401F5615FC38 /* Pods */, 109 | ); 110 | sourceTree = ""; 111 | }; 112 | D911417521688EBC007FB459 /* Products */ = { 113 | isa = PBXGroup; 114 | children = ( 115 | D911417421688EBC007FB459 /* RxBiBinding.framework */, 116 | D911417D21688EBC007FB459 /* RxBiBindingTests.xctest */, 117 | D9FD6735229AFEA400A75585 /* RxBiBinding_macOS.framework */, 118 | ); 119 | name = Products; 120 | sourceTree = ""; 121 | }; 122 | D911417621688EBC007FB459 /* RxBiBinding */ = { 123 | isa = PBXGroup; 124 | children = ( 125 | D911419D2168910D007FB459 /* Classes */, 126 | D911417721688EBC007FB459 /* RxBiBinding.h */, 127 | D911417821688EBC007FB459 /* Info.plist */, 128 | ); 129 | path = RxBiBinding; 130 | sourceTree = ""; 131 | }; 132 | D911418121688EBC007FB459 /* RxBiBindingTests */ = { 133 | isa = PBXGroup; 134 | children = ( 135 | D911418221688EBC007FB459 /* RxBiBindingTests.swift */, 136 | D911418421688EBC007FB459 /* Info.plist */, 137 | ); 138 | path = RxBiBindingTests; 139 | sourceTree = ""; 140 | }; 141 | D911419D2168910D007FB459 /* Classes */ = { 142 | isa = PBXGroup; 143 | children = ( 144 | D911418E21688F58007FB459 /* AnyObservableType.swift */, 145 | D911419121688F58007FB459 /* RxChannel.swift */, 146 | D911419221688F58007FB459 /* RxChannelTerminal.swift */, 147 | ); 148 | path = Classes; 149 | sourceTree = ""; 150 | }; 151 | D9FD6736229AFEA400A75585 /* RxBiBinding macOS */ = { 152 | isa = PBXGroup; 153 | children = ( 154 | D9FD6737229AFEA400A75585 /* RxBiBinding_macOS.h */, 155 | D9FD6738229AFEA400A75585 /* Info.plist */, 156 | ); 157 | path = "RxBiBinding macOS"; 158 | sourceTree = ""; 159 | }; 160 | F9A60825CDFB401F5615FC38 /* Pods */ = { 161 | isa = PBXGroup; 162 | children = ( 163 | ); 164 | path = Pods; 165 | sourceTree = ""; 166 | }; 167 | /* End PBXGroup section */ 168 | 169 | /* Begin PBXHeadersBuildPhase section */ 170 | D911416F21688EBC007FB459 /* Headers */ = { 171 | isa = PBXHeadersBuildPhase; 172 | buildActionMask = 2147483647; 173 | files = ( 174 | D911418521688EBC007FB459 /* RxBiBinding.h in Headers */, 175 | ); 176 | runOnlyForDeploymentPostprocessing = 0; 177 | }; 178 | D9FD6730229AFEA400A75585 /* Headers */ = { 179 | isa = PBXHeadersBuildPhase; 180 | buildActionMask = 2147483647; 181 | files = ( 182 | D9FD6739229AFEA400A75585 /* RxBiBinding_macOS.h in Headers */, 183 | D9250B0322A3A5AD00DD96BC /* RxBiBinding.h in Headers */, 184 | ); 185 | runOnlyForDeploymentPostprocessing = 0; 186 | }; 187 | /* End PBXHeadersBuildPhase section */ 188 | 189 | /* Begin PBXNativeTarget section */ 190 | D911417321688EBC007FB459 /* RxBiBinding */ = { 191 | isa = PBXNativeTarget; 192 | buildConfigurationList = D911418821688EBC007FB459 /* Build configuration list for PBXNativeTarget "RxBiBinding" */; 193 | buildPhases = ( 194 | D911416F21688EBC007FB459 /* Headers */, 195 | D911417021688EBC007FB459 /* Sources */, 196 | D911417121688EBC007FB459 /* Frameworks */, 197 | D911417221688EBC007FB459 /* Resources */, 198 | 30A70933216E15A80056D6A8 /* ShellScript */, 199 | ); 200 | buildRules = ( 201 | ); 202 | dependencies = ( 203 | ); 204 | name = RxBiBinding; 205 | productName = RxBiBinding; 206 | productReference = D911417421688EBC007FB459 /* RxBiBinding.framework */; 207 | productType = "com.apple.product-type.framework"; 208 | }; 209 | D911417C21688EBC007FB459 /* RxBiBindingTests */ = { 210 | isa = PBXNativeTarget; 211 | buildConfigurationList = D911418B21688EBC007FB459 /* Build configuration list for PBXNativeTarget "RxBiBindingTests" */; 212 | buildPhases = ( 213 | D911417921688EBC007FB459 /* Sources */, 214 | D911417A21688EBC007FB459 /* Frameworks */, 215 | D911417B21688EBC007FB459 /* Resources */, 216 | ); 217 | buildRules = ( 218 | ); 219 | dependencies = ( 220 | D911418021688EBC007FB459 /* PBXTargetDependency */, 221 | ); 222 | name = RxBiBindingTests; 223 | productName = RxBiBindingTests; 224 | productReference = D911417D21688EBC007FB459 /* RxBiBindingTests.xctest */; 225 | productType = "com.apple.product-type.bundle.unit-test"; 226 | }; 227 | D9FD6734229AFEA400A75585 /* RxBiBinding macOS */ = { 228 | isa = PBXNativeTarget; 229 | buildConfigurationList = D9FD673A229AFEA400A75585 /* Build configuration list for PBXNativeTarget "RxBiBinding macOS" */; 230 | buildPhases = ( 231 | D9FD6730229AFEA400A75585 /* Headers */, 232 | D9FD6731229AFEA400A75585 /* Sources */, 233 | D9FD6732229AFEA400A75585 /* Frameworks */, 234 | D9FD6733229AFEA400A75585 /* Resources */, 235 | ); 236 | buildRules = ( 237 | ); 238 | dependencies = ( 239 | ); 240 | name = "RxBiBinding macOS"; 241 | productName = "RxBiBinding macOS"; 242 | productReference = D9FD6735229AFEA400A75585 /* RxBiBinding_macOS.framework */; 243 | productType = "com.apple.product-type.framework"; 244 | }; 245 | /* End PBXNativeTarget section */ 246 | 247 | /* Begin PBXProject section */ 248 | D911416B21688EBB007FB459 /* Project object */ = { 249 | isa = PBXProject; 250 | attributes = { 251 | LastSwiftUpdateCheck = 1000; 252 | LastUpgradeCheck = 1000; 253 | ORGANIZATIONNAME = xyz.amakushkin.RxBiBinding; 254 | TargetAttributes = { 255 | D911417321688EBC007FB459 = { 256 | CreatedOnToolsVersion = 10.0; 257 | LastSwiftMigration = 1000; 258 | }; 259 | D911417C21688EBC007FB459 = { 260 | CreatedOnToolsVersion = 10.0; 261 | }; 262 | D9FD6734229AFEA400A75585 = { 263 | CreatedOnToolsVersion = 10.2; 264 | }; 265 | }; 266 | }; 267 | buildConfigurationList = D911416E21688EBB007FB459 /* Build configuration list for PBXProject "RxBiBinding" */; 268 | compatibilityVersion = "Xcode 9.3"; 269 | developmentRegion = en; 270 | hasScannedForEncodings = 0; 271 | knownRegions = ( 272 | en, 273 | ); 274 | mainGroup = D911416A21688EBB007FB459; 275 | productRefGroup = D911417521688EBC007FB459 /* Products */; 276 | projectDirPath = ""; 277 | projectRoot = ""; 278 | targets = ( 279 | D911417321688EBC007FB459 /* RxBiBinding */, 280 | D911417C21688EBC007FB459 /* RxBiBindingTests */, 281 | D9FD6734229AFEA400A75585 /* RxBiBinding macOS */, 282 | ); 283 | }; 284 | /* End PBXProject section */ 285 | 286 | /* Begin PBXResourcesBuildPhase section */ 287 | D911417221688EBC007FB459 /* Resources */ = { 288 | isa = PBXResourcesBuildPhase; 289 | buildActionMask = 2147483647; 290 | files = ( 291 | ); 292 | runOnlyForDeploymentPostprocessing = 0; 293 | }; 294 | D911417B21688EBC007FB459 /* Resources */ = { 295 | isa = PBXResourcesBuildPhase; 296 | buildActionMask = 2147483647; 297 | files = ( 298 | ); 299 | runOnlyForDeploymentPostprocessing = 0; 300 | }; 301 | D9FD6733229AFEA400A75585 /* Resources */ = { 302 | isa = PBXResourcesBuildPhase; 303 | buildActionMask = 2147483647; 304 | files = ( 305 | ); 306 | runOnlyForDeploymentPostprocessing = 0; 307 | }; 308 | /* End PBXResourcesBuildPhase section */ 309 | 310 | /* Begin PBXShellScriptBuildPhase section */ 311 | 30A70933216E15A80056D6A8 /* ShellScript */ = { 312 | isa = PBXShellScriptBuildPhase; 313 | buildActionMask = 2147483647; 314 | files = ( 315 | ); 316 | inputPaths = ( 317 | "$(SRCROOT)/Carthage/Build/iOS/RxSwift.framework", 318 | "$(SRCROOT)/Carthage/Build/iOS/RxCocoa.framework", 319 | ); 320 | outputPaths = ( 321 | "$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/RxSwift.framework", 322 | "$(BUILT_PRODUCTS_DIR)/$(FRAMEWORKS_FOLDER_PATH)/RxCocoa.framework", 323 | ); 324 | runOnlyForDeploymentPostprocessing = 0; 325 | shellPath = /bin/sh; 326 | shellScript = "/usr/local/bin/carthage copy-frameworks\n"; 327 | }; 328 | /* End PBXShellScriptBuildPhase section */ 329 | 330 | /* Begin PBXSourcesBuildPhase section */ 331 | D911417021688EBC007FB459 /* Sources */ = { 332 | isa = PBXSourcesBuildPhase; 333 | buildActionMask = 2147483647; 334 | files = ( 335 | D911419321688F58007FB459 /* AnyObservableType.swift in Sources */, 336 | D911419921688F58007FB459 /* RxChannel.swift in Sources */, 337 | D911419B21688F58007FB459 /* RxChannelTerminal.swift in Sources */, 338 | ); 339 | runOnlyForDeploymentPostprocessing = 0; 340 | }; 341 | D911417921688EBC007FB459 /* Sources */ = { 342 | isa = PBXSourcesBuildPhase; 343 | buildActionMask = 2147483647; 344 | files = ( 345 | D911418321688EBC007FB459 /* RxBiBindingTests.swift in Sources */, 346 | D911419421688F58007FB459 /* AnyObservableType.swift in Sources */, 347 | D911419C21688F58007FB459 /* RxChannelTerminal.swift in Sources */, 348 | D911419A21688F58007FB459 /* RxChannel.swift in Sources */, 349 | ); 350 | runOnlyForDeploymentPostprocessing = 0; 351 | }; 352 | D9FD6731229AFEA400A75585 /* Sources */ = { 353 | isa = PBXSourcesBuildPhase; 354 | buildActionMask = 2147483647; 355 | files = ( 356 | D9250B0222A3A5AD00DD96BC /* RxChannelTerminal.swift in Sources */, 357 | D9250B0022A3A5AD00DD96BC /* AnyObservableType.swift in Sources */, 358 | D9250B0122A3A5AD00DD96BC /* RxChannel.swift in Sources */, 359 | ); 360 | runOnlyForDeploymentPostprocessing = 0; 361 | }; 362 | /* End PBXSourcesBuildPhase section */ 363 | 364 | /* Begin PBXTargetDependency section */ 365 | D911418021688EBC007FB459 /* PBXTargetDependency */ = { 366 | isa = PBXTargetDependency; 367 | target = D911417321688EBC007FB459 /* RxBiBinding */; 368 | targetProxy = D911417F21688EBC007FB459 /* PBXContainerItemProxy */; 369 | }; 370 | /* End PBXTargetDependency section */ 371 | 372 | /* Begin XCBuildConfiguration section */ 373 | D911418621688EBC007FB459 /* Debug */ = { 374 | isa = XCBuildConfiguration; 375 | buildSettings = { 376 | ALWAYS_SEARCH_USER_PATHS = NO; 377 | CLANG_ANALYZER_NONNULL = YES; 378 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 379 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 380 | CLANG_CXX_LIBRARY = "libc++"; 381 | CLANG_ENABLE_MODULES = YES; 382 | CLANG_ENABLE_OBJC_ARC = YES; 383 | CLANG_ENABLE_OBJC_WEAK = YES; 384 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 385 | CLANG_WARN_BOOL_CONVERSION = YES; 386 | CLANG_WARN_COMMA = YES; 387 | CLANG_WARN_CONSTANT_CONVERSION = YES; 388 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 389 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 390 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 391 | CLANG_WARN_EMPTY_BODY = YES; 392 | CLANG_WARN_ENUM_CONVERSION = YES; 393 | CLANG_WARN_INFINITE_RECURSION = YES; 394 | CLANG_WARN_INT_CONVERSION = YES; 395 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 396 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 397 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 398 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 399 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 400 | CLANG_WARN_STRICT_PROTOTYPES = YES; 401 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 402 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 403 | CLANG_WARN_UNREACHABLE_CODE = YES; 404 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 405 | CODE_SIGN_IDENTITY = "iPhone Developer"; 406 | COPY_PHASE_STRIP = NO; 407 | CURRENT_PROJECT_VERSION = 1; 408 | DEBUG_INFORMATION_FORMAT = dwarf; 409 | ENABLE_STRICT_OBJC_MSGSEND = YES; 410 | ENABLE_TESTABILITY = YES; 411 | GCC_C_LANGUAGE_STANDARD = gnu11; 412 | GCC_DYNAMIC_NO_PIC = NO; 413 | GCC_NO_COMMON_BLOCKS = YES; 414 | GCC_OPTIMIZATION_LEVEL = 0; 415 | GCC_PREPROCESSOR_DEFINITIONS = ( 416 | "DEBUG=1", 417 | "$(inherited)", 418 | ); 419 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 420 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 421 | GCC_WARN_UNDECLARED_SELECTOR = YES; 422 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 423 | GCC_WARN_UNUSED_FUNCTION = YES; 424 | GCC_WARN_UNUSED_VARIABLE = YES; 425 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 426 | MACOSX_DEPLOYMENT_TARGET = 10.9; 427 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 428 | MTL_FAST_MATH = YES; 429 | ONLY_ACTIVE_ARCH = YES; 430 | SDKROOT = iphoneos; 431 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 432 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 433 | VERSIONING_SYSTEM = "apple-generic"; 434 | VERSION_INFO_PREFIX = ""; 435 | }; 436 | name = Debug; 437 | }; 438 | D911418721688EBC007FB459 /* Release */ = { 439 | isa = XCBuildConfiguration; 440 | buildSettings = { 441 | ALWAYS_SEARCH_USER_PATHS = NO; 442 | CLANG_ANALYZER_NONNULL = YES; 443 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 444 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 445 | CLANG_CXX_LIBRARY = "libc++"; 446 | CLANG_ENABLE_MODULES = YES; 447 | CLANG_ENABLE_OBJC_ARC = YES; 448 | CLANG_ENABLE_OBJC_WEAK = YES; 449 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 450 | CLANG_WARN_BOOL_CONVERSION = YES; 451 | CLANG_WARN_COMMA = YES; 452 | CLANG_WARN_CONSTANT_CONVERSION = YES; 453 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 454 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 455 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 456 | CLANG_WARN_EMPTY_BODY = YES; 457 | CLANG_WARN_ENUM_CONVERSION = YES; 458 | CLANG_WARN_INFINITE_RECURSION = YES; 459 | CLANG_WARN_INT_CONVERSION = YES; 460 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 461 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 462 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 463 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 464 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 465 | CLANG_WARN_STRICT_PROTOTYPES = YES; 466 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 467 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 468 | CLANG_WARN_UNREACHABLE_CODE = YES; 469 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 470 | CODE_SIGN_IDENTITY = "iPhone Developer"; 471 | COPY_PHASE_STRIP = NO; 472 | CURRENT_PROJECT_VERSION = 1; 473 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 474 | ENABLE_NS_ASSERTIONS = NO; 475 | ENABLE_STRICT_OBJC_MSGSEND = YES; 476 | GCC_C_LANGUAGE_STANDARD = gnu11; 477 | GCC_NO_COMMON_BLOCKS = YES; 478 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 479 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 480 | GCC_WARN_UNDECLARED_SELECTOR = YES; 481 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 482 | GCC_WARN_UNUSED_FUNCTION = YES; 483 | GCC_WARN_UNUSED_VARIABLE = YES; 484 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 485 | MACOSX_DEPLOYMENT_TARGET = 10.9; 486 | MTL_ENABLE_DEBUG_INFO = NO; 487 | MTL_FAST_MATH = YES; 488 | SDKROOT = iphoneos; 489 | SWIFT_COMPILATION_MODE = wholemodule; 490 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 491 | VALIDATE_PRODUCT = YES; 492 | VERSIONING_SYSTEM = "apple-generic"; 493 | VERSION_INFO_PREFIX = ""; 494 | }; 495 | name = Release; 496 | }; 497 | D911418921688EBC007FB459 /* Debug */ = { 498 | isa = XCBuildConfiguration; 499 | buildSettings = { 500 | CLANG_ENABLE_MODULES = YES; 501 | CODE_SIGN_IDENTITY = ""; 502 | CODE_SIGN_STYLE = Manual; 503 | DEFINES_MODULE = YES; 504 | DEVELOPMENT_TEAM = ""; 505 | DYLIB_COMPATIBILITY_VERSION = 1; 506 | DYLIB_CURRENT_VERSION = 1; 507 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 508 | FRAMEWORK_SEARCH_PATHS = ( 509 | "$(inherited)", 510 | "$(PROJECT_DIR)/Carthage/Build/iOS", 511 | ); 512 | INFOPLIST_FILE = RxBiBinding/Info.plist; 513 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 514 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 515 | LD_RUNPATH_SEARCH_PATHS = ( 516 | "$(inherited)", 517 | "@executable_path/Frameworks", 518 | "@loader_path/Frameworks", 519 | ); 520 | MARKETING_VERSION = 0.3.5; 521 | PRODUCT_BUNDLE_IDENTIFIER = xyz.amakushkin.RxBiBinding; 522 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 523 | PROVISIONING_PROFILE_SPECIFIER = ""; 524 | SKIP_INSTALL = YES; 525 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 526 | SWIFT_VERSION = 5.0; 527 | TARGETED_DEVICE_FAMILY = "1,2"; 528 | }; 529 | name = Debug; 530 | }; 531 | D911418A21688EBC007FB459 /* Release */ = { 532 | isa = XCBuildConfiguration; 533 | buildSettings = { 534 | CLANG_ENABLE_MODULES = YES; 535 | CODE_SIGN_IDENTITY = ""; 536 | CODE_SIGN_STYLE = Manual; 537 | DEFINES_MODULE = YES; 538 | DEVELOPMENT_TEAM = ""; 539 | DYLIB_COMPATIBILITY_VERSION = 1; 540 | DYLIB_CURRENT_VERSION = 1; 541 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 542 | FRAMEWORK_SEARCH_PATHS = ( 543 | "$(inherited)", 544 | "$(PROJECT_DIR)/Carthage/Build/iOS", 545 | ); 546 | INFOPLIST_FILE = RxBiBinding/Info.plist; 547 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 548 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 549 | LD_RUNPATH_SEARCH_PATHS = ( 550 | "$(inherited)", 551 | "@executable_path/Frameworks", 552 | "@loader_path/Frameworks", 553 | ); 554 | MARKETING_VERSION = 0.3.5; 555 | PRODUCT_BUNDLE_IDENTIFIER = xyz.amakushkin.RxBiBinding; 556 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 557 | PROVISIONING_PROFILE_SPECIFIER = ""; 558 | SKIP_INSTALL = YES; 559 | SWIFT_VERSION = 5.0; 560 | TARGETED_DEVICE_FAMILY = "1,2"; 561 | }; 562 | name = Release; 563 | }; 564 | D911418C21688EBC007FB459 /* Debug */ = { 565 | isa = XCBuildConfiguration; 566 | buildSettings = { 567 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 568 | CODE_SIGN_STYLE = Manual; 569 | DEVELOPMENT_TEAM = ""; 570 | FRAMEWORK_SEARCH_PATHS = ( 571 | "$(inherited)", 572 | "$(PROJECT_DIR)/Carthage/Build/iOS", 573 | ); 574 | INFOPLIST_FILE = RxBiBindingTests/Info.plist; 575 | LD_RUNPATH_SEARCH_PATHS = ( 576 | "$(inherited)", 577 | "@executable_path/Frameworks", 578 | "@loader_path/Frameworks", 579 | ); 580 | PRODUCT_BUNDLE_IDENTIFIER = amakushkin.RxBiBindingTests; 581 | PRODUCT_NAME = "$(TARGET_NAME)"; 582 | PROVISIONING_PROFILE_SPECIFIER = ""; 583 | SWIFT_VERSION = 5.0; 584 | TARGETED_DEVICE_FAMILY = "1,2"; 585 | }; 586 | name = Debug; 587 | }; 588 | D911418D21688EBC007FB459 /* Release */ = { 589 | isa = XCBuildConfiguration; 590 | buildSettings = { 591 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 592 | CODE_SIGN_STYLE = Manual; 593 | DEVELOPMENT_TEAM = ""; 594 | FRAMEWORK_SEARCH_PATHS = ( 595 | "$(inherited)", 596 | "$(PROJECT_DIR)/Carthage/Build/iOS", 597 | ); 598 | INFOPLIST_FILE = RxBiBindingTests/Info.plist; 599 | LD_RUNPATH_SEARCH_PATHS = ( 600 | "$(inherited)", 601 | "@executable_path/Frameworks", 602 | "@loader_path/Frameworks", 603 | ); 604 | PRODUCT_BUNDLE_IDENTIFIER = amakushkin.RxBiBindingTests; 605 | PRODUCT_NAME = "$(TARGET_NAME)"; 606 | PROVISIONING_PROFILE_SPECIFIER = ""; 607 | SWIFT_VERSION = 5.0; 608 | TARGETED_DEVICE_FAMILY = "1,2"; 609 | }; 610 | name = Release; 611 | }; 612 | D9FD673B229AFEA400A75585 /* Debug */ = { 613 | isa = XCBuildConfiguration; 614 | buildSettings = { 615 | CODE_SIGN_IDENTITY = "Mac Developer"; 616 | CODE_SIGN_STYLE = Manual; 617 | COMBINE_HIDPI_IMAGES = YES; 618 | DEFINES_MODULE = YES; 619 | DEVELOPMENT_TEAM = ""; 620 | DYLIB_COMPATIBILITY_VERSION = 1; 621 | DYLIB_CURRENT_VERSION = 1; 622 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 623 | FRAMEWORK_SEARCH_PATHS = ( 624 | "$(inherited)", 625 | "$(PROJECT_DIR)/Carthage/Build/Mac", 626 | ); 627 | FRAMEWORK_VERSION = A; 628 | INFOPLIST_FILE = "RxBiBinding macOS/Info.plist"; 629 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 630 | LD_RUNPATH_SEARCH_PATHS = ( 631 | "$(inherited)", 632 | "@executable_path/../Frameworks", 633 | "@loader_path/Frameworks", 634 | ); 635 | MACOSX_DEPLOYMENT_TARGET = 10.10; 636 | MARKETING_VERSION = 0.3.5; 637 | PRODUCT_BUNDLE_IDENTIFIER = "xyz.amakushkin.RxBiBinding-macOS"; 638 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 639 | PROVISIONING_PROFILE_SPECIFIER = ""; 640 | SDKROOT = macosx; 641 | SKIP_INSTALL = YES; 642 | SWIFT_VERSION = 5.0; 643 | }; 644 | name = Debug; 645 | }; 646 | D9FD673C229AFEA400A75585 /* Release */ = { 647 | isa = XCBuildConfiguration; 648 | buildSettings = { 649 | CODE_SIGN_IDENTITY = "Mac Developer"; 650 | CODE_SIGN_STYLE = Manual; 651 | COMBINE_HIDPI_IMAGES = YES; 652 | DEFINES_MODULE = YES; 653 | DEVELOPMENT_TEAM = ""; 654 | DYLIB_COMPATIBILITY_VERSION = 1; 655 | DYLIB_CURRENT_VERSION = 1; 656 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 657 | FRAMEWORK_SEARCH_PATHS = ( 658 | "$(inherited)", 659 | "$(PROJECT_DIR)/Carthage/Build/Mac", 660 | ); 661 | FRAMEWORK_VERSION = A; 662 | INFOPLIST_FILE = "RxBiBinding macOS/Info.plist"; 663 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 664 | LD_RUNPATH_SEARCH_PATHS = ( 665 | "$(inherited)", 666 | "@executable_path/../Frameworks", 667 | "@loader_path/Frameworks", 668 | ); 669 | MACOSX_DEPLOYMENT_TARGET = 10.10; 670 | MARKETING_VERSION = 0.3.5; 671 | PRODUCT_BUNDLE_IDENTIFIER = "xyz.amakushkin.RxBiBinding-macOS"; 672 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 673 | PROVISIONING_PROFILE_SPECIFIER = ""; 674 | SDKROOT = macosx; 675 | SKIP_INSTALL = YES; 676 | SWIFT_VERSION = 5.0; 677 | }; 678 | name = Release; 679 | }; 680 | /* End XCBuildConfiguration section */ 681 | 682 | /* Begin XCConfigurationList section */ 683 | D911416E21688EBB007FB459 /* Build configuration list for PBXProject "RxBiBinding" */ = { 684 | isa = XCConfigurationList; 685 | buildConfigurations = ( 686 | D911418621688EBC007FB459 /* Debug */, 687 | D911418721688EBC007FB459 /* Release */, 688 | ); 689 | defaultConfigurationIsVisible = 0; 690 | defaultConfigurationName = Release; 691 | }; 692 | D911418821688EBC007FB459 /* Build configuration list for PBXNativeTarget "RxBiBinding" */ = { 693 | isa = XCConfigurationList; 694 | buildConfigurations = ( 695 | D911418921688EBC007FB459 /* Debug */, 696 | D911418A21688EBC007FB459 /* Release */, 697 | ); 698 | defaultConfigurationIsVisible = 0; 699 | defaultConfigurationName = Release; 700 | }; 701 | D911418B21688EBC007FB459 /* Build configuration list for PBXNativeTarget "RxBiBindingTests" */ = { 702 | isa = XCConfigurationList; 703 | buildConfigurations = ( 704 | D911418C21688EBC007FB459 /* Debug */, 705 | D911418D21688EBC007FB459 /* Release */, 706 | ); 707 | defaultConfigurationIsVisible = 0; 708 | defaultConfigurationName = Release; 709 | }; 710 | D9FD673A229AFEA400A75585 /* Build configuration list for PBXNativeTarget "RxBiBinding macOS" */ = { 711 | isa = XCConfigurationList; 712 | buildConfigurations = ( 713 | D9FD673B229AFEA400A75585 /* Debug */, 714 | D9FD673C229AFEA400A75585 /* Release */, 715 | ); 716 | defaultConfigurationIsVisible = 0; 717 | defaultConfigurationName = Release; 718 | }; 719 | /* End XCConfigurationList section */ 720 | }; 721 | rootObject = D911416B21688EBB007FB459 /* Project object */; 722 | } 723 | -------------------------------------------------------------------------------- /RxBiBinding.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /RxBiBinding.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /RxBiBinding.xcodeproj/xcshareddata/xcschemes/RxBiBinding macOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /RxBiBinding.xcodeproj/xcshareddata/xcschemes/RxBiBinding.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 65 | 71 | 72 | 73 | 74 | 75 | 76 | 82 | 83 | 89 | 90 | 91 | 92 | 94 | 95 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /RxBiBinding.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /RxBiBinding.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /RxBiBinding/Assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxBiBinding/57f9a16e7e9c4433c014145a39a97e05f7925263/RxBiBinding/Assets/.gitkeep -------------------------------------------------------------------------------- /RxBiBinding/Classes/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/RxSwiftCommunity/RxBiBinding/57f9a16e7e9c4433c014145a39a97e05f7925263/RxBiBinding/Classes/.gitkeep -------------------------------------------------------------------------------- /RxBiBinding/Classes/AnyObservableType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnyObservableType.swift 3 | // RxBiBinding 4 | // 5 | // Created by Александр Макушкин on 21.08.2018. 6 | // Copyright (c) RxSwiftCommunity 7 | 8 | import Foundation 9 | import RxSwift 10 | 11 | class AnyObservableType: ObservableType { 12 | typealias E = Element 13 | 14 | private let _subscribe: (AnyObserver) -> Disposable 15 | 16 | init(_ observer: O) where O : ObservableType, O.Element == Element { 17 | self._subscribe = observer.subscribe(_:) 18 | } 19 | 20 | func subscribe(_ observer: O) -> Disposable where O : ObserverType, O.Element == Element { 21 | return self._subscribe(observer.asObserver()) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /RxBiBinding/Classes/RxChannel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxChannel.swift 3 | // RxBiBinding 4 | // 5 | // Created by Александр Макушкин on 22.08.2018. 6 | // Copyright (c) RxSwiftCommunity 7 | 8 | import Foundation 9 | 10 | import RxSwift 11 | import RxCocoa 12 | 13 | infix operator <-> 14 | 15 | public func <->(left: ControlProperty, right: ControlProperty) -> Disposable { 16 | let leftChannel = RxChannel(withProperty: left) 17 | let rightChannel = RxChannel.init(withProperty: right) 18 | 19 | return CompositeDisposable.init(leftChannel, rightChannel, leftChannel & rightChannel) 20 | } 21 | 22 | public func <->(left: BehaviorRelay, right: BehaviorRelay) -> Disposable { 23 | let leftChannel = RxChannel(withBehaviorRelay: left) 24 | let rightChannel = RxChannel.init(withBehaviorRelay: right) 25 | 26 | return CompositeDisposable.init(leftChannel, rightChannel, leftChannel & rightChannel) 27 | } 28 | 29 | public func <->(left: ControlProperty, right: BehaviorRelay) -> Disposable { 30 | let leftChannel = RxChannel(withProperty: left) 31 | let rightChannel = RxChannel.init(withBehaviorRelay: right) 32 | 33 | return CompositeDisposable.init(leftChannel, rightChannel, leftChannel & rightChannel) 34 | } 35 | 36 | //MARK: - Core RxChannel 37 | class RxChannel: NSObject { 38 | var leadingTerminal: RxChannelTerminal? 39 | var followingTerminal: RxChannelTerminal? 40 | 41 | private var isSkippingNextUpdate = false 42 | private var keyPath: String? 43 | private var target: E? 44 | 45 | private let disposeBag = DisposeBag() 46 | 47 | override init() { 48 | let leadingSubject = ReplaySubject.create(bufferSize: 0) 49 | let followingSubject = ReplaySubject.create(bufferSize: 1) 50 | 51 | leadingSubject 52 | .ignoreElements() 53 | .subscribe(onError: { error in 54 | followingSubject.onError(error) 55 | }, 56 | onCompleted: { 57 | followingSubject.onCompleted() 58 | }) 59 | .disposed(by: self.disposeBag) 60 | 61 | followingSubject 62 | .ignoreElements() 63 | .subscribe(onError: { error in 64 | leadingSubject.onError(error) 65 | }, 66 | onCompleted: { 67 | leadingSubject.onCompleted() 68 | }) 69 | .disposed(by: self.disposeBag) 70 | 71 | self.leadingTerminal = RxChannelTerminal.init(withValues: AnyObservableType(leadingSubject), 72 | otherTerminal: AnyObserver(followingSubject)) 73 | self.followingTerminal = RxChannelTerminal.init(withValues: AnyObservableType(followingSubject), 74 | otherTerminal: AnyObserver(leadingSubject)) 75 | } 76 | } 77 | 78 | //MARK: - Init with ControlProperty RxChannel 79 | extension RxChannel { 80 | convenience init(withProperty property: ControlProperty) { 81 | self.init() 82 | 83 | _ = property.do(onDispose: { [weak self] in 84 | self?.leadingTerminal?.onCompleted() 85 | }) 86 | 87 | guard let gLeaTer = self.leadingTerminal else { 88 | return 89 | } 90 | 91 | property 92 | .subscribe(onNext: { [weak self] value in 93 | if self?.isSkippingNextUpdate == true { 94 | self?.isSkippingNextUpdate = false 95 | 96 | return; 97 | } 98 | 99 | gLeaTer.onNext(value) 100 | }) 101 | .disposed(by: self.disposeBag) 102 | 103 | gLeaTer 104 | .subscribe(onNext: { value in 105 | property.onNext(value) 106 | }) 107 | .disposed(by: self.disposeBag) 108 | } 109 | } 110 | 111 | //MARK: - Init with BehaviorRelay RxChannel 112 | extension RxChannel { 113 | convenience init(withBehaviorRelay relay: BehaviorRelay) { 114 | self.init() 115 | 116 | _ = relay 117 | .asObservable() 118 | .do(onDispose: { [weak self] in 119 | self?.leadingTerminal?.onCompleted() 120 | }) 121 | 122 | guard let gLeaTer = self.leadingTerminal else { 123 | return 124 | } 125 | 126 | relay 127 | .asObservable() 128 | .subscribe(onNext: { [weak self] value in 129 | if self?.isSkippingNextUpdate == true { 130 | self?.isSkippingNextUpdate = false 131 | 132 | return; 133 | } 134 | 135 | gLeaTer.onNext(value) 136 | }) 137 | .disposed(by: self.disposeBag) 138 | 139 | gLeaTer 140 | .subscribe(onNext: { [weak self] value in 141 | self?.isSkippingNextUpdate = true 142 | 143 | relay.accept(value) 144 | }) 145 | .disposed(by: self.disposeBag) 146 | } 147 | } 148 | 149 | 150 | //MARK: - Operator Overload RxChannel 151 | extension RxChannel { 152 | fileprivate static func &(left: RxChannel, right: RxChannel) -> Disposable { 153 | guard let leftFolTer = left.followingTerminal, let rightFolTer = right.followingTerminal else { 154 | return Disposables.create() 155 | } 156 | 157 | let r = rightFolTer.bind(to: leftFolTer) 158 | let l = leftFolTer.skip(1).bind(to: rightFolTer) 159 | 160 | return CompositeDisposable.init(r, l) 161 | } 162 | } 163 | 164 | //MARK: - Disposable RxChannel 165 | extension RxChannel: Disposable { 166 | func dispose() {} 167 | } 168 | -------------------------------------------------------------------------------- /RxBiBinding/Classes/RxChannelTerminal.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxChannelTerminal.swift 3 | // RxBiBinding 4 | // 5 | // Created by Александр Макушкин on 22.08.2018. 6 | // Copyright (c) RxSwiftCommunity 7 | 8 | import Foundation 9 | import RxSwift 10 | import RxCocoa 11 | 12 | class RxChannelTerminal: NSObject { 13 | typealias Element = E 14 | 15 | fileprivate private(set) var values: AnyObservableType? 16 | fileprivate private(set) var otherTerminal: AnyObserver? 17 | 18 | convenience init(withValues values: AnyObservableType, otherTerminal: AnyObserver) { 19 | self.init() 20 | 21 | self.values = values 22 | self.otherTerminal = otherTerminal 23 | } 24 | } 25 | 26 | extension RxChannelTerminal: ObserverType { 27 | func on(_ event: Event) { 28 | self.otherTerminal?.on(event) 29 | } 30 | } 31 | 32 | extension RxChannelTerminal: ObservableType { 33 | func subscribe(_ observer: O) -> Disposable where O : ObserverType, RxChannelTerminal.Element == O.Element { 34 | return self.values?.subscribe(observer) ?? Disposables.create() 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /RxBiBinding/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 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 | $(MARKETING_VERSION) 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | 22 | 23 | -------------------------------------------------------------------------------- /RxBiBinding/RxBiBinding.h: -------------------------------------------------------------------------------- 1 | // 2 | // RxBiBinding.h 3 | // RxBiBinding 4 | // 5 | // Created by Александр Макушкин on 06.10.2018. 6 | // Copyright (c) RxSwiftCommunity. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for RxBiBinding. 12 | FOUNDATION_EXPORT double RxBiBindingVersionNumber; 13 | 14 | //! Project version string for RxBiBinding. 15 | FOUNDATION_EXPORT const unsigned char RxBiBindingVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /RxBiBindingTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /RxBiBindingTests/RxBiBindingTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxBiBindingTests.swift 3 | // RxBiBindingTests 4 | // 5 | // Created by Александр Макушкин on 06.10.2018. 6 | // Copyright (c) RxSwiftCommunity. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | @testable import RxBiBinding 11 | 12 | class RxBiBindingTests: XCTestCase { 13 | 14 | override func setUp() { 15 | // Put setup code here. This method is called before the invocation of each test method in the class. 16 | } 17 | 18 | override func tearDown() { 19 | // Put teardown code here. This method is called after the invocation of each test method in the class. 20 | } 21 | 22 | func testExample() { 23 | // This is an example of a functional test case. 24 | // Use XCTAssert and related functions to verify your tests produce the correct results. 25 | } 26 | 27 | func testPerformanceExample() { 28 | // This is an example of a performance test case. 29 | self.measure { 30 | // Put the code you want to measure the time of here. 31 | } 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /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 | echo 'EXCLUDED_ARCHS__EFFECTIVE_PLATFORM_SUFFIX_simulator__NATIVE_ARCH_64_BIT_x86_64__XCODE_1200 = arm64 arm64e armv7 armv7s armv6 armv8' >> $xcconfig 14 | 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 15 | 16 | export XCODE_XCCONFIG_FILE="$xcconfig" 17 | carthage "$@" 18 | --------------------------------------------------------------------------------