├── .gitignore ├── HyperRecipe.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcuserdata │ └── rebouhaymen.xcuserdatad │ └── xcschemes │ ├── HyperRecipe.xcscheme │ └── xcschememanagement.plist ├── HyperRecipe.xcworkspace ├── contents.xcworkspacedata └── xcuserdata │ └── rebouhaymen.xcuserdatad │ └── xcdebugger │ └── Breakpoints_v2.xcbkptlist ├── HyperRecipe ├── APIs │ ├── Network │ │ └── RecipeNetwork.swift │ ├── RecipeAPI.swift │ └── RecipeRouter.swift ├── Animations │ └── CAEmitterRecipe.swift ├── AppDelegate.swift ├── Assets.xcassets │ ├── AppIcon.appiconset │ │ ├── Contents.json │ │ ├── Icon-App-29x29@1x.png │ │ ├── Icon-App-29x29@2x-1.png │ │ ├── Icon-App-29x29@2x.png │ │ ├── Icon-App-29x29@3x.png │ │ ├── Icon-App-40x40@1x.png │ │ ├── Icon-App-40x40@2x-1.png │ │ ├── Icon-App-40x40@2x.png │ │ ├── Icon-App-40x40@3x.png │ │ ├── Icon-App-60x60@2x.png │ │ ├── Icon-App-60x60@3x.png │ │ ├── Icon-App-76x76@1x.png │ │ ├── Icon-App-76x76@2x.png │ │ └── Icon-App-83.5x83.5@2x.png │ ├── Contents.json │ ├── Cross.imageset │ │ ├── Contents.json │ │ └── Cross.pdf │ ├── Fruit and vegetables │ │ ├── Contents.json │ │ ├── apple-2.imageset │ │ │ ├── Contents.json │ │ │ ├── apple-2.png │ │ │ ├── apple-2@2x.png │ │ │ └── apple-2@3x.png │ │ ├── broccoli.imageset │ │ │ ├── Contents.json │ │ │ ├── broccoli.png │ │ │ ├── broccoli@2x.png │ │ │ └── broccoli@3x.png │ │ ├── cheese.imageset │ │ │ ├── Contents.json │ │ │ ├── cheese.png │ │ │ ├── cheese@2x.png │ │ │ └── cheese@3x.png │ │ ├── cherry.imageset │ │ │ ├── Contents.json │ │ │ ├── cherry.png │ │ │ ├── cherry@2x.png │ │ │ └── cherry@3x.png │ │ ├── chicken-leg.imageset │ │ │ ├── Contents.json │ │ │ ├── chicken-leg.png │ │ │ ├── chicken-leg@2x.png │ │ │ └── chicken-leg@3x.png │ │ ├── fried-egg.imageset │ │ │ ├── Contents.json │ │ │ ├── fried-egg.png │ │ │ ├── fried-egg@2x.png │ │ │ └── fried-egg@3x.png │ │ ├── grapes.imageset │ │ │ ├── Contents.json │ │ │ ├── grapes.png │ │ │ ├── grapes@2x.png │ │ │ └── grapes@3x.png │ │ ├── ham.imageset │ │ │ ├── Contents.json │ │ │ ├── ham.png │ │ │ ├── ham@2x.png │ │ │ └── ham@3x.png │ │ ├── lobster.imageset │ │ │ ├── Contents.json │ │ │ ├── lobster.png │ │ │ ├── lobster@2x.png │ │ │ └── lobster@3x.png │ │ ├── meat.imageset │ │ │ ├── Contents.json │ │ │ ├── meat.png │ │ │ ├── meat@2x.png │ │ │ └── meat@3x.png │ │ ├── melon.imageset │ │ │ ├── Contents.json │ │ │ ├── melon.png │ │ │ ├── melon@2x.png │ │ │ └── melon@3x.png │ │ ├── mushroom.imageset │ │ │ ├── Contents.json │ │ │ ├── mushroom.png │ │ │ ├── mushroom@2x.png │ │ │ └── mushroom@3x.png │ │ ├── orange-2.imageset │ │ │ ├── Contents.json │ │ │ ├── orange-2.png │ │ │ ├── orange-2@2x.png │ │ │ └── orange-2@3x.png │ │ ├── orange.imageset │ │ │ ├── Contents.json │ │ │ ├── orange.png │ │ │ ├── orange@2x.png │ │ │ └── orange@3x.png │ │ ├── pear.imageset │ │ │ ├── Contents.json │ │ │ ├── pear.png │ │ │ ├── pear@2x.png │ │ │ └── pear@3x.png │ │ ├── pizza-2.imageset │ │ │ ├── Contents.json │ │ │ ├── pizza-2.png │ │ │ ├── pizza-2@2x.png │ │ │ └── pizza-2@3x.png │ │ ├── pizza.imageset │ │ │ ├── Contents.json │ │ │ ├── pizza.png │ │ │ ├── pizza@2x.png │ │ │ └── pizza@3x.png │ │ ├── radish.imageset │ │ │ ├── Contents.json │ │ │ ├── radish.png │ │ │ ├── radish@2x.png │ │ │ └── radish@3x.png │ │ ├── strawberry.imageset │ │ │ ├── Contents.json │ │ │ ├── strawberry.png │ │ │ ├── strawberry@2x.png │ │ │ └── strawberry@3x.png │ │ └── watermelon.imageset │ │ │ ├── Contents.json │ │ │ ├── watermelon.png │ │ │ ├── watermelon@2x.png │ │ │ └── watermelon@3x.png │ ├── Recipe form │ │ ├── Contents.json │ │ ├── favorite-fill.imageset │ │ │ ├── Contents.json │ │ │ └── favorite-fill.pdf │ │ ├── favorite.imageset │ │ │ ├── Contents.json │ │ │ └── favorite.pdf │ │ └── recipePlaceholder.imageset │ │ │ ├── Contents.json │ │ │ └── recipePlaceholder.pdf │ ├── Tab bar │ │ ├── Contents.json │ │ ├── addRecipe.imageset │ │ │ ├── Contents.json │ │ │ └── addRecipe.pdf │ │ └── recipe.imageset │ │ │ ├── Contents.json │ │ │ └── recipe.pdf │ ├── bottomArrow.imageset │ │ ├── Contents.json │ │ └── Disclosure Indicator.pdf │ ├── flagFavorite-selected.imageset │ │ ├── Contents.json │ │ └── flagFavorite.pdf │ ├── flagFavorite.imageset │ │ ├── Contents.json │ │ └── flagFavorite.pdf │ ├── logo.imageset │ │ ├── Contents.json │ │ └── logo.png │ ├── menu.imageset │ │ ├── Contents.json │ │ └── Menu.pdf │ └── recipeBackgroundPlaceholder.imageset │ │ ├── Contents.json │ │ └── recipePlaceholder.pdf ├── Base.lproj │ └── Main.storyboard ├── DependencyInjection │ └── SwinjectStoryboardExtension.swift ├── Extensions │ ├── ArrayExtension.swift │ └── ColorExtension.swift ├── Info.plist ├── Models │ ├── Photo.swift │ └── Recipe.swift ├── Stub │ └── RecipeStub.swift ├── ViewControllers │ ├── AboutViewController.swift │ ├── BaseNavigationViewController.swift │ ├── ExploreViewController.swift │ ├── RecipeExpandingTableViewController.swift │ ├── RecipeFormViewController.swift │ └── SplashViewController.swift ├── ViewModel │ ├── RecipeFormViewModel.swift │ └── RecipeViewModel.swift ├── Views │ ├── DifficultyView │ │ ├── DifficultyView.swift │ │ └── DifficultyView.xib │ ├── RecipeCollectionViewCell │ │ ├── RecipeCollectionViewCell.swift │ │ └── RecipeCollectionViewCell.xib │ └── RecipeDetailSectionCell │ │ ├── RecipeDetailHeaderSectionCell.swift │ │ └── RecipeDetailSectionCell.swift └── getRecipes.json ├── Podfile ├── Podfile.lock ├── Pods ├── Alamofire │ ├── LICENSE │ ├── README.md │ └── Source │ │ ├── AFError.swift │ │ ├── Alamofire.swift │ │ ├── DispatchQueue+Alamofire.swift │ │ ├── MultipartFormData.swift │ │ ├── NetworkReachabilityManager.swift │ │ ├── Notifications.swift │ │ ├── ParameterEncoding.swift │ │ ├── Request.swift │ │ ├── Response.swift │ │ ├── ResponseSerialization.swift │ │ ├── Result.swift │ │ ├── ServerTrustPolicy.swift │ │ ├── SessionDelegate.swift │ │ ├── SessionManager.swift │ │ ├── TaskDelegate.swift │ │ ├── Timeline.swift │ │ └── Validation.swift ├── AlamofireImage │ ├── LICENSE │ ├── README.md │ └── Source │ │ ├── AFIError.swift │ │ ├── Image.swift │ │ ├── ImageCache.swift │ │ ├── ImageDownloader.swift │ │ ├── ImageFilter.swift │ │ ├── Request+AlamofireImage.swift │ │ ├── UIButton+AlamofireImage.swift │ │ ├── UIImage+AlamofireImage.swift │ │ └── UIImageView+AlamofireImage.swift ├── Decodable │ ├── LICENSE │ ├── README.md │ └── Sources │ │ ├── Castable.swift │ │ ├── Decodable.h │ │ ├── Decodable.swift │ │ ├── Decoders.swift │ │ ├── DecodingError.swift │ │ ├── KeyPath.swift │ │ ├── NSValueCastable.swift │ │ ├── Operators.swift │ │ ├── OptionalKeyPath.swift │ │ ├── Overloads.swift │ │ ├── Parse.swift │ │ └── RawRepresentableDecodable.swift ├── Manifest.lock ├── Pods.xcodeproj │ ├── project.pbxproj │ └── xcuserdata │ │ └── rebouhaymen.xcuserdatad │ │ └── xcschemes │ │ ├── Alamofire.xcscheme │ │ ├── Decodable.xcscheme │ │ ├── Pods-HyperRecipe.xcscheme │ │ ├── RxCocoa.xcscheme │ │ ├── RxSwift.xcscheme │ │ ├── Swinject.xcscheme │ │ ├── SwinjectStoryboard.xcscheme │ │ ├── expanding-collection.xcscheme │ │ └── xcschememanagement.plist ├── RxCocoa │ ├── LICENSE.md │ ├── Platform │ │ ├── DataStructures │ │ │ ├── Bag.swift │ │ │ ├── InfiniteSequence.swift │ │ │ ├── PriorityQueue.swift │ │ │ └── Queue.swift │ │ ├── DispatchQueue+Extensions.swift │ │ ├── Platform.Darwin.swift │ │ └── Platform.Linux.swift │ ├── README.md │ └── RxCocoa │ │ ├── CocoaUnits │ │ ├── ControlEvent.swift │ │ ├── ControlProperty.swift │ │ ├── Driver │ │ │ ├── ControlEvent+Driver.swift │ │ │ ├── ControlProperty+Driver.swift │ │ │ ├── Driver+Subscription.swift │ │ │ ├── Driver.swift │ │ │ ├── ObservableConvertibleType+Driver.swift │ │ │ └── Variable+Driver.swift │ │ ├── SharedSequence │ │ │ ├── ObservableConvertibleType+SharedSequence.swift │ │ │ ├── SharedSequence+Operators+arity.swift │ │ │ ├── SharedSequence+Operators.swift │ │ │ ├── SharedSequence.swift │ │ │ └── Variable+SharedSequence.swift │ │ └── UIBindingObserver.swift │ │ ├── Common │ │ ├── ControlTarget.swift │ │ ├── DelegateProxy.swift │ │ ├── DelegateProxyType.swift │ │ ├── NSLayoutConstraint+Rx.swift │ │ ├── Observable+Bind.swift │ │ ├── RxCocoaObjCRuntimeError+Extensions.swift │ │ ├── RxTarget.swift │ │ ├── SectionedViewDataSourceType.swift │ │ └── TextInput.swift │ │ ├── Foundation │ │ ├── KVORepresentable+CoreGraphics.swift │ │ ├── KVORepresentable+Swift.swift │ │ ├── KVORepresentable.swift │ │ ├── Logging.swift │ │ ├── NSNotificationCenter+Rx.swift │ │ ├── NSObject+Rx+KVORepresentable.swift │ │ ├── NSObject+Rx+RawRepresentable.swift │ │ ├── NSObject+Rx.swift │ │ └── URLSession+Rx.swift │ │ ├── Runtime │ │ ├── _RX.m │ │ ├── _RXDelegateProxy.m │ │ ├── _RXKVOObserver.m │ │ ├── _RXObjCRuntime.m │ │ └── include │ │ │ ├── RxCocoaRuntime.h │ │ │ ├── _RX.h │ │ │ ├── _RXDelegateProxy.h │ │ │ ├── _RXKVOObserver.h │ │ │ └── _RXObjCRuntime.h │ │ ├── RxCocoa.h │ │ ├── RxCocoa.swift │ │ └── iOS │ │ ├── DataSources │ │ ├── RxCollectionViewReactiveArrayDataSource.swift │ │ └── RxTableViewReactiveArrayDataSource.swift │ │ ├── Events │ │ └── ItemEvents.swift │ │ ├── NSTextStorage+Rx.swift │ │ ├── Protocols │ │ ├── RxCollectionViewDataSourceType.swift │ │ └── RxTableViewDataSourceType.swift │ │ ├── Proxies │ │ ├── RxCollectionViewDataSourceProxy.swift │ │ ├── RxCollectionViewDelegateProxy.swift │ │ ├── RxPickerViewDelegateProxy.swift │ │ ├── RxScrollViewDelegateProxy.swift │ │ ├── RxSearchBarDelegateProxy.swift │ │ ├── RxSearchControllerDelegateProxy.swift │ │ ├── RxTabBarControllerDelegateProxy.swift │ │ ├── RxTabBarDelegateProxy.swift │ │ ├── RxTableViewDataSourceProxy.swift │ │ ├── RxTableViewDelegateProxy.swift │ │ ├── RxTextStorageDelegateProxy.swift │ │ ├── RxTextViewDelegateProxy.swift │ │ └── RxWebViewDelegateProxy.swift │ │ ├── UIActivityIndicatorView+Rx.swift │ │ ├── UIAlertAction+Rx.swift │ │ ├── UIApplication+Rx.swift │ │ ├── UIBarButtonItem+Rx.swift │ │ ├── UIButton+Rx.swift │ │ ├── UICollectionView+Rx.swift │ │ ├── UIControl+Rx.swift │ │ ├── UIDatePicker+Rx.swift │ │ ├── UIGestureRecognizer+Rx.swift │ │ ├── UIImageView+Rx.swift │ │ ├── UILabel+Rx.swift │ │ ├── UINavigationItem+Rx.swift │ │ ├── UIPageControl+Rx.swift │ │ ├── UIPickerView+Rx.swift │ │ ├── UIProgressView+Rx.swift │ │ ├── UIRefreshControl+Rx.swift │ │ ├── UIScrollView+Rx.swift │ │ ├── UISearchBar+Rx.swift │ │ ├── UISearchController+Rx.swift │ │ ├── UISegmentedControl+Rx.swift │ │ ├── UISlider+Rx.swift │ │ ├── UIStepper+Rx.swift │ │ ├── UISwitch+Rx.swift │ │ ├── UITabBar+Rx.swift │ │ ├── UITabBarController+Rx.swift │ │ ├── UITabBarItem+Rx.swift │ │ ├── UITableView+Rx.swift │ │ ├── UITextField+Rx.swift │ │ ├── UITextView+Rx.swift │ │ ├── UIView+Rx.swift │ │ ├── UIViewController+Rx.swift │ │ └── UIWebView+Rx.swift ├── RxSwift │ ├── LICENSE.md │ ├── Platform │ │ ├── DataStructures │ │ │ ├── Bag.swift │ │ │ ├── InfiniteSequence.swift │ │ │ ├── PriorityQueue.swift │ │ │ └── Queue.swift │ │ ├── DispatchQueue+Extensions.swift │ │ ├── Platform.Darwin.swift │ │ └── Platform.Linux.swift │ ├── README.md │ └── RxSwift │ │ ├── AnyObserver.swift │ │ ├── Cancelable.swift │ │ ├── Concurrency │ │ ├── AsyncLock.swift │ │ ├── Lock.swift │ │ ├── LockOwnerType.swift │ │ ├── SynchronizedDisposeType.swift │ │ ├── SynchronizedOnType.swift │ │ ├── SynchronizedSubscribeType.swift │ │ └── SynchronizedUnsubscribeType.swift │ │ ├── ConnectableObservableType.swift │ │ ├── Disposable.swift │ │ ├── Disposables │ │ ├── AnonymousDisposable.swift │ │ ├── BinaryDisposable.swift │ │ ├── BooleanDisposable.swift │ │ ├── CompositeDisposable.swift │ │ ├── Disposables.swift │ │ ├── DisposeBag.swift │ │ ├── DisposeBase.swift │ │ ├── NopDisposable.swift │ │ ├── RefCountDisposable.swift │ │ ├── ScheduledDisposable.swift │ │ ├── SerialDisposable.swift │ │ ├── SingleAssignmentDisposable.swift │ │ └── SubscriptionDisposable.swift │ │ ├── Errors.swift │ │ ├── Event.swift │ │ ├── Extensions │ │ ├── Bag+Rx.swift │ │ └── String+Rx.swift │ │ ├── ImmediateSchedulerType.swift │ │ ├── Observable.swift │ │ ├── ObservableConvertibleType.swift │ │ ├── ObservableType+Extensions.swift │ │ ├── ObservableType.swift │ │ ├── Observables │ │ ├── Implementations │ │ │ ├── AddRef.swift │ │ │ ├── Amb.swift │ │ │ ├── AnonymousObservable.swift │ │ │ ├── Buffer.swift │ │ │ ├── Catch.swift │ │ │ ├── CombineLatest+Collection.swift │ │ │ ├── CombineLatest+arity.swift │ │ │ ├── CombineLatest.swift │ │ │ ├── Concat.swift │ │ │ ├── ConnectableObservable.swift │ │ │ ├── Debug.swift │ │ │ ├── Debunce.swift │ │ │ ├── Deferred.swift │ │ │ ├── Delay.swift │ │ │ ├── DelaySubscription.swift │ │ │ ├── DistinctUntilChanged.swift │ │ │ ├── Do.swift │ │ │ ├── ElementAt.swift │ │ │ ├── Empty.swift │ │ │ ├── Error.swift │ │ │ ├── Filter.swift │ │ │ ├── Generate.swift │ │ │ ├── Just.swift │ │ │ ├── Map.swift │ │ │ ├── Merge.swift │ │ │ ├── Multicast.swift │ │ │ ├── Never.swift │ │ │ ├── ObserveOn.swift │ │ │ ├── ObserveOnSerialDispatchQueue.swift │ │ │ ├── Optional.swift │ │ │ ├── Producer.swift │ │ │ ├── Range.swift │ │ │ ├── Reduce.swift │ │ │ ├── RefCount.swift │ │ │ ├── Repeat.swift │ │ │ ├── RetryWhen.swift │ │ │ ├── Sample.swift │ │ │ ├── Scan.swift │ │ │ ├── Sequence.swift │ │ │ ├── ShareReplay1.swift │ │ │ ├── ShareReplay1WhileConnected.swift │ │ │ ├── SingleAsync.swift │ │ │ ├── Sink.swift │ │ │ ├── Skip.swift │ │ │ ├── SkipUntil.swift │ │ │ ├── SkipWhile.swift │ │ │ ├── StartWith.swift │ │ │ ├── SubscribeOn.swift │ │ │ ├── Switch.swift │ │ │ ├── Take.swift │ │ │ ├── TakeLast.swift │ │ │ ├── TakeUntil.swift │ │ │ ├── TakeWhile.swift │ │ │ ├── Throttle.swift │ │ │ ├── Timeout.swift │ │ │ ├── Timer.swift │ │ │ ├── ToArray.swift │ │ │ ├── Using.swift │ │ │ ├── Window.swift │ │ │ ├── WithLatestFrom.swift │ │ │ ├── Zip+Collection.swift │ │ │ ├── Zip+arity.swift │ │ │ └── Zip.swift │ │ ├── Observable+Aggregate.swift │ │ ├── Observable+Binding.swift │ │ ├── Observable+Concurrency.swift │ │ ├── Observable+Creation.swift │ │ ├── Observable+Debug.swift │ │ ├── Observable+Multiple.swift │ │ ├── Observable+Single.swift │ │ ├── Observable+StandardSequenceOperators.swift │ │ └── Observable+Time.swift │ │ ├── ObserverType.swift │ │ ├── Observers │ │ ├── AnonymousObserver.swift │ │ ├── ObserverBase.swift │ │ └── TailRecursiveSink.swift │ │ ├── Reactive.swift │ │ ├── Rx.swift │ │ ├── RxMutableBox.swift │ │ ├── SchedulerType.swift │ │ ├── Schedulers │ │ ├── ConcurrentDispatchQueueScheduler.swift │ │ ├── ConcurrentMainScheduler.swift │ │ ├── CurrentThreadScheduler.swift │ │ ├── HistoricalScheduler.swift │ │ ├── HistoricalSchedulerTimeConverter.swift │ │ ├── ImmediateScheduler.swift │ │ ├── Internal │ │ │ ├── AnonymousInvocable.swift │ │ │ ├── DispatchQueueConfiguration.swift │ │ │ ├── InvocableScheduledItem.swift │ │ │ ├── InvocableType.swift │ │ │ ├── ScheduledItem.swift │ │ │ └── ScheduledItemType.swift │ │ ├── MainScheduler.swift │ │ ├── OperationQueueScheduler.swift │ │ ├── RecursiveScheduler.swift │ │ ├── SchedulerServices+Emulation.swift │ │ ├── SerialDispatchQueueScheduler.swift │ │ ├── VirtualTimeConverterType.swift │ │ └── VirtualTimeScheduler.swift │ │ └── Subjects │ │ ├── BehaviorSubject.swift │ │ ├── PublishSubject.swift │ │ ├── ReplaySubject.swift │ │ ├── SubjectType.swift │ │ └── Variable.swift ├── Swinject │ ├── LICENSE.txt │ ├── README.md │ └── Sources │ │ ├── Assembler.swift │ │ ├── Assembly.swift │ │ ├── Container.Arguments.swift │ │ ├── Container.Logging.swift │ │ ├── Container.swift │ │ ├── DebugHelper.swift │ │ ├── FunctionType.swift │ │ ├── InstanceStorage.swift │ │ ├── ObjectScope.Standard.swift │ │ ├── ObjectScope.swift │ │ ├── Resolver.swift │ │ ├── ServiceEntry.swift │ │ ├── ServiceKey.swift │ │ ├── SpinLock.swift │ │ ├── Swinject.h │ │ ├── SynchronizedResolver.Arguments.swift │ │ ├── SynchronizedResolver.swift │ │ ├── UnavailableItems.swift │ │ └── _Resolver.swift ├── SwinjectStoryboard │ ├── LICENSE.txt │ ├── README.md │ └── Sources │ │ ├── Box.swift │ │ ├── Container+SwinjectStoryboard.swift │ │ ├── InjectionVerifiable.swift │ │ ├── RegistrationNameAssociatable.swift │ │ ├── Storyboard+Swizzling.swift │ │ ├── SwinjectStoryboard+StoryboardReference.swift │ │ ├── SwinjectStoryboard.h │ │ ├── SwinjectStoryboard.swift │ │ ├── SwinjectStoryboardOption.swift │ │ ├── SwinjectStoryboardProtocol.swift │ │ ├── UnavailableItems.swift │ │ ├── ViewController+Swinject.swift │ │ └── iOS-tvOS │ │ ├── _SwinjectStoryboardBase.h │ │ └── _SwinjectStoryboardBase.m ├── Target Support Files │ ├── Alamofire │ │ ├── Alamofire-dummy.m │ │ ├── Alamofire-prefix.pch │ │ ├── Alamofire-umbrella.h │ │ ├── Alamofire.modulemap │ │ ├── Alamofire.xcconfig │ │ └── Info.plist │ ├── AlamofireImage │ │ ├── AlamofireImage-dummy.m │ │ ├── AlamofireImage-prefix.pch │ │ ├── AlamofireImage-umbrella.h │ │ ├── AlamofireImage.modulemap │ │ ├── AlamofireImage.xcconfig │ │ └── Info.plist │ ├── Decodable │ │ ├── Decodable-dummy.m │ │ ├── Decodable-prefix.pch │ │ ├── Decodable-umbrella.h │ │ ├── Decodable.modulemap │ │ ├── Decodable.xcconfig │ │ └── Info.plist │ ├── Pods-HyperRecipe │ │ ├── Info.plist │ │ ├── Pods-HyperRecipe-acknowledgements.markdown │ │ ├── Pods-HyperRecipe-acknowledgements.plist │ │ ├── Pods-HyperRecipe-dummy.m │ │ ├── Pods-HyperRecipe-frameworks.sh │ │ ├── Pods-HyperRecipe-resources.sh │ │ ├── Pods-HyperRecipe-umbrella.h │ │ ├── Pods-HyperRecipe.debug.xcconfig │ │ ├── Pods-HyperRecipe.modulemap │ │ └── Pods-HyperRecipe.release.xcconfig │ ├── RxCocoa │ │ ├── Info.plist │ │ ├── RxCocoa-dummy.m │ │ ├── RxCocoa-prefix.pch │ │ ├── RxCocoa-umbrella.h │ │ ├── RxCocoa.modulemap │ │ └── RxCocoa.xcconfig │ ├── RxSwift │ │ ├── Info.plist │ │ ├── RxSwift-dummy.m │ │ ├── RxSwift-prefix.pch │ │ ├── RxSwift-umbrella.h │ │ ├── RxSwift.modulemap │ │ └── RxSwift.xcconfig │ ├── Swinject │ │ ├── Info.plist │ │ ├── Swinject-dummy.m │ │ ├── Swinject-prefix.pch │ │ ├── Swinject-umbrella.h │ │ ├── Swinject.modulemap │ │ └── Swinject.xcconfig │ ├── SwinjectStoryboard │ │ ├── Info.plist │ │ ├── SwinjectStoryboard-dummy.m │ │ ├── SwinjectStoryboard-prefix.pch │ │ ├── SwinjectStoryboard-umbrella.h │ │ ├── SwinjectStoryboard.modulemap │ │ └── SwinjectStoryboard.xcconfig │ └── expanding-collection │ │ ├── Info.plist │ │ ├── expanding-collection-dummy.m │ │ ├── expanding-collection-prefix.pch │ │ ├── expanding-collection-umbrella.h │ │ ├── expanding-collection.modulemap │ │ └── expanding-collection.xcconfig └── expanding-collection │ ├── LICENSE │ ├── README.md │ └── Source │ ├── ExpandingTableViewController │ └── ExpandingTableViewController.swift │ ├── ExpandingViewController │ ├── CollectionView │ │ ├── Cells │ │ │ └── BasePageCollectionCell.swift │ │ ├── Layout │ │ │ └── PageCollectionLayout.swift │ │ └── PageCollectionView.swift │ └── ExpandingViewController.swift │ ├── Helpers │ ├── Animations │ │ └── CornerAnimatable │ │ │ └── CornerAnimatable.swift │ ├── ConfigurationHelper │ │ └── ConfigurationHelper.swift │ ├── Constraints Helpers │ │ └── ConstraintsHelper.swift │ ├── ScreenShot │ │ └── ScreenShotHelper.swift │ └── SubviewsForEach │ │ └── SubviewsForEach.swift │ └── TransitionDriver │ └── TransitionDriver.swift ├── README.md └── README ├── Add.png ├── AppIcon.png ├── Explore.png └── SplashScreen.png /.gitignore: -------------------------------------------------------------------------------- 1 | *.xcscheme 2 | -------------------------------------------------------------------------------- /HyperRecipe.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /HyperRecipe.xcodeproj/xcuserdata/rebouhaymen.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | HyperRecipe Stub.xcscheme 8 | 9 | orderHint 10 | 10 11 | 12 | HyperRecipe.xcscheme 13 | 14 | orderHint 15 | 0 16 | 17 | 18 | SuppressBuildableAutocreation 19 | 20 | A514F2971E31604F00AC875B 21 | 22 | primary 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /HyperRecipe.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /HyperRecipe.xcworkspace/xcuserdata/rebouhaymen.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | -------------------------------------------------------------------------------- /HyperRecipe/APIs/RecipeAPI.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeAPI.swift 3 | // HyperRecipe 4 | // 5 | // Created by Rebouh Aymen on 21/01/2017. 6 | // Copyright © 2017 Aymen Rebouh. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import RxSwift 11 | import RxCocoa 12 | 13 | protocol RecipeAPI { 14 | func getAllRecipes() -> Observable<[Recipe]> 15 | func deleteRecipe(id: Int) -> Observable<()> 16 | func updateRecipe(withId id: Int, andData data: [String: Any]) -> Observable<()> 17 | func createRecipe(withData data: [String: Any]) -> Observable 18 | } 19 | -------------------------------------------------------------------------------- /HyperRecipe/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // HyperRecipe 4 | // 5 | // Created by Rebouh Aymen on 19/01/2017. 6 | // Copyright © 2017 Aymen Rebouh. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 18 | UITabBar.appearance().tintColor = UIColor.hyperOrange 19 | 20 | return true 21 | } 22 | 23 | } 24 | 25 | -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x-1.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x-1.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Cross.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Cross.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Cross.imageset/Cross.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Cross.imageset/Cross.pdf -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/apple-2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "apple-2.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "apple-2@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "apple-2@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/apple-2.imageset/apple-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/apple-2.imageset/apple-2.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/apple-2.imageset/apple-2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/apple-2.imageset/apple-2@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/apple-2.imageset/apple-2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/apple-2.imageset/apple-2@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/broccoli.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "broccoli.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "broccoli@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "broccoli@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/broccoli.imageset/broccoli.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/broccoli.imageset/broccoli.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/broccoli.imageset/broccoli@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/broccoli.imageset/broccoli@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/broccoli.imageset/broccoli@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/broccoli.imageset/broccoli@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/cheese.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cheese.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "cheese@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "cheese@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/cheese.imageset/cheese.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/cheese.imageset/cheese.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/cheese.imageset/cheese@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/cheese.imageset/cheese@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/cheese.imageset/cheese@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/cheese.imageset/cheese@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/cherry.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "cherry.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "cherry@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "cherry@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/cherry.imageset/cherry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/cherry.imageset/cherry.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/cherry.imageset/cherry@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/cherry.imageset/cherry@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/cherry.imageset/cherry@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/cherry.imageset/cherry@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/chicken-leg.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "chicken-leg.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "chicken-leg@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "chicken-leg@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/chicken-leg.imageset/chicken-leg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/chicken-leg.imageset/chicken-leg.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/chicken-leg.imageset/chicken-leg@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/chicken-leg.imageset/chicken-leg@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/chicken-leg.imageset/chicken-leg@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/chicken-leg.imageset/chicken-leg@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/fried-egg.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "fried-egg.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "fried-egg@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "fried-egg@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/fried-egg.imageset/fried-egg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/fried-egg.imageset/fried-egg.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/fried-egg.imageset/fried-egg@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/fried-egg.imageset/fried-egg@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/fried-egg.imageset/fried-egg@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/fried-egg.imageset/fried-egg@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/grapes.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "grapes.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "grapes@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "grapes@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/grapes.imageset/grapes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/grapes.imageset/grapes.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/grapes.imageset/grapes@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/grapes.imageset/grapes@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/grapes.imageset/grapes@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/grapes.imageset/grapes@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/ham.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "ham.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "ham@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "ham@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/ham.imageset/ham.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/ham.imageset/ham.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/ham.imageset/ham@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/ham.imageset/ham@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/ham.imageset/ham@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/ham.imageset/ham@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/lobster.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "lobster.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "lobster@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "lobster@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/lobster.imageset/lobster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/lobster.imageset/lobster.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/lobster.imageset/lobster@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/lobster.imageset/lobster@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/lobster.imageset/lobster@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/lobster.imageset/lobster@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/meat.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "meat.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "meat@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "meat@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/meat.imageset/meat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/meat.imageset/meat.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/meat.imageset/meat@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/meat.imageset/meat@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/meat.imageset/meat@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/meat.imageset/meat@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/melon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "melon.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "melon@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "melon@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/melon.imageset/melon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/melon.imageset/melon.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/melon.imageset/melon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/melon.imageset/melon@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/melon.imageset/melon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/melon.imageset/melon@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/mushroom.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "mushroom.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "mushroom@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "mushroom@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/mushroom.imageset/mushroom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/mushroom.imageset/mushroom.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/mushroom.imageset/mushroom@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/mushroom.imageset/mushroom@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/mushroom.imageset/mushroom@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/mushroom.imageset/mushroom@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/orange-2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "orange-2.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "orange-2@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "orange-2@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/orange-2.imageset/orange-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/orange-2.imageset/orange-2.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/orange-2.imageset/orange-2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/orange-2.imageset/orange-2@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/orange-2.imageset/orange-2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/orange-2.imageset/orange-2@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/orange.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "orange.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "orange@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "orange@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/orange.imageset/orange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/orange.imageset/orange.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/orange.imageset/orange@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/orange.imageset/orange@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/orange.imageset/orange@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/orange.imageset/orange@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/pear.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "pear.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "pear@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "pear@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/pear.imageset/pear.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/pear.imageset/pear.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/pear.imageset/pear@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/pear.imageset/pear@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/pear.imageset/pear@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/pear.imageset/pear@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/pizza-2.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "pizza-2.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "pizza-2@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "pizza-2@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/pizza-2.imageset/pizza-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/pizza-2.imageset/pizza-2.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/pizza-2.imageset/pizza-2@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/pizza-2.imageset/pizza-2@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/pizza-2.imageset/pizza-2@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/pizza-2.imageset/pizza-2@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/pizza.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "pizza.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "pizza@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "pizza@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/pizza.imageset/pizza.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/pizza.imageset/pizza.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/pizza.imageset/pizza@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/pizza.imageset/pizza@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/pizza.imageset/pizza@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/pizza.imageset/pizza@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/radish.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "radish.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "radish@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "radish@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/radish.imageset/radish.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/radish.imageset/radish.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/radish.imageset/radish@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/radish.imageset/radish@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/radish.imageset/radish@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/radish.imageset/radish@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/strawberry.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "strawberry.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "strawberry@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "strawberry@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/strawberry.imageset/strawberry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/strawberry.imageset/strawberry.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/strawberry.imageset/strawberry@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/strawberry.imageset/strawberry@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/strawberry.imageset/strawberry@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/strawberry.imageset/strawberry@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/watermelon.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "watermelon.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "filename" : "watermelon@2x.png", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "universal", 15 | "filename" : "watermelon@3x.png", 16 | "scale" : "3x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/watermelon.imageset/watermelon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/watermelon.imageset/watermelon.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/watermelon.imageset/watermelon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/watermelon.imageset/watermelon@2x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Fruit and vegetables/watermelon.imageset/watermelon@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Fruit and vegetables/watermelon.imageset/watermelon@3x.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Recipe form/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Recipe form/favorite-fill.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "favorite-fill.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Recipe form/favorite-fill.imageset/favorite-fill.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Recipe form/favorite-fill.imageset/favorite-fill.pdf -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Recipe form/favorite.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "favorite.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Recipe form/favorite.imageset/favorite.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Recipe form/favorite.imageset/favorite.pdf -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Recipe form/recipePlaceholder.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "recipePlaceholder.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Recipe form/recipePlaceholder.imageset/recipePlaceholder.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Recipe form/recipePlaceholder.imageset/recipePlaceholder.pdf -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Tab bar/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Tab bar/addRecipe.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "addRecipe.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Tab bar/addRecipe.imageset/addRecipe.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Tab bar/addRecipe.imageset/addRecipe.pdf -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Tab bar/recipe.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "recipe.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | }, 12 | "properties" : { 13 | "template-rendering-intent" : "original" 14 | } 15 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/Tab bar/recipe.imageset/recipe.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/Tab bar/recipe.imageset/recipe.pdf -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/bottomArrow.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Disclosure Indicator.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/bottomArrow.imageset/Disclosure Indicator.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/bottomArrow.imageset/Disclosure Indicator.pdf -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/flagFavorite-selected.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "flagFavorite.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/flagFavorite-selected.imageset/flagFavorite.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/flagFavorite-selected.imageset/flagFavorite.pdf -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/flagFavorite.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "flagFavorite.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/flagFavorite.imageset/flagFavorite.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/flagFavorite.imageset/flagFavorite.pdf -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/logo.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "logo.png", 6 | "scale" : "1x" 7 | }, 8 | { 9 | "idiom" : "universal", 10 | "scale" : "2x" 11 | }, 12 | { 13 | "idiom" : "universal", 14 | "scale" : "3x" 15 | } 16 | ], 17 | "info" : { 18 | "version" : 1, 19 | "author" : "xcode" 20 | } 21 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/logo.imageset/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/logo.imageset/logo.png -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/menu.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "Menu.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/menu.imageset/Menu.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/menu.imageset/Menu.pdf -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/recipeBackgroundPlaceholder.imageset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "filename" : "recipePlaceholder.pdf" 6 | } 7 | ], 8 | "info" : { 9 | "version" : 1, 10 | "author" : "xcode" 11 | } 12 | } -------------------------------------------------------------------------------- /HyperRecipe/Assets.xcassets/recipeBackgroundPlaceholder.imageset/recipePlaceholder.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/HyperRecipe/Assets.xcassets/recipeBackgroundPlaceholder.imageset/recipePlaceholder.pdf -------------------------------------------------------------------------------- /HyperRecipe/DependencyInjection/SwinjectStoryboardExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwinjectStoryboardExtension.swift 3 | // HyperRecipe 4 | // 5 | // Created by Rebouh Aymen on 22/01/2017. 6 | // Copyright © 2017 Aymen Rebouh. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Swinject 11 | import SwinjectStoryboard 12 | 13 | extension SwinjectStoryboard { 14 | class func setup() { 15 | 16 | Container.loggingFunction = nil 17 | 18 | // Scheme HyperRecipe Stub/Run/Arguments and you'll find below the Stub argument 19 | if ProcessInfo.processInfo.arguments.contains("Stub") { 20 | defaultContainer.register(RecipeAPI.self) { _ in RecipeStub() } 21 | } else { 22 | defaultContainer.register(RecipeAPI.self) { _ in RecipeNetwork() } 23 | } 24 | 25 | defaultContainer.register(RecipeViewModel.self) { r in 26 | let viewModel = RecipeViewModel(service: r.resolve(RecipeAPI.self)!) 27 | return viewModel 28 | } 29 | 30 | defaultContainer.register(RecipeFormViewModel.self) { r in 31 | let viewModel = RecipeFormViewModel(service: r.resolve(RecipeAPI.self)!) 32 | return viewModel 33 | } 34 | 35 | defaultContainer.storyboardInitCompleted(ExploreViewController.self) { r, c in 36 | c.viewModel = r.resolve(RecipeViewModel.self) 37 | } 38 | 39 | defaultContainer.storyboardInitCompleted(RecipeFormViewController.self) { r, c in 40 | c.viewModel = r.resolve(RecipeFormViewModel.self) 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /HyperRecipe/Extensions/ArrayExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ArrayExtension.swift 3 | // HyperRecipe 4 | // 5 | // Created by Rebouh Aymen on 21/01/2017. 6 | // Copyright © 2017 Aymen Rebouh. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension Array { 12 | func randomSort() -> Array { 13 | let sortedArray = sorted { _ in arc4random() < arc4random() } 14 | return sortedArray 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /HyperRecipe/Extensions/ColorExtension.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ColorExtension.swift 3 | // HyperRecipe 4 | // 5 | // Created by Rebouh Aymen on 21/01/2017. 6 | // Copyright © 2017 Aymen Rebouh. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIColor { 12 | static let hyperDarkBlue = #colorLiteral(red: 0.2469966114, green: 0.3779316545, blue: 0.4080758095, alpha: 1) 13 | static let hyperBeige = #colorLiteral(red: 0.9310407043, green: 0.9225626588, blue: 0.8535305858, alpha: 1) 14 | static let hyperOrange = #colorLiteral(red: 0.9698477387, green: 0.5682272315, blue: 0.2841275036, alpha: 1) 15 | static let hyperBrown = #colorLiteral(red: 0.8176086545, green: 0.6650074124, blue: 0.5771699548, alpha: 1) 16 | } 17 | -------------------------------------------------------------------------------- /HyperRecipe/Models/Photo.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Photo.swift 3 | // HyperRecipe 4 | // 5 | // Created by Rebouh Aymen on 21/01/2017. 6 | // Copyright © 2017 Aymen Rebouh. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Decodable 11 | 12 | 13 | struct Photo { 14 | let url: String 15 | let thumbnailUrl: String 16 | } 17 | 18 | extension Photo: Decodable { 19 | public static func decode(_ json: Any) throws -> Photo { 20 | return try Photo( 21 | url: json => "url", 22 | thumbnailUrl: json => "thumbnail_url" 23 | ) 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /HyperRecipe/Models/Recipe.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Recipe.swift 3 | // HyperRecipe 4 | // 5 | // Created by Rebouh Aymen on 19/01/2017. 6 | // Copyright © 2017 Aymen Rebouh. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Decodable 11 | 12 | struct Recipe { 13 | let id: Int 14 | var name: String 15 | var description: String 16 | var instructions: String 17 | var favorite: Bool 18 | var difficulty: Int 19 | let createdDate: String 20 | let updatedDate: String 21 | let photo: Photo 22 | } 23 | 24 | extension Recipe: Decodable { 25 | public static func decode(_ json: Any) throws -> Recipe { 26 | return try Recipe( 27 | id: json => "id", 28 | name: json => "name", 29 | description: json => "description", 30 | instructions: json => "instructions", 31 | favorite: json => "favorite", 32 | difficulty: json => "difficulty", 33 | createdDate: json => "created_at", 34 | updatedDate: json => "updated_at", 35 | photo: json => "photo" 36 | ) 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /HyperRecipe/ViewControllers/AboutViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AboutViewController.swift 3 | // HyperRecipe 4 | // 5 | // Created by Rebouh Aymen on 21/01/2017. 6 | // Copyright © 2017 Aymen Rebouh. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class AboutViewController: UIViewController { 12 | 13 | // MARK: - User Interaction 14 | 15 | @IBAction func redirectToBlog(_ sender: Any) { 16 | if let url = URL(string: "http://aymenworks.com") { 17 | UIApplication.shared.open(url, options: [:], completionHandler: nil) 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /HyperRecipe/ViewControllers/BaseNavigationViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BaseNavigationViewController.swift 3 | // HyperRecipe 4 | // 5 | // Created by Rebouh Aymen on 31/01/2017. 6 | // Copyright © 2017 Aymen Rebouh. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class BaseNavigationViewController: UINavigationController { 12 | 13 | // MARK: - Lifecycle 14 | 15 | override func viewDidLoad() { 16 | super.viewDidLoad() 17 | 18 | navigationBar.shadowImage = UIImage() 19 | navigationBar.setBackgroundImage(UIImage(), for: .default) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /HyperRecipe/ViewControllers/SplashViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SplashViewController.swift 3 | // HyperRecipe 4 | // 5 | // Created by Rebouh Aymen on 02/02/2017. 6 | // Copyright © 2017 Aymen Rebouh. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class SplashViewController: UIViewController { 12 | 13 | override func viewDidLoad() { 14 | super.viewDidLoad() 15 | 16 | CAEmitterRecipe.animate(inView: self.view, duration: 0.3) 17 | DispatchQueue.main.asyncAfter(deadline: .now() + 3) { 18 | self.performSegue(withIdentifier: "showApp", sender: self) 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /HyperRecipe/ViewModel/RecipeViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeViewModel.swift 3 | // HyperRecipe 4 | // 5 | // Created by Rebouh Aymen on 22/01/2017. 6 | // Copyright © 2017 Aymen Rebouh. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import RxSwift 11 | import RxCocoa 12 | 13 | struct RecipeViewModel { 14 | 15 | // MARK: - Properties 16 | 17 | let service: RecipeAPI 18 | var recipes = [Recipe]() 19 | let error = Variable(nil) 20 | 21 | var currentLevel = 2 22 | 23 | let disposeBag = DisposeBag() 24 | 25 | // MARK: - Lifecycle 26 | 27 | init(service: RecipeAPI) { 28 | self.service = service 29 | } 30 | 31 | // MARK: - Network 32 | 33 | func getAllRecipes() -> Observable<[Recipe]> { 34 | return Observable<[Recipe]>.create { observer in 35 | self.service.getAllRecipes().subscribe( 36 | onNext: { recipes in 37 | observer.onNext(recipes) 38 | }, 39 | onError: { error in 40 | observer.onError(error) 41 | }).addDisposableTo(self.disposeBag) 42 | return Disposables.create() 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /HyperRecipe/Views/RecipeCollectionViewCell/RecipeCollectionViewCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeCollectionViewCell.swift 3 | // HyperRecipe 4 | // 5 | // Created by Rebouh Aymen on 22/01/2017. 6 | // Copyright © 2017 Aymen Rebouh. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import expanding_collection 11 | import RxSwift 12 | import RxCocoa 13 | 14 | class RecipeCollectionViewCell: BasePageCollectionCell { 15 | 16 | // MARK: - Properties 17 | 18 | let disposeBag = DisposeBag() 19 | @IBOutlet weak var recipeImageView: UIImageView! 20 | @IBOutlet weak var titleLabel: UILabel! 21 | @IBOutlet weak var descriptionLabel: UILabel! 22 | @IBOutlet weak var flagFavorite: UIImageView! 23 | 24 | var isFavorite = false { 25 | didSet { 26 | flagFavorite.isHidden = isFavorite == false 27 | } 28 | } 29 | 30 | var recipe: Recipe! { 31 | didSet { 32 | titleLabel.text = recipe.name 33 | descriptionLabel.text = recipe.description 34 | isFavorite = recipe.favorite 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /HyperRecipe/Views/RecipeDetailSectionCell/RecipeDetailHeaderSectionCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeDetailHeaderSectionCell.swift 3 | // HyperRecipe 4 | // 5 | // Created by Rebouh Aymen on 29/01/2017. 6 | // Copyright © 2017 Aymen Rebouh. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class RecipeDetailHeaderSectionCell: UITableViewCell { 12 | @IBOutlet weak var titleLabel: UILabel! 13 | } 14 | -------------------------------------------------------------------------------- /HyperRecipe/Views/RecipeDetailSectionCell/RecipeDetailSectionCell.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RecipeDetailSectionCell.swift 3 | // HyperRecipe 4 | // 5 | // Created by Rebouh Aymen on 28/01/2017. 6 | // Copyright © 2017 Aymen Rebouh. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | class RecipeDetailSectionCell: UITableViewCell { 12 | 13 | @IBOutlet weak var headerView: UIView! 14 | 15 | @IBOutlet weak var mainView: UIView! { 16 | didSet { 17 | mainView.layer.cornerRadius = 5 18 | mainView.layer.shadowColor = UIColor(red: 221/255, green: 221/250, blue: 221/250, alpha: 1.0).cgColor 19 | mainView.layer.shadowOffset = .zero 20 | mainView.layer.shadowRadius = 5.0 21 | mainView.layer.shadowOpacity = 1.0 22 | } 23 | } 24 | 25 | override func layoutSubviews() { 26 | let bezierPath = UIBezierPath(roundedRect: headerView.bounds, byRoundingCorners: [.topLeft, .topRight], cornerRadii: CGSize(width: 5, height: 5)) 27 | let maskLayer = CAShapeLayer() 28 | maskLayer.path = bezierPath.cgPath 29 | headerView.layer.mask = maskLayer 30 | } 31 | 32 | @IBOutlet weak var titleLabel: UILabel! 33 | @IBOutlet weak var descriptionLabel: UILabel! 34 | } 35 | -------------------------------------------------------------------------------- /Podfile: -------------------------------------------------------------------------------- 1 | platform :ios, '10.0' 2 | use_frameworks! 3 | 4 | target 'HyperRecipe' do 5 | pod 'RxSwift', '~> 3.0' 6 | pod 'RxCocoa', '~> 3.0' 7 | pod 'Decodable' 8 | pod 'Alamofire', '~> 4.0' 9 | pod 'AlamofireImage', '~> 3.1' 10 | pod 'Swinject', '~> 2.0.0' 11 | pod 'SwinjectStoryboard', '~> 1.0.0' 12 | pod 'expanding-collection', '~> 1.0.3' 13 | end 14 | -------------------------------------------------------------------------------- /Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Alamofire (4.3.0) 3 | - AlamofireImage (3.2.0): 4 | - Alamofire (~> 4.1) 5 | - Decodable (0.5) 6 | - expanding-collection (1.0.4) 7 | - RxCocoa (3.1.0): 8 | - RxSwift (~> 3.1) 9 | - RxSwift (3.1.0) 10 | - Swinject (2.0.0) 11 | - SwinjectStoryboard (1.0.0): 12 | - Swinject (= 2.0.0) 13 | 14 | DEPENDENCIES: 15 | - Alamofire (~> 4.0) 16 | - AlamofireImage (~> 3.1) 17 | - Decodable 18 | - expanding-collection (~> 1.0.3) 19 | - RxCocoa (~> 3.0) 20 | - RxSwift (~> 3.0) 21 | - Swinject (~> 2.0.0) 22 | - SwinjectStoryboard (~> 1.0.0) 23 | 24 | SPEC CHECKSUMS: 25 | Alamofire: 856a113053a7bc9cbe5d6367a555d773fc5cfef7 26 | AlamofireImage: 157ed682cc81d3b9db4fb90c1f12180ac552d93b 27 | Decodable: 7c90acc68d357b71d0d6efc120faf9c53c644b7e 28 | expanding-collection: be78b5822d7382d3da02b52d52273f4661567a64 29 | RxCocoa: 50d7564866da9299161e86a263ce12a0873904d8 30 | RxSwift: 83ff553e7593fdfdcb2562933a64c0284dffdadc 31 | Swinject: 2e964a80d70ab09b3949c99032711f89147bfd60 32 | SwinjectStoryboard: 8e0d3c0202b64172bdf915d55e8dc83d9c4e7863 33 | 34 | PODFILE CHECKSUM: d444880811037130514f310c04232dfc5e2be8cf 35 | 36 | COCOAPODS: 1.1.1 37 | -------------------------------------------------------------------------------- /Pods/Alamofire/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014-2016 Alamofire Software Foundation (http://alamofire.org/) 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 | -------------------------------------------------------------------------------- /Pods/AlamofireImage/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2015-2016 Alamofire Software Foundation (http://alamofire.org/) 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 | -------------------------------------------------------------------------------- /Pods/AlamofireImage/Source/Image.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Image.swift 3 | // 4 | // Copyright (c) 2015-2016 Alamofire Software Foundation (http://alamofire.org/) 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in 14 | // all copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 22 | // THE SOFTWARE. 23 | // 24 | 25 | import Foundation 26 | 27 | #if os(iOS) || os(tvOS) || os(watchOS) 28 | import UIKit 29 | public typealias Image = UIImage 30 | #elseif os(macOS) 31 | import Cocoa 32 | public typealias Image = NSImage 33 | #endif 34 | -------------------------------------------------------------------------------- /Pods/Decodable/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Johannes Lund 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 all 13 | 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 THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /Pods/Decodable/Sources/Decodable.h: -------------------------------------------------------------------------------- 1 | // 2 | // Decodable.h 3 | // Decodable 4 | // 5 | // Created by Johannes Lund on 2015-07-08. 6 | // Copyright © 2015 anviking. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for Decodable. 12 | FOUNDATION_EXPORT double DecodableVersionNumber; 13 | 14 | //! Project version string for Decodable. 15 | FOUNDATION_EXPORT const unsigned char DecodableVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /Pods/Decodable/Sources/KeyPath.swift: -------------------------------------------------------------------------------- 1 | // 2 | // KeyPath.swift 3 | // Decodable 4 | // 5 | // Created by Johannes Lund on 2016-07-09. 6 | // Copyright © 2016 anviking. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// `KeyPath` represents the path to a specific node in a tree of nested dictionaries. 12 | /// 13 | /// Can be created from string and array literals and can be joined by the `=>` operator. 14 | /// ``` 15 | /// let a: KeyPath = "a" 16 | /// let b: KeyPath = ["a", "b"] 17 | /// let c: KeyPath = "a" => "b" => "c" 18 | /// ``` 19 | 20 | public struct KeyPath { 21 | public var keys: [String] 22 | 23 | public init(_ keys: [String]) { 24 | self.keys = keys 25 | } 26 | 27 | public init(_ key: String) { 28 | self.keys = [key] 29 | } 30 | 31 | } 32 | 33 | extension KeyPath: ExpressibleByStringLiteral { 34 | public init(stringLiteral value: String) { 35 | self.keys = [value] 36 | } 37 | 38 | public init(extendedGraphemeClusterLiteral value: String) { 39 | self.keys = [value] 40 | } 41 | 42 | public init(unicodeScalarLiteral value: String) { 43 | self.keys = [value] 44 | } 45 | } 46 | 47 | extension KeyPath: ExpressibleByArrayLiteral { 48 | public init(arrayLiteral elements: String...) { 49 | self.keys = elements 50 | } 51 | } 52 | 53 | extension KeyPath: Equatable { } 54 | public func ==(lhs: KeyPath, rhs: KeyPath) -> Bool { 55 | return lhs.keys == rhs.keys 56 | } 57 | -------------------------------------------------------------------------------- /Pods/Decodable/Sources/RawRepresentableDecodable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RawRepresentableDecodable.swift 3 | // Decodable 4 | // 5 | // Created by Daniel Garbień on 06/11/15. 6 | // Copyright © 2015 anviking. All rights reserved. 7 | // 8 | 9 | /** 10 | * Extends all RawRepresentables (enums) which are also Decodable with decode implementation. 11 | * 12 | * I could not find a way to implicitly declare RawRepresentable conforming to Decodable, what would make all enums Decodable automatically. 13 | * Because of that for an enum to be compatible with Decodable operators it must be declared as implementing Decodable protocol. 14 | */ 15 | public extension RawRepresentable where RawValue: Decodable, Self: Decodable { 16 | 17 | static func decode(_ json: Any) throws -> Self { 18 | let rawValue = try RawValue.decode(json) 19 | guard let rawRepresentable = Self(rawValue: rawValue) else { 20 | let metadata = DecodingError.Metadata(object: json) 21 | throw DecodingError.rawRepresentableInitializationError(rawValue: rawValue, metadata) 22 | } 23 | return rawRepresentable 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Alamofire (4.3.0) 3 | - AlamofireImage (3.2.0): 4 | - Alamofire (~> 4.1) 5 | - Decodable (0.5) 6 | - expanding-collection (1.0.4) 7 | - RxCocoa (3.1.0): 8 | - RxSwift (~> 3.1) 9 | - RxSwift (3.1.0) 10 | - Swinject (2.0.0) 11 | - SwinjectStoryboard (1.0.0): 12 | - Swinject (= 2.0.0) 13 | 14 | DEPENDENCIES: 15 | - Alamofire (~> 4.0) 16 | - AlamofireImage (~> 3.1) 17 | - Decodable 18 | - expanding-collection (~> 1.0.3) 19 | - RxCocoa (~> 3.0) 20 | - RxSwift (~> 3.0) 21 | - Swinject (~> 2.0.0) 22 | - SwinjectStoryboard (~> 1.0.0) 23 | 24 | SPEC CHECKSUMS: 25 | Alamofire: 856a113053a7bc9cbe5d6367a555d773fc5cfef7 26 | AlamofireImage: 157ed682cc81d3b9db4fb90c1f12180ac552d93b 27 | Decodable: 7c90acc68d357b71d0d6efc120faf9c53c644b7e 28 | expanding-collection: be78b5822d7382d3da02b52d52273f4661567a64 29 | RxCocoa: 50d7564866da9299161e86a263ce12a0873904d8 30 | RxSwift: 83ff553e7593fdfdcb2562933a64c0284dffdadc 31 | Swinject: 2e964a80d70ab09b3949c99032711f89147bfd60 32 | SwinjectStoryboard: 8e0d3c0202b64172bdf915d55e8dc83d9c4e7863 33 | 34 | PODFILE CHECKSUM: d444880811037130514f310c04232dfc5e2be8cf 35 | 36 | COCOAPODS: 1.1.1 37 | -------------------------------------------------------------------------------- /Pods/RxCocoa/LICENSE.md: -------------------------------------------------------------------------------- 1 | **The MIT License** 2 | **Copyright © 2015 Krunoslav Zaher** 3 | **All rights reserved.** 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /Pods/RxCocoa/Platform/DataStructures/InfiniteSequence.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InfiniteSequence.swift 3 | // Platform 4 | // 5 | // Created by Krunoslav Zaher on 6/13/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Sequence that repeats `repeatedValue` infinite number of times. 12 | struct InfiniteSequence : Sequence { 13 | typealias Element = E 14 | typealias Iterator = AnyIterator 15 | 16 | private let _repeatedValue: E 17 | 18 | init(repeatedValue: E) { 19 | _repeatedValue = repeatedValue 20 | } 21 | 22 | func makeIterator() -> Iterator { 23 | let repeatedValue = _repeatedValue 24 | return AnyIterator { 25 | return repeatedValue 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Pods/RxCocoa/Platform/DispatchQueue+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DispatchQueue+Extensions.swift 3 | // Platform 4 | // 5 | // Created by Krunoslav Zaher on 10/22/16. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Dispatch 11 | 12 | extension DispatchQueue { 13 | private static var token: DispatchSpecificKey<()> = { 14 | let key = DispatchSpecificKey<()>() 15 | DispatchQueue.main.setSpecific(key: key, value: ()) 16 | return key 17 | }() 18 | 19 | static var isMain: Bool { 20 | return DispatchQueue.getSpecific(key: token) != nil 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Pods/RxCocoa/Platform/Platform.Darwin.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Platform.Darwin.swift 3 | // Platform 4 | // 5 | // Created by Krunoslav Zaher on 12/29/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) 10 | 11 | import Darwin 12 | import Foundation 13 | 14 | typealias AtomicInt = Int32 15 | 16 | let AtomicCompareAndSwap = OSAtomicCompareAndSwap32Barrier 17 | let AtomicIncrement = OSAtomicIncrement32Barrier 18 | let AtomicDecrement = OSAtomicDecrement32Barrier 19 | 20 | extension Thread { 21 | 22 | static func setThreadLocalStorageValue(_ value: T?, forKey key: String 23 | ) { 24 | let currentThread = Thread.current 25 | let threadDictionary = currentThread.threadDictionary 26 | 27 | if let newValue = value { 28 | threadDictionary[key] = newValue 29 | } 30 | else { 31 | threadDictionary[key] = nil 32 | } 33 | 34 | } 35 | static func getThreadLocalStorageValueForKey(_ key: String) -> T? { 36 | let currentThread = Thread.current 37 | let threadDictionary = currentThread.threadDictionary 38 | 39 | return threadDictionary[key] as? T 40 | } 41 | } 42 | 43 | extension AtomicInt { 44 | func valueSnapshot() -> Int32 { 45 | return self 46 | } 47 | } 48 | 49 | #endif 50 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ControlEvent+Driver.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ControlEvent+Driver.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 9/19/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | #if !RX_NO_MODULE 11 | import RxSwift 12 | #endif 13 | 14 | extension ControlEvent { 15 | /// Converts `ControlEvent` to `Driver` unit. 16 | /// 17 | /// `ControlEvent` already can't fail, so no special case needs to be handled. 18 | public func asDriver() -> Driver { 19 | return self.asDriver { (error) -> Driver in 20 | #if DEBUG 21 | rxFatalError("Somehow driver received error from a source that shouldn't fail.") 22 | #else 23 | return Driver.empty() 24 | #endif 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/ControlProperty+Driver.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ControlProperty+Driver.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 9/19/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | #if !RX_NO_MODULE 11 | import RxSwift 12 | #endif 13 | 14 | extension ControlProperty { 15 | /// Converts `ControlProperty` to `Driver` unit. 16 | /// 17 | /// `ControlProperty` already can't fail, so no special case needs to be handled. 18 | public func asDriver() -> Driver { 19 | return self.asDriver { (error) -> Driver in 20 | #if DEBUG 21 | rxFatalError("Somehow driver received error from a source that shouldn't fail.") 22 | #else 23 | return Driver.empty() 24 | #endif 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/CocoaUnits/Driver/Variable+Driver.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Variable+Driver.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 12/28/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | #if !RX_NO_MODULE 11 | import RxSwift 12 | #endif 13 | 14 | extension Variable { 15 | /// Converts `Variable` to `Driver` unit. 16 | /// 17 | /// - returns: Driving observable sequence. 18 | public func asDriver() -> Driver { 19 | let source = self.asObservable() 20 | .observeOn(DriverSharingStrategy.scheduler) 21 | return Driver(source) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/CocoaUnits/SharedSequence/Variable+SharedSequence.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Variable+SharedSequence.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 12/28/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | #if !RX_NO_MODULE 11 | import RxSwift 12 | #endif 13 | 14 | extension Variable { 15 | /// Converts `Variable` to `SharedSequence` unit. 16 | /// 17 | /// - returns: Observable sequence. 18 | public func asSharedSequence(strategy: SharingStrategy.Type = SharingStrategy.self) -> SharedSequence { 19 | let source = self.asObservable() 20 | .observeOn(SharingStrategy.scheduler) 21 | return SharedSequence(source) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/Common/NSLayoutConstraint+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSLayoutConstraint+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 12/6/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if !os(Linux) 10 | 11 | import Foundation 12 | 13 | #if os(macOS) 14 | import Cocoa 15 | #else 16 | import UIKit 17 | #endif 18 | 19 | #if !RX_NO_MODULE 20 | import RxSwift 21 | #endif 22 | 23 | #if os(iOS) || os(macOS) || os(tvOS) 24 | extension Reactive where Base: NSLayoutConstraint { 25 | /// Bindable sink for `constant` property. 26 | public var constant: UIBindingObserver { 27 | return UIBindingObserver(UIElement: self.base) { constraint, constant in 28 | constraint.constant = constant 29 | } 30 | } 31 | 32 | /// Bindable sink for `active` property. 33 | @available(iOS 8, OSX 10.10, *) 34 | public var active: UIBindingObserver { 35 | return UIBindingObserver(UIElement: self.base) { constraint, value in 36 | constraint.isActive = value 37 | } 38 | } 39 | } 40 | 41 | #endif 42 | 43 | #endif 44 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/Common/RxTarget.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxTarget.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 7/12/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | #if !RX_NO_MODULE 11 | import RxSwift 12 | #endif 13 | 14 | class RxTarget : NSObject 15 | , Disposable { 16 | 17 | private var retainSelf: RxTarget? 18 | 19 | override init() { 20 | super.init() 21 | self.retainSelf = self 22 | 23 | #if TRACE_RESOURCES 24 | _ = Resources.incrementTotal() 25 | #endif 26 | 27 | #if DEBUG 28 | MainScheduler.ensureExecutingOnScheduler() 29 | #endif 30 | } 31 | 32 | func dispose() { 33 | #if DEBUG 34 | MainScheduler.ensureExecutingOnScheduler() 35 | #endif 36 | self.retainSelf = nil 37 | } 38 | 39 | #if TRACE_RESOURCES 40 | deinit { 41 | _ = Resources.decrementTotal() 42 | } 43 | #endif 44 | } 45 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/Common/SectionedViewDataSourceType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SectionedViewDataSourceType.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 1/10/16. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Data source with access to underlying sectioned model. 12 | public protocol SectionedViewDataSourceType { 13 | /// Returns model at index path. 14 | /// 15 | /// In case data source doesn't contain any sections when this method is being called, `RxCocoaError.ItemsNotYetBound(object: self)` is thrown. 16 | 17 | /// - parameter indexPath: Model index path 18 | /// - returns: Model at index path. 19 | func model(at indexPath: IndexPath) throws -> Any 20 | } 21 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/Foundation/KVORepresentable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // KVORepresentable.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 11/14/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Type that is KVO representable (KVO mechanism can be used to observe it). 12 | public protocol KVORepresentable { 13 | /// Associated KVO type. 14 | associatedtype KVOType 15 | 16 | /// Constructs `Self` using KVO value. 17 | init?(KVOValue: KVOType) 18 | } 19 | 20 | extension KVORepresentable { 21 | /// Initializes `KVORepresentable` with optional value. 22 | init?(KVOValue: KVOType?) { 23 | guard let KVOValue = KVOValue else { 24 | return nil 25 | } 26 | 27 | self.init(KVOValue: KVOValue) 28 | } 29 | } 30 | 31 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/Foundation/Logging.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Logging.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 4/3/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Simple logging settings for RxCocoa library. 12 | public struct Logging { 13 | public typealias LogURLRequest = (URLRequest) -> Bool 14 | 15 | /// Log URL requests to standard output in curl format. 16 | public static var URLRequests: LogURLRequest = { _ in 17 | #if DEBUG 18 | return true 19 | #else 20 | return false 21 | #endif 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/Foundation/NSNotificationCenter+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSNotificationCenter+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 5/2/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | #if !RX_NO_MODULE 11 | import RxSwift 12 | #endif 13 | 14 | extension Reactive where Base: NotificationCenter { 15 | /** 16 | Transforms notifications posted to notification center to observable sequence of notifications. 17 | 18 | - parameter name: Optional name used to filter notifications. 19 | - parameter object: Optional object used to filter notifications. 20 | - returns: Observable sequence of posted notifications. 21 | */ 22 | public func notification(_ name: Notification.Name?, object: AnyObject? = nil) -> Observable { 23 | return Observable.create { [weak object] observer in 24 | let nsObserver = self.base.addObserver(forName: name, object: object, queue: nil) { notification in 25 | observer.on(.next(notification)) 26 | } 27 | 28 | return Disposables.create { 29 | self.base.removeObserver(nsObserver) 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/Runtime/_RX.m: -------------------------------------------------------------------------------- 1 | // 2 | // _RX.m 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 7/12/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #import "include/_RX.h" 10 | 11 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/Runtime/include/RxCocoaRuntime.h: -------------------------------------------------------------------------------- 1 | // 2 | // RxCocoaRuntime.h 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 2/21/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "_RX.h" 11 | #import "_RXDelegateProxy.h" 12 | #import "_RXKVOObserver.h" 13 | #import "_RXObjCRuntime.h" 14 | 15 | //! Project version number for RxCocoa. 16 | FOUNDATION_EXPORT double RxCocoaVersionNumber; 17 | 18 | //! Project version string for RxCocoa. 19 | FOUNDATION_EXPORT const unsigned char RxCocoaVersionString[]; 20 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/Runtime/include/_RXDelegateProxy.h: -------------------------------------------------------------------------------- 1 | // 2 | // _RXDelegateProxy.h 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 7/4/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | NS_ASSUME_NONNULL_BEGIN 12 | 13 | @interface _RXDelegateProxy : NSObject 14 | 15 | @property (nonatomic, weak, readonly) id _forwardToDelegate; 16 | 17 | -(void)_setForwardToDelegate:(id __nullable)forwardToDelegate retainDelegate:(BOOL)retainDelegate; 18 | 19 | -(BOOL)hasWiredImplementationForSelector:(SEL)selector; 20 | 21 | -(void)_sentMessage:(SEL)selector withArguments:(NSArray*)arguments; 22 | -(void)_methodInvoked:(SEL)selector withArguments:(NSArray*)arguments; 23 | 24 | @end 25 | 26 | NS_ASSUME_NONNULL_END 27 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/Runtime/include/_RXKVOObserver.h: -------------------------------------------------------------------------------- 1 | // 2 | // _RXKVOObserver.h 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 7/11/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | /** 12 | ################################################################################ 13 | This file is part of RX private API 14 | ################################################################################ 15 | */ 16 | 17 | // Exists because if written in Swift, reading unowned is disabled during dealloc process 18 | @interface _RXKVOObserver : NSObject 19 | 20 | -(instancetype)initWithTarget:(id)target 21 | retainTarget:(BOOL)retainTarget 22 | keyPath:(NSString*)keyPath 23 | options:(NSKeyValueObservingOptions)options 24 | callback:(void (^)(id))callback; 25 | 26 | -(void)dispose; 27 | 28 | @end 29 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/RxCocoa.h: -------------------------------------------------------------------------------- 1 | // 2 | // RxCocoa.h 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 2/21/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #import 10 | #import "_RX.h" 11 | #import "_RXDelegateProxy.h" 12 | #import "_RXKVOObserver.h" 13 | #import "_RXObjCRuntime.h" 14 | 15 | //! Project version number for RxCocoa. 16 | FOUNDATION_EXPORT double RxCocoaVersionNumber; 17 | 18 | //! Project version string for RxCocoa. 19 | FOUNDATION_EXPORT const unsigned char RxCocoaVersionString[]; -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/Events/ItemEvents.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ItemEvents.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 6/20/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | #if os(iOS) || os(tvOS) 11 | import UIKit 12 | 13 | public typealias ItemMovedEvent = (sourceIndex: IndexPath, destinationIndex: IndexPath) 14 | public typealias WillDisplayCellEvent = (cell: UITableViewCell, indexPath: IndexPath) 15 | public typealias DidEndDisplayingCellEvent = (cell: UITableViewCell, indexPath: IndexPath) 16 | #endif 17 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/NSTextStorage+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NSTextStorage+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Segii Shulga on 12/30/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | import Foundation 11 | 12 | #if !RX_NO_MODULE 13 | import RxSwift 14 | #endif 15 | import UIKit 16 | 17 | extension Reactive where Base: NSTextStorage { 18 | 19 | /// Reactive wrapper for `delegate`. 20 | /// 21 | /// For more information take a look at `DelegateProxyType` protocol documentation. 22 | public var delegate:DelegateProxy { 23 | return RxTextStorageDelegateProxy.proxyForObject(base) 24 | } 25 | 26 | /// Reactive wrapper for `delegate` message. 27 | public var didProcessEditingRangeChangeInLength: Observable<(editedMask:NSTextStorageEditActions, editedRange:NSRange, delta:Int)> { 28 | return delegate 29 | .methodInvoked(#selector(NSTextStorageDelegate.textStorage(_:didProcessEditing:range:changeInLength:))) 30 | .map { a in 31 | let editedMask = NSTextStorageEditActions(rawValue: try castOrThrow(UInt.self, a[1]) ) 32 | let editedRange = try castOrThrow(NSValue.self, a[2]).rangeValue 33 | let delta = try castOrThrow(Int.self, a[3]) 34 | 35 | return (editedMask, editedRange, delta) 36 | } 37 | } 38 | } 39 | #endif 40 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/Protocols/RxCollectionViewDataSourceType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxCollectionViewDataSourceType.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 6/29/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | 11 | import Foundation 12 | import UIKit 13 | #if !RX_NO_MODULE 14 | import RxSwift 15 | #endif 16 | 17 | /// Marks data source as `UICollectionView` reactive data source enabling it to be used with one of the `bindTo` methods. 18 | public protocol RxCollectionViewDataSourceType /*: UICollectionViewDataSource*/ { 19 | 20 | /// Type of elements that can be bound to collection view. 21 | associatedtype Element 22 | 23 | /// New observable sequence event observed. 24 | /// 25 | /// - parameter collectionView: Bound collection view. 26 | /// - parameter observedEvent: Event 27 | func collectionView(_ collectionView: UICollectionView, observedEvent: Event) -> Void 28 | } 29 | 30 | #endif 31 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/Protocols/RxTableViewDataSourceType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxTableViewDataSourceType.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 6/26/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | 11 | import Foundation 12 | import UIKit 13 | #if !RX_NO_MODULE 14 | import RxSwift 15 | #endif 16 | 17 | /// Marks data source as `UITableView` reactive data source enabling it to be used with one of the `bindTo` methods. 18 | public protocol RxTableViewDataSourceType /*: UITableViewDataSource*/ { 19 | 20 | /// Type of elements that can be bound to table view. 21 | associatedtype Element 22 | 23 | /// New observable sequence event observed. 24 | /// 25 | /// - parameter tableView: Bound table view. 26 | /// - parameter observedEvent: Event 27 | func tableView(_ tableView: UITableView, observedEvent: Event) -> Void 28 | } 29 | 30 | #endif 31 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/Proxies/RxCollectionViewDelegateProxy.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxCollectionViewDelegateProxy.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 6/29/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | 11 | import Foundation 12 | import UIKit 13 | #if !RX_NO_MODULE 14 | import RxSwift 15 | #endif 16 | 17 | /// For more information take a look at `DelegateProxyType`. 18 | public class RxCollectionViewDelegateProxy 19 | : RxScrollViewDelegateProxy 20 | , UICollectionViewDelegate 21 | , UICollectionViewDelegateFlowLayout { 22 | 23 | /// Typed parent object. 24 | public weak private(set) var collectionView: UICollectionView? 25 | 26 | /// Initializes `RxCollectionViewDelegateProxy` 27 | /// 28 | /// - parameter parentObject: Parent object for delegate proxy. 29 | public required init(parentObject: AnyObject) { 30 | self.collectionView = castOrFatalError(parentObject) 31 | super.init(parentObject: parentObject) 32 | } 33 | } 34 | 35 | #endif 36 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/Proxies/RxPickerViewDelegateProxy.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxPickerViewDelegateProxy.swift 3 | // RxCocoa 4 | // 5 | // Created by Segii Shulga on 5/12/16. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) 10 | 11 | import Foundation 12 | #if !RX_NO_MODULE 13 | import RxSwift 14 | #endif 15 | import UIKit 16 | 17 | public class RxPickerViewDelegateProxy 18 | : DelegateProxy 19 | , DelegateProxyType 20 | , UIPickerViewDelegate { 21 | 22 | /// For more information take a look at `DelegateProxyType`. 23 | public class func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) { 24 | let pickerView: UIPickerView = castOrFatalError(object) 25 | pickerView.delegate = castOptionalOrFatalError(delegate) 26 | } 27 | 28 | /// For more information take a look at `DelegateProxyType`. 29 | public class func currentDelegateFor(_ object: AnyObject) -> AnyObject? { 30 | let pickerView: UIPickerView = castOrFatalError(object) 31 | return pickerView.delegate 32 | } 33 | } 34 | #endif 35 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/Proxies/RxSearchBarDelegateProxy.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxSearchBarDelegateProxy.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 7/4/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | 11 | import Foundation 12 | import UIKit 13 | #if !RX_NO_MODULE 14 | import RxSwift 15 | #endif 16 | 17 | /// For more information take a look at `DelegateProxyType`. 18 | public class RxSearchBarDelegateProxy 19 | : DelegateProxy 20 | , UISearchBarDelegate 21 | , DelegateProxyType { 22 | 23 | /// For more information take a look at `DelegateProxyType`. 24 | public class func currentDelegateFor(_ object: AnyObject) -> AnyObject? { 25 | let searchBar: UISearchBar = castOrFatalError(object) 26 | return searchBar.delegate 27 | } 28 | 29 | /// For more information take a look at `DelegateProxyType`. 30 | public class func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) { 31 | let searchBar: UISearchBar = castOrFatalError(object) 32 | searchBar.delegate = castOptionalOrFatalError(delegate) 33 | } 34 | 35 | // MARK: Delegate proxy methods 36 | 37 | #if os(iOS) 38 | /// For more information take a look at `DelegateProxyType`. 39 | public override class func createProxyForObject(_ object: AnyObject) -> AnyObject { 40 | let searchBar: UISearchBar = castOrFatalError(object) 41 | return searchBar.createRxDelegateProxy() 42 | } 43 | #endif 44 | 45 | } 46 | 47 | #endif 48 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/Proxies/RxSearchControllerDelegateProxy.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxSearchControllerDelegateProxy.swift 3 | // RxCocoa 4 | // 5 | // Created by Segii Shulga on 3/17/16. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) 10 | 11 | import Foundation 12 | #if !RX_NO_MODULE 13 | import RxSwift 14 | #endif 15 | import UIKit 16 | 17 | /// For more information take a look at `DelegateProxyType`. 18 | @available(iOS 8.0, *) 19 | public class RxSearchControllerDelegateProxy 20 | : DelegateProxy 21 | , DelegateProxyType 22 | , UISearchControllerDelegate { 23 | 24 | /// For more information take a look at `DelegateProxyType`. 25 | public class func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) { 26 | let searchController: UISearchController = castOrFatalError(object) 27 | searchController.delegate = castOptionalOrFatalError(delegate) 28 | } 29 | 30 | /// For more information take a look at `DelegateProxyType`. 31 | public class func currentDelegateFor(_ object: AnyObject) -> AnyObject? { 32 | let searchController: UISearchController = castOrFatalError(object) 33 | return searchController.delegate 34 | } 35 | 36 | } 37 | 38 | #endif 39 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTabBarControllerDelegateProxy.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxTabBarControllerDelegateProxy.swift 3 | // RxCocoa 4 | // 5 | // Created by Yusuke Kita on 2016/12/07. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | import Foundation 11 | import UIKit 12 | 13 | #if !RX_NO_MODULE 14 | import RxSwift 15 | #endif 16 | 17 | /// For more information take a look at `DelegateProxyType`. 18 | public class RxTabBarControllerDelegateProxy 19 | : DelegateProxy 20 | , UITabBarControllerDelegate 21 | , DelegateProxyType { 22 | 23 | /// For more information take a look at `DelegateProxyType`. 24 | public class func currentDelegateFor(_ object: AnyObject) -> AnyObject? { 25 | let tabBarController: UITabBarController = castOrFatalError(object) 26 | return tabBarController.delegate 27 | } 28 | 29 | /// For more information take a look at `DelegateProxyType`. 30 | public class func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) { 31 | let tabBarController: UITabBarController = castOrFatalError(object) 32 | tabBarController.delegate = castOptionalOrFatalError(delegate) 33 | } 34 | 35 | /// For more information take a look at `DelegateProxyType`. 36 | public override class func createProxyForObject(_ object: AnyObject) -> AnyObject { 37 | let tabBarController: UITabBarController = castOrFatalError(object) 38 | return tabBarController.createRxDelegateProxy() 39 | } 40 | } 41 | 42 | #endif 43 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTabBarDelegateProxy.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxTabBarDelegateProxy.swift 3 | // RxCocoa 4 | // 5 | // Created by Jesse Farless on 5/14/16. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | import Foundation 11 | import UIKit 12 | 13 | #if !RX_NO_MODULE 14 | import RxSwift 15 | #endif 16 | 17 | /// For more information take a look at `DelegateProxyType`. 18 | public class RxTabBarDelegateProxy 19 | : DelegateProxy 20 | , UITabBarDelegate 21 | , DelegateProxyType { 22 | 23 | /// For more information take a look at `DelegateProxyType`. 24 | public class func currentDelegateFor(_ object: AnyObject) -> AnyObject? { 25 | let tabBar: UITabBar = castOrFatalError(object) 26 | return tabBar.delegate 27 | } 28 | 29 | /// For more information take a look at `DelegateProxyType`. 30 | public class func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) { 31 | let tabBar: UITabBar = castOrFatalError(object) 32 | tabBar.delegate = castOptionalOrFatalError(delegate) 33 | } 34 | 35 | /// For more information take a look at `DelegateProxyType`. 36 | public override class func createProxyForObject(_ object: AnyObject) -> AnyObject { 37 | let tabBar: UITabBar = castOrFatalError(object) 38 | return tabBar.createRxDelegateProxy() 39 | } 40 | 41 | } 42 | 43 | #endif 44 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTableViewDelegateProxy.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxTableViewDelegateProxy.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 6/15/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | 11 | import Foundation 12 | import UIKit 13 | #if !RX_NO_MODULE 14 | import RxSwift 15 | #endif 16 | 17 | /// For more information take a look at `DelegateProxyType`. 18 | public class RxTableViewDelegateProxy 19 | : RxScrollViewDelegateProxy 20 | , UITableViewDelegate { 21 | 22 | 23 | /// Typed parent object. 24 | public weak private(set) var tableView: UITableView? 25 | 26 | /// Initializes `RxTableViewDelegateProxy` 27 | /// 28 | /// - parameter parentObject: Parent object for delegate proxy. 29 | public required init(parentObject: AnyObject) { 30 | self.tableView = castOrFatalError(parentObject) 31 | super.init(parentObject: parentObject) 32 | } 33 | 34 | } 35 | 36 | #endif 37 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/Proxies/RxTextStorageDelegateProxy.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxTextStorageDelegateProxy.swift 3 | // RxCocoa 4 | // 5 | // Created by Segii Shulga on 12/30/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | 11 | import Foundation 12 | #if !RX_NO_MODULE 13 | import RxSwift 14 | #endif 15 | import UIKit 16 | 17 | public class RxTextStorageDelegateProxy 18 | : DelegateProxy 19 | , DelegateProxyType 20 | , NSTextStorageDelegate { 21 | 22 | 23 | /// For more information take a look at `DelegateProxyType`. 24 | public class func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) { 25 | let textStorage: NSTextStorage = castOrFatalError(object) 26 | textStorage.delegate = castOptionalOrFatalError(delegate) 27 | } 28 | 29 | /// For more information take a look at `DelegateProxyType`. 30 | public class func currentDelegateFor(_ object: AnyObject) -> AnyObject? { 31 | let textStorage: NSTextStorage = castOrFatalError(object) 32 | return textStorage.delegate 33 | } 34 | 35 | 36 | } 37 | #endif 38 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/Proxies/RxWebViewDelegateProxy.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxWebViewDelegateProxy.swift 3 | // RxCocoa 4 | // 5 | // Created by Andrew Breckenridge on 9/26/16. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) 10 | import UIKit 11 | 12 | #if !RX_NO_MODULE 13 | import RxSwift 14 | #endif 15 | 16 | public class RxWebViewDelegateProxy 17 | : DelegateProxy 18 | , DelegateProxyType 19 | , UIWebViewDelegate { 20 | 21 | /** 22 | For more information take a look at `DelegateProxyType`. 23 | */ 24 | public class func setCurrentDelegate(_ delegate: AnyObject?, toObject object: AnyObject) { 25 | let webView: UIWebView = castOrFatalError(object) 26 | webView.delegate = castOptionalOrFatalError(delegate) 27 | } 28 | 29 | /** 30 | For more information take a look at `DelegateProxyType`. 31 | */ 32 | public class func currentDelegateFor(_ object: AnyObject) -> AnyObject? { 33 | let webView: UIWebView = castOrFatalError(object) 34 | return webView.delegate 35 | } 36 | 37 | 38 | } 39 | 40 | #endif 41 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UIActivityIndicatorView+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIActivityIndicatorView+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Ivan Persidskiy on 02/12/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | import UIKit 11 | 12 | #if !RX_NO_MODULE 13 | import RxSwift 14 | #endif 15 | 16 | extension Reactive where Base: UIActivityIndicatorView { 17 | 18 | /// Bindable sink for `startAnimating()`, `stopAnimating()` methods. 19 | public var isAnimating: UIBindingObserver { 20 | return UIBindingObserver(UIElement: self.base) { activityIndicator, active in 21 | if active { 22 | activityIndicator.startAnimating() 23 | } else { 24 | activityIndicator.stopAnimating() 25 | } 26 | } 27 | } 28 | 29 | } 30 | 31 | #endif 32 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UIAlertAction+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIAlertAction+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Andrew Breckenridge on 5/7/16. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | 11 | import Foundation 12 | import UIKit 13 | 14 | #if !RX_NO_MODULE 15 | import RxSwift 16 | #endif 17 | 18 | extension Reactive where Base: UIAlertAction { 19 | 20 | /// Bindable sink for `enabled` property. 21 | public var isEnabled: UIBindingObserver { 22 | return UIBindingObserver(UIElement: self.base) { alertAction, value in 23 | alertAction.isEnabled = value 24 | } 25 | } 26 | 27 | } 28 | 29 | #endif 30 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UIApplication+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIApplication+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Mads Bøgeskov on 18/01/16. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | #if os(iOS) 12 | import UIKit 13 | 14 | #if !RX_NO_MODULE 15 | import RxSwift 16 | #endif 17 | 18 | extension Reactive where Base: UIApplication { 19 | 20 | /// Bindable sink for `networkActivityIndicatorVisible`. 21 | public var isNetworkActivityIndicatorVisible: UIBindingObserver { 22 | return UIBindingObserver(UIElement: self.base) { application, active in 23 | application.isNetworkActivityIndicatorVisible = active 24 | } 25 | } 26 | } 27 | #endif 28 | 29 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UIButton+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIButton+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 3/28/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) 10 | 11 | import Foundation 12 | #if !RX_NO_MODULE 13 | import RxSwift 14 | #endif 15 | import UIKit 16 | 17 | extension Reactive where Base: UIButton { 18 | 19 | /** 20 | Reactive wrapper for `TouchUpInside` control event. 21 | */ 22 | public var tap: ControlEvent { 23 | return controlEvent(.touchUpInside) 24 | } 25 | } 26 | 27 | #endif 28 | 29 | #if os(tvOS) 30 | 31 | import Foundation 32 | #if !RX_NO_MODULE 33 | import RxSwift 34 | #endif 35 | import UIKit 36 | 37 | extension Reactive where Base: UIButton { 38 | 39 | /// Reactive wrapper for `PrimaryActionTriggered` control event. 40 | public var primaryAction: ControlEvent { 41 | return controlEvent(.primaryActionTriggered) 42 | } 43 | 44 | } 45 | 46 | #endif 47 | 48 | #if os(iOS) || os(tvOS) 49 | 50 | import Foundation 51 | #if !RX_NO_MODULE 52 | import RxSwift 53 | #endif 54 | import UIKit 55 | 56 | extension Reactive where Base: UIButton { 57 | 58 | /// Reactive wrapper for `setTitle(_:controlState:)` 59 | public func title(for controlState: UIControlState = []) -> UIBindingObserver { 60 | return UIBindingObserver(UIElement: self.base) { (button, title) -> () in 61 | button.setTitle(title, for: controlState) 62 | } 63 | } 64 | 65 | } 66 | #endif 67 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UIDatePicker+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIDatePicker+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Daniel Tartaglia on 5/31/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) 10 | 11 | import Foundation 12 | #if !RX_NO_MODULE 13 | import RxSwift 14 | #endif 15 | import UIKit 16 | 17 | extension Reactive where Base: UIDatePicker { 18 | /// Reactive wrapper for `date` property. 19 | public var date: ControlProperty { 20 | return value 21 | } 22 | 23 | /// Reactive wrapper for `date` property. 24 | public var value: ControlProperty { 25 | return UIControl.rx.value( 26 | self.base, 27 | getter: { datePicker in 28 | datePicker.date 29 | }, setter: { datePicker, value in 30 | datePicker.date = value 31 | } 32 | ) 33 | } 34 | 35 | } 36 | 37 | #endif 38 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UILabel+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UILabel+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 4/1/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | 11 | import Foundation 12 | #if !RX_NO_MODULE 13 | import RxSwift 14 | #endif 15 | import UIKit 16 | 17 | extension Reactive where Base: UILabel { 18 | 19 | /// Bindable sink for `text` property. 20 | public var text: UIBindingObserver { 21 | return UIBindingObserver(UIElement: self.base) { label, text in 22 | label.text = text 23 | } 24 | } 25 | 26 | /// Bindable sink for `attributedText` property. 27 | public var attributedText: UIBindingObserver { 28 | return UIBindingObserver(UIElement: self.base) { label, text in 29 | label.attributedText = text 30 | } 31 | } 32 | 33 | } 34 | 35 | #endif 36 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UINavigationItem+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UINavigationItem+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by kumapo on 2016/05/09. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | 11 | import Foundation 12 | import UIKit 13 | #if !RX_NO_MODULE 14 | import RxSwift 15 | #endif 16 | 17 | extension Reactive where Base: UINavigationItem { 18 | 19 | /// Bindable sink for `title` property. 20 | public var title: UIBindingObserver { 21 | return UIBindingObserver(UIElement: self.base) { navigationItem, text in 22 | navigationItem.title = text 23 | } 24 | } 25 | 26 | } 27 | 28 | #endif 29 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UIPageControl+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIPageControl+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Francesco Puntillo on 14/04/2016. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | 11 | import Foundation 12 | #if !RX_NO_MODULE 13 | import RxSwift 14 | #endif 15 | import UIKit 16 | 17 | extension Reactive where Base: UIPageControl { 18 | 19 | /// Bindable sink for `currentPage` property. 20 | public var currentPage: UIBindingObserver { 21 | return UIBindingObserver(UIElement: self.base) { controller, page in 22 | controller.currentPage = page 23 | } 24 | } 25 | } 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UIPickerView+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIPickerView+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Segii Shulga on 5/12/16. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) 10 | 11 | import Foundation 12 | #if !RX_NO_MODULE 13 | import RxSwift 14 | #endif 15 | import UIKit 16 | 17 | extension Reactive where Base: UIPickerView { 18 | 19 | /// Reactive wrapper for `delegate`. 20 | /// For more information take a look at `DelegateProxyType` protocol documentation. 21 | public var delegate: DelegateProxy { 22 | return RxPickerViewDelegateProxy.proxyForObject(base) 23 | } 24 | 25 | public var itemSelected: ControlEvent<(Int, Int)> { 26 | let source = delegate 27 | .methodInvoked(#selector(UIPickerViewDelegate.pickerView(_:didSelectRow:inComponent:))) 28 | .map { 29 | return (try castOrThrow(Int.self, $0[1]), try castOrThrow(Int.self, $0[2])) 30 | } 31 | return ControlEvent(events: source) 32 | } 33 | } 34 | 35 | #endif 36 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UIProgressView+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIProgressView+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Samuel Bae on 2/27/16. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | 11 | import Foundation 12 | #if !RX_NO_MODULE 13 | import RxSwift 14 | #endif 15 | import UIKit 16 | 17 | extension Reactive where Base: UIProgressView { 18 | 19 | /// Bindable sink for `progress` property 20 | public var progress: UIBindingObserver { 21 | return UIBindingObserver(UIElement: self.base) { progressView, progress in 22 | progressView.progress = progress 23 | } 24 | } 25 | 26 | } 27 | 28 | #endif 29 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UIRefreshControl+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIRefreshControl+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Yosuke Ishikawa on 1/31/16. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) 10 | import UIKit 11 | 12 | #if !RX_NO_MODULE 13 | import RxSwift 14 | #endif 15 | 16 | extension Reactive where Base: UIRefreshControl { 17 | 18 | /// Bindable sink for `beginRefreshing()`, `endRefreshing()` methods. 19 | @available(*, deprecated, renamed: "isRefreshing") 20 | public var refreshing: UIBindingObserver { 21 | return self.isRefreshing 22 | } 23 | 24 | /// Bindable sink for `beginRefreshing()`, `endRefreshing()` methods. 25 | public var isRefreshing: UIBindingObserver { 26 | return UIBindingObserver(UIElement: self.base) { refreshControl, refresh in 27 | if refresh { 28 | refreshControl.beginRefreshing() 29 | } else { 30 | refreshControl.endRefreshing() 31 | } 32 | } 33 | } 34 | 35 | } 36 | 37 | #endif 38 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UISegmentedControl+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UISegmentedControl+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Carlos García on 8/7/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | 11 | import UIKit 12 | #if !RX_NO_MODULE 13 | import RxSwift 14 | #endif 15 | 16 | 17 | extension Reactive where Base: UISegmentedControl { 18 | /// Reactive wrapper for `selectedSegmentIndex` property. 19 | public var selectedSegmentIndex: ControlProperty { 20 | return value 21 | } 22 | 23 | /// Reactive wrapper for `selectedSegmentIndex` property. 24 | public var value: ControlProperty { 25 | return UIControl.rx.value( 26 | self.base, 27 | getter: { segmentedControl in 28 | segmentedControl.selectedSegmentIndex 29 | }, setter: { segmentedControl, value in 30 | segmentedControl.selectedSegmentIndex = value 31 | } 32 | ) 33 | } 34 | 35 | } 36 | 37 | #endif 38 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UISlider+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UISlider+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Alexander van der Werff on 28/05/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) 10 | 11 | import Foundation 12 | #if !RX_NO_MODULE 13 | import RxSwift 14 | #endif 15 | import UIKit 16 | 17 | extension Reactive where Base: UISlider { 18 | 19 | /// Reactive wrapper for `value` property. 20 | public var value: ControlProperty { 21 | return UIControl.rx.value( 22 | self.base, 23 | getter: { slider in 24 | slider.value 25 | }, setter: { slider, value in 26 | slider.value = value 27 | } 28 | ) 29 | } 30 | 31 | } 32 | 33 | #endif 34 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UIStepper+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIStepper+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Yuta ToKoRo on 9/1/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) 10 | 11 | import Foundation 12 | import UIKit 13 | #if !RX_NO_MODULE 14 | import RxSwift 15 | #endif 16 | 17 | extension Reactive where Base: UIStepper { 18 | 19 | /// Reactive wrapper for `value` property. 20 | public var value: ControlProperty { 21 | return UIControl.rx.value( 22 | self.base, 23 | getter: { stepper in 24 | stepper.value 25 | }, setter: { stepper, value in 26 | stepper.value = value 27 | } 28 | ) 29 | } 30 | 31 | } 32 | 33 | #endif 34 | 35 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UISwitch+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UISwitch+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Carlos García on 8/7/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) 10 | 11 | import UIKit 12 | #if !RX_NO_MODULE 13 | import RxSwift 14 | #endif 15 | 16 | 17 | extension Reactive where Base: UISwitch { 18 | 19 | /// Reactive wrapper for `isOn` property. 20 | public var isOn: ControlProperty { 21 | return value 22 | } 23 | 24 | /** 25 | Reactive wrapper for `isOn` property. 26 | 27 | **⚠️ Versions prior to iOS 10.2 were leaking `UIButton`s, so on those versions 28 | underlying observable sequence won't complete when nothing holds a strong reference 29 | to UISwitch.⚠️** 30 | */ 31 | public var value: ControlProperty { 32 | return UIControl.rx.value( 33 | self.base, 34 | getter: { uiSwitch in 35 | uiSwitch.isOn 36 | }, setter: { uiSwitch, value in 37 | uiSwitch.isOn = value 38 | } 39 | ) 40 | } 41 | 42 | } 43 | 44 | #endif 45 | 46 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UITabBarItem+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITabBarItem+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Mateusz Derks on 04/03/16. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | 11 | import Foundation 12 | import UIKit 13 | #if !RX_NO_MODULE 14 | import RxSwift 15 | #endif 16 | 17 | extension Reactive where Base: UITabBarItem { 18 | 19 | /// Bindable sink for `badgeValue` property. 20 | public var badgeValue: UIBindingObserver { 21 | return UIBindingObserver(UIElement: self.base) { tabBarItem, badgeValue in 22 | tabBarItem.badgeValue = badgeValue 23 | } 24 | } 25 | 26 | } 27 | 28 | #endif 29 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UITextField+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UITextField+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 2/21/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | 11 | import Foundation 12 | #if !RX_NO_MODULE 13 | import RxSwift 14 | #endif 15 | import UIKit 16 | 17 | extension Reactive where Base: UITextField { 18 | /// Reactive wrapper for `text` property. 19 | public var text: ControlProperty { 20 | return value 21 | } 22 | 23 | /// Reactive wrapper for `text` property. 24 | public var value: ControlProperty { 25 | return UIControl.rx.value( 26 | base, 27 | getter: { textField in 28 | textField.text 29 | }, setter: { textField, value in 30 | // This check is important because setting text value always clears control state 31 | // including marked text selection which is imporant for proper input 32 | // when IME input method is used. 33 | if textField.text != value { 34 | textField.text = value 35 | } 36 | } 37 | ) 38 | } 39 | 40 | } 41 | 42 | #endif 43 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UIView+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIView+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Krunoslav Zaher on 12/6/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(tvOS) 10 | 11 | import Foundation 12 | import UIKit 13 | #if !RX_NO_MODULE 14 | import RxSwift 15 | #endif 16 | 17 | extension Reactive where Base: UIView { 18 | /// Bindable sink for `hidden` property. 19 | public var isHidden: UIBindingObserver { 20 | return UIBindingObserver(UIElement: self.base) { view, hidden in 21 | view.isHidden = hidden 22 | } 23 | } 24 | 25 | /// Bindable sink for `alpha` property. 26 | public var alpha: UIBindingObserver { 27 | return UIBindingObserver(UIElement: self.base) { view, alpha in 28 | view.alpha = alpha 29 | } 30 | } 31 | } 32 | 33 | #endif 34 | -------------------------------------------------------------------------------- /Pods/RxCocoa/RxCocoa/iOS/UIViewController+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UIViewController+Rx.swift 3 | // RxCocoa 4 | // 5 | // Created by Kyle Fuller on 27/05/2016. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | #if os(iOS) 12 | import UIKit 13 | 14 | #if !RX_NO_MODULE 15 | import RxSwift 16 | #endif 17 | 18 | extension Reactive where Base: UIViewController { 19 | 20 | /// Bindable sink for `title`. 21 | public var title: UIBindingObserver { 22 | return UIBindingObserver(UIElement: self.base) { viewController, title in 23 | viewController.title = title 24 | } 25 | } 26 | 27 | } 28 | #endif 29 | -------------------------------------------------------------------------------- /Pods/RxSwift/LICENSE.md: -------------------------------------------------------------------------------- 1 | **The MIT License** 2 | **Copyright © 2015 Krunoslav Zaher** 3 | **All rights reserved.** 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /Pods/RxSwift/Platform/DataStructures/InfiniteSequence.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InfiniteSequence.swift 3 | // Platform 4 | // 5 | // Created by Krunoslav Zaher on 6/13/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Sequence that repeats `repeatedValue` infinite number of times. 12 | struct InfiniteSequence : Sequence { 13 | typealias Element = E 14 | typealias Iterator = AnyIterator 15 | 16 | private let _repeatedValue: E 17 | 18 | init(repeatedValue: E) { 19 | _repeatedValue = repeatedValue 20 | } 21 | 22 | func makeIterator() -> Iterator { 23 | let repeatedValue = _repeatedValue 24 | return AnyIterator { 25 | return repeatedValue 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Pods/RxSwift/Platform/DispatchQueue+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DispatchQueue+Extensions.swift 3 | // Platform 4 | // 5 | // Created by Krunoslav Zaher on 10/22/16. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Dispatch 11 | 12 | extension DispatchQueue { 13 | private static var token: DispatchSpecificKey<()> = { 14 | let key = DispatchSpecificKey<()>() 15 | DispatchQueue.main.setSpecific(key: key, value: ()) 16 | return key 17 | }() 18 | 19 | static var isMain: Bool { 20 | return DispatchQueue.getSpecific(key: token) != nil 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Pods/RxSwift/Platform/Platform.Darwin.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Platform.Darwin.swift 3 | // Platform 4 | // 5 | // Created by Krunoslav Zaher on 12/29/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS) 10 | 11 | import Darwin 12 | import Foundation 13 | 14 | typealias AtomicInt = Int32 15 | 16 | let AtomicCompareAndSwap = OSAtomicCompareAndSwap32Barrier 17 | let AtomicIncrement = OSAtomicIncrement32Barrier 18 | let AtomicDecrement = OSAtomicDecrement32Barrier 19 | 20 | extension Thread { 21 | 22 | static func setThreadLocalStorageValue(_ value: T?, forKey key: String 23 | ) { 24 | let currentThread = Thread.current 25 | let threadDictionary = currentThread.threadDictionary 26 | 27 | if let newValue = value { 28 | threadDictionary[key] = newValue 29 | } 30 | else { 31 | threadDictionary[key] = nil 32 | } 33 | 34 | } 35 | static func getThreadLocalStorageValueForKey(_ key: String) -> T? { 36 | let currentThread = Thread.current 37 | let threadDictionary = currentThread.threadDictionary 38 | 39 | return threadDictionary[key] as? T 40 | } 41 | } 42 | 43 | extension AtomicInt { 44 | func valueSnapshot() -> Int32 { 45 | return self 46 | } 47 | } 48 | 49 | #endif 50 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Cancelable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Cancelable.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 3/12/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Represents disposable resource with state tracking. 12 | public protocol Cancelable : Disposable { 13 | /// Was resource disposed. 14 | var isDisposed: Bool { get } 15 | } 16 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Concurrency/Lock.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Lock.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 3/31/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | protocol Lock { 12 | func lock() 13 | func unlock() 14 | } 15 | 16 | // https://lists.swift.org/pipermail/swift-dev/Week-of-Mon-20151214/000321.html 17 | typealias SpinLock = NSRecursiveLock 18 | 19 | extension NSRecursiveLock : Lock { 20 | @inline(__always) 21 | func performLocked(_ action: () -> Void) { 22 | lock(); defer { unlock() } 23 | action() 24 | } 25 | 26 | @inline(__always) 27 | func calculateLocked(_ action: () -> T) -> T { 28 | lock(); defer { unlock() } 29 | return action() 30 | } 31 | 32 | @inline(__always) 33 | func calculateLockedOrFail(_ action: () throws -> T) throws -> T { 34 | lock(); defer { unlock() } 35 | let result = try action() 36 | return result 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Concurrency/LockOwnerType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // LockOwnerType.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 10/25/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | protocol LockOwnerType : class, Lock { 12 | var _lock: NSRecursiveLock { get } 13 | } 14 | 15 | extension LockOwnerType { 16 | func lock() { 17 | _lock.lock() 18 | } 19 | 20 | func unlock() { 21 | _lock.unlock() 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Concurrency/SynchronizedDisposeType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SynchronizedDisposeType.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 10/25/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | protocol SynchronizedDisposeType : class, Disposable, Lock { 12 | func _synchronized_dispose() 13 | } 14 | 15 | extension SynchronizedDisposeType { 16 | func synchronizedDispose() { 17 | lock(); defer { unlock() } 18 | _synchronized_dispose() 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Concurrency/SynchronizedOnType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SynchronizedOnType.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 10/25/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | protocol SynchronizedOnType : class, ObserverType, Lock { 12 | func _synchronized_on(_ event: Event) 13 | } 14 | 15 | extension SynchronizedOnType { 16 | func synchronizedOn(_ event: Event) { 17 | lock(); defer { unlock() } 18 | _synchronized_on(event) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Concurrency/SynchronizedSubscribeType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SynchronizedSubscribeType.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 10/25/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | protocol SynchronizedSubscribeType : class, ObservableType, Lock { 12 | func _synchronized_subscribe(_ observer: O) -> Disposable where O.E == E 13 | } 14 | 15 | extension SynchronizedSubscribeType { 16 | func synchronizedSubscribe(_ observer: O) -> Disposable where O.E == E { 17 | lock(); defer { unlock() } 18 | return _synchronized_subscribe(observer) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Concurrency/SynchronizedUnsubscribeType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SynchronizedUnsubscribeType.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 10/25/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | protocol SynchronizedUnsubscribeType : class { 12 | associatedtype DisposeKey 13 | 14 | func synchronizedUnsubscribe(_ disposeKey: DisposeKey) 15 | } 16 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/ConnectableObservableType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConnectableObservableType.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 3/1/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /** 12 | Represents an observable sequence wrapper that can be connected and disconnected from its underlying observable sequence. 13 | */ 14 | public protocol ConnectableObservableType : ObservableType { 15 | /** 16 | Connects the observable wrapper to its source. All subscribed observers will receive values from the underlying observable sequence as long as the connection is established. 17 | 18 | - returns: Disposable used to disconnect the observable wrapper from its source, causing subscribed observer to stop receiving values from the underlying observable sequence. 19 | */ 20 | func connect() -> Disposable 21 | } 22 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Disposable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Disposable.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 2/8/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Respresents a disposable resource. 12 | public protocol Disposable { 13 | /// Dispose resource. 14 | func dispose() 15 | } 16 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Disposables/BooleanDisposable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // BooleanDisposable.swift 3 | // RxSwift 4 | // 5 | // Created by Junior B. on 10/29/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Represents a disposable resource that can be checked for disposal status. 12 | public final class BooleanDisposable : Disposable, Cancelable { 13 | 14 | internal static let BooleanDisposableTrue = BooleanDisposable(isDisposed: true) 15 | private var _isDisposed = false 16 | 17 | /// Initializes a new instance of the `BooleanDisposable` class 18 | public init() { 19 | } 20 | 21 | /// Initializes a new instance of the `BooleanDisposable` class with given value 22 | public init(isDisposed: Bool) { 23 | self._isDisposed = isDisposed 24 | } 25 | 26 | /// - returns: Was resource disposed. 27 | public var isDisposed: Bool { 28 | return _isDisposed 29 | } 30 | 31 | /// Sets the status to disposed, which can be observer through the `isDisposed` property. 32 | public func dispose() { 33 | _isDisposed = true 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Disposables/Disposables.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Disposables.swift 3 | // RxSwift 4 | // 5 | // Created by Mohsen Ramezanpoor on 01/08/2016. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// A collection of utility methods for common disposable operations. 12 | public struct Disposables { 13 | private init() {} 14 | } 15 | 16 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Disposables/DisposeBase.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DisposeBase.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 4/4/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Base class for all disposables. 12 | public class DisposeBase { 13 | init() { 14 | #if TRACE_RESOURCES 15 | let _ = Resources.incrementTotal() 16 | #endif 17 | } 18 | 19 | deinit { 20 | #if TRACE_RESOURCES 21 | let _ = Resources.decrementTotal() 22 | #endif 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Disposables/NopDisposable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // NopDisposable.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 2/15/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Represents a disposable that does nothing on disposal. 12 | /// 13 | /// Nop = No Operation 14 | fileprivate struct NopDisposable : Disposable { 15 | 16 | fileprivate static let noOp: Disposable = NopDisposable() 17 | 18 | fileprivate init() { 19 | 20 | } 21 | 22 | /// Does nothing. 23 | public func dispose() { 24 | } 25 | } 26 | 27 | extension Disposables { 28 | /** 29 | Creates a disposable that does nothing on disposal. 30 | */ 31 | static public func create() -> Disposable { 32 | return NopDisposable.noOp 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Disposables/SubscriptionDisposable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SubscriptionDisposable.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 10/25/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct SubscriptionDisposable : Disposable { 12 | private let _key: T.DisposeKey 13 | private weak var _owner: T? 14 | 15 | init(owner: T, key: T.DisposeKey) { 16 | _owner = owner 17 | _key = key 18 | } 19 | 20 | func dispose() { 21 | _owner?.synchronizedUnsubscribe(_key) 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Extensions/Bag+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Bag+Rx.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 10/19/16. 6 | // Copyright © 2016 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | 12 | // MARK: forEach 13 | 14 | extension Bag where T: ObserverType { 15 | /// Dispatches `event` to app observers contained inside bag. 16 | /// 17 | /// - parameter action: Enumeration closure. 18 | func on(_ event: Event) { 19 | if _onlyFastPath { 20 | _value0?.on(event) 21 | return 22 | } 23 | 24 | let value0 = _value0 25 | let dictionary = _dictionary 26 | 27 | if let value0 = value0 { 28 | value0.on(event) 29 | } 30 | 31 | if let dictionary = dictionary { 32 | for element in dictionary.values { 33 | element.on(event) 34 | } 35 | } 36 | } 37 | } 38 | 39 | /// Dispatches `dispose` to all disposables contained inside bag. 40 | func disposeAll(in bag: Bag) { 41 | if bag._onlyFastPath { 42 | bag._value0?.dispose() 43 | return 44 | } 45 | 46 | let value0 = bag._value0 47 | let dictionary = bag._dictionary 48 | 49 | if let value0 = value0 { 50 | value0.dispose() 51 | } 52 | 53 | if let dictionary = dictionary { 54 | for element in dictionary.values { 55 | element.dispose() 56 | } 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Extensions/String+Rx.swift: -------------------------------------------------------------------------------- 1 | // 2 | // String+Rx.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 12/25/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | extension String { 12 | /// This is needed because on Linux Swift doesn't have `rangeOfString(..., options: .BackwardsSearch)` 13 | func lastIndexOf(_ character: Character) -> Index? { 14 | var index = endIndex 15 | while index > startIndex { 16 | index = self.index(before: index) 17 | if self[index] == character { 18 | return index 19 | } 20 | } 21 | 22 | return nil 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Observable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Observable.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 2/8/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// A type-erased `ObservableType`. 12 | /// 13 | /// It represents a push style sequence. 14 | public class Observable : ObservableType { 15 | /// Type of elements in sequence. 16 | public typealias E = Element 17 | 18 | init() { 19 | #if TRACE_RESOURCES 20 | let _ = Resources.incrementTotal() 21 | #endif 22 | } 23 | 24 | public func subscribe(_ observer: O) -> Disposable where O.E == E { 25 | abstractMethod() 26 | } 27 | 28 | public func asObservable() -> Observable { 29 | return self 30 | } 31 | 32 | deinit { 33 | #if TRACE_RESOURCES 34 | let _ = Resources.decrementTotal() 35 | #endif 36 | } 37 | 38 | // this is kind of ugly I know :( 39 | // Swift compiler reports "Not supported yet" when trying to override protocol extensions, so ¯\_(ツ)_/¯ 40 | 41 | /// Optimizations for map operator 42 | internal func composeMap(_ selector: @escaping (Element) throws -> R) -> Observable { 43 | return Map(source: self, transform: selector) 44 | } 45 | } 46 | 47 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/ObservableConvertibleType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ObservableConvertibleType.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 9/17/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Type that can be converted to observable sequence (`Observer`). 12 | public protocol ObservableConvertibleType { 13 | /// Type of elements in sequence. 14 | associatedtype E 15 | 16 | /// Converts `self` to `Observable` sequence. 17 | /// 18 | /// - returns: Observable sequence that represents `self`. 19 | func asObservable() -> Observable 20 | } 21 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Observables/Implementations/Empty.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Empty.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 8/30/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class Empty : Producer { 12 | override func subscribe(_ observer: O) -> Disposable where O.E == Element { 13 | observer.on(.completed) 14 | return Disposables.create() 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Observables/Implementations/Error.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Error.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 8/30/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class Error : Producer { 12 | private let _error: Swift.Error 13 | 14 | init(error: Swift.Error) { 15 | _error = error 16 | } 17 | 18 | override func subscribe(_ observer: O) -> Disposable where O.E == Element { 19 | observer.on(.error(_error)) 20 | return Disposables.create() 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Observables/Implementations/Never.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Never.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 8/30/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class Never : Producer { 12 | override func subscribe(_ observer: O) -> Disposable where O.E == Element { 13 | return Disposables.create() 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Observables/Implementations/Repeat.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Repeat.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 9/13/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class RepeatElement : Producer { 12 | fileprivate let _element: Element 13 | fileprivate let _scheduler: ImmediateSchedulerType 14 | 15 | init(element: Element, scheduler: ImmediateSchedulerType) { 16 | _element = element 17 | _scheduler = scheduler 18 | } 19 | 20 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { 21 | let sink = RepeatElementSink(parent: self, observer: observer, cancel: cancel) 22 | let subscription = sink.run() 23 | 24 | return (sink: sink, subscription: subscription) 25 | } 26 | } 27 | 28 | class RepeatElementSink : Sink { 29 | typealias Parent = RepeatElement 30 | 31 | private let _parent: Parent 32 | 33 | init(parent: Parent, observer: O, cancel: Cancelable) { 34 | _parent = parent 35 | super.init(observer: observer, cancel: cancel) 36 | } 37 | 38 | func run() -> Disposable { 39 | return _parent._scheduler.scheduleRecursive(_parent._element) { e, recurse in 40 | self.forwardOn(.next(e)) 41 | recurse(e) 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Observables/Implementations/StartWith.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StartWith.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 4/6/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class StartWith: Producer { 12 | let elements: [Element] 13 | let source: Observable 14 | 15 | init(source: Observable, elements: [Element]) { 16 | self.source = source 17 | self.elements = elements 18 | super.init() 19 | } 20 | 21 | override func run(_ observer: O, cancel: Cancelable) -> (sink: Disposable, subscription: Disposable) where O.E == Element { 22 | for e in elements { 23 | observer.on(.next(e)) 24 | } 25 | 26 | return (sink: Disposables.create(), subscription: source.subscribe(observer)) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Observables/Observable+Debug.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Observable+Debug.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 5/2/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | // MARK: debug 12 | 13 | extension ObservableType { 14 | 15 | /** 16 | Prints received events for all observers on standard output. 17 | 18 | - seealso: [do operator on reactivex.io](http://reactivex.io/documentation/operators/do.html) 19 | 20 | - parameter identifier: Identifier that is printed together with event description to standard output. 21 | - parameter trimOutput: Should output be trimmed to max 40 characters. 22 | - returns: An observable sequence whose events are printed to standard output. 23 | */ 24 | public func debug(_ identifier: String? = nil, trimOutput: Bool = false, file: String = #file, line: UInt = #line, function: String = #function) 25 | -> Observable { 26 | return Debug(source: self, identifier: identifier, trimOutput: trimOutput, file: file, line: line, function: function) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/ObserverType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ObserverType.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 2/8/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Supports push-style iteration over an observable sequence. 12 | public protocol ObserverType { 13 | /// The type of elements in sequence that observer can observe. 14 | associatedtype E 15 | 16 | /// Notify observer about sequence event. 17 | /// 18 | /// - parameter event: Event that occured. 19 | func on(_ event: Event) 20 | } 21 | 22 | /// Convenience API extensions to provide alternate next, error, completed events 23 | extension ObserverType { 24 | 25 | /// Convenience method equivalent to `on(.next(element: E))` 26 | /// 27 | /// - parameter element: Next element to send to observer(s) 28 | public final func onNext(_ element: E) { 29 | on(.next(element)) 30 | } 31 | 32 | /// Convenience method equivalent to `on(.completed)` 33 | public final func onCompleted() { 34 | on(.completed) 35 | } 36 | 37 | /// Convenience method equivalent to `on(.error(Swift.Error))` 38 | /// - parameter error: Swift.Error to send to observer(s) 39 | public final func onError(_ error: Swift.Error) { 40 | on(.error(error)) 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Observers/AnonymousObserver.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnonymousObserver.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 2/8/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class AnonymousObserver : ObserverBase { 12 | typealias Element = ElementType 13 | 14 | typealias EventHandler = (Event) -> Void 15 | 16 | private let _eventHandler : EventHandler 17 | 18 | init(_ eventHandler: @escaping EventHandler) { 19 | #if TRACE_RESOURCES 20 | let _ = Resources.incrementTotal() 21 | #endif 22 | _eventHandler = eventHandler 23 | } 24 | 25 | override func onCore(_ event: Event) { 26 | return _eventHandler(event) 27 | } 28 | 29 | #if TRACE_RESOURCES 30 | deinit { 31 | let _ = Resources.decrementTotal() 32 | } 33 | #endif 34 | } 35 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Observers/ObserverBase.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ObserverBase.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 2/15/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | class ObserverBase : Disposable, ObserverType { 12 | typealias E = ElementType 13 | 14 | private var _isStopped: AtomicInt = 0 15 | 16 | func on(_ event: Event) { 17 | switch event { 18 | case .next: 19 | if _isStopped == 0 { 20 | onCore(event) 21 | } 22 | case .error, .completed: 23 | 24 | if !AtomicCompareAndSwap(0, 1, &_isStopped) { 25 | return 26 | } 27 | 28 | onCore(event) 29 | } 30 | } 31 | 32 | func onCore(_ event: Event) { 33 | abstractMethod() 34 | } 35 | 36 | func dispose() { 37 | _ = AtomicCompareAndSwap(0, 1, &_isStopped) 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/RxMutableBox.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RxMutableBox.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 5/22/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Creates mutable reference wrapper for any type. 12 | class RxMutableBox : CustomDebugStringConvertible { 13 | /// Wrapped value 14 | var value : T 15 | 16 | /// Creates reference wrapper for `value`. 17 | /// 18 | /// - parameter value: Value to wrap. 19 | init (_ value: T) { 20 | self.value = value 21 | } 22 | } 23 | 24 | extension RxMutableBox { 25 | /// - returns: Box description. 26 | var debugDescription: String { 27 | return "MutatingBox(\(self.value))" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Schedulers/HistoricalScheduler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HistoricalScheduler.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 12/27/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Provides a virtual time scheduler that uses `Date` for absolute time and `NSTimeInterval` for relative time. 12 | public class HistoricalScheduler : VirtualTimeScheduler { 13 | 14 | /** 15 | Creates a new historical scheduler with initial clock value. 16 | 17 | - parameter initialClock: Initial value for virtual clock. 18 | */ 19 | public init(initialClock: RxTime = Date(timeIntervalSince1970: 0)) { 20 | super.init(initialClock: initialClock, converter: HistoricalSchedulerTimeConverter()) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Schedulers/ImmediateScheduler.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ImmediateScheduler.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 10/17/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Represents an object that schedules units of work to run immediately on the current thread. 12 | private class ImmediateScheduler : ImmediateSchedulerType { 13 | 14 | private let _asyncLock = AsyncLock() 15 | 16 | /** 17 | Schedules an action to be executed immediatelly. 18 | 19 | In case `schedule` is called recursively from inside of `action` callback, scheduled `action` will be enqueued 20 | and executed after current `action`. (`AsyncLock` behavior) 21 | 22 | - parameter state: State passed to the action to be executed. 23 | - parameter action: Action to be executed. 24 | - returns: The disposable object used to cancel the scheduled action (best effort). 25 | */ 26 | func schedule(_ state: StateType, action: @escaping (StateType) -> Disposable) -> Disposable { 27 | let disposable = SingleAssignmentDisposable() 28 | _asyncLock.invoke(AnonymousInvocable { 29 | if disposable.isDisposed { 30 | return 31 | } 32 | disposable.setDisposable(action(state)) 33 | }) 34 | 35 | return disposable 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Schedulers/Internal/AnonymousInvocable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AnonymousInvocable.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 11/7/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct AnonymousInvocable : InvocableType { 12 | private let _action: () -> () 13 | 14 | init(_ action: @escaping () -> ()) { 15 | _action = action 16 | } 17 | 18 | func invoke() { 19 | _action() 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Schedulers/Internal/InvocableScheduledItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InvocableScheduledItem.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 11/7/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct InvocableScheduledItem : InvocableType { 12 | 13 | let _invocable: I 14 | let _state: I.Value 15 | 16 | init(invocable: I, state: I.Value) { 17 | _invocable = invocable 18 | _state = state 19 | } 20 | 21 | func invoke() { 22 | _invocable.invoke(_state) 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Schedulers/Internal/InvocableType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InvocableType.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 11/7/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | protocol InvocableType { 12 | func invoke() 13 | } 14 | 15 | protocol InvocableWithValueType { 16 | associatedtype Value 17 | 18 | func invoke(_ value: Value) 19 | } 20 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Schedulers/Internal/ScheduledItem.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ScheduledItem.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 9/2/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | struct ScheduledItem 12 | : ScheduledItemType 13 | , InvocableType { 14 | typealias Action = (T) -> Disposable 15 | 16 | private let _action: Action 17 | private let _state: T 18 | 19 | private let _disposable = SingleAssignmentDisposable() 20 | 21 | var isDisposed: Bool { 22 | return _disposable.isDisposed 23 | } 24 | 25 | init(action: @escaping Action, state: T) { 26 | _action = action 27 | _state = state 28 | } 29 | 30 | func invoke() { 31 | _disposable.setDisposable(_action(_state)) 32 | } 33 | 34 | func dispose() { 35 | _disposable.dispose() 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Schedulers/Internal/ScheduledItemType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ScheduledItemType.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 11/7/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | protocol ScheduledItemType 12 | : Cancelable 13 | , InvocableType { 14 | func invoke() 15 | } 16 | -------------------------------------------------------------------------------- /Pods/RxSwift/RxSwift/Subjects/SubjectType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SubjectType.swift 3 | // RxSwift 4 | // 5 | // Created by Krunoslav Zaher on 3/1/15. 6 | // Copyright © 2015 Krunoslav Zaher. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | /// Represents an object that is both an observable sequence as well as an observer. 12 | public protocol SubjectType : ObservableType { 13 | /// The type of the observer that represents this subject. 14 | /// 15 | /// Usually this type is type of subject itself, but it doesn't have to be. 16 | associatedtype SubjectObserverType : ObserverType 17 | 18 | /// Returns observer interface for subject. 19 | /// 20 | /// - returns: Observer interface for subject. 21 | func asObserver() -> SubjectObserverType 22 | 23 | } 24 | -------------------------------------------------------------------------------- /Pods/Swinject/LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Swinject Contributors 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 all 13 | 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 THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Pods/Swinject/Sources/Assembly.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Assembly.swift 3 | // Swinject 4 | // 5 | // Created by mike.owens on 12/9/15. 6 | // Copyright © 2015 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | /// The `Assembly` provides a means to organize your `Service` registration in logic groups which allows 10 | /// the user to swap out different implementations of `Services` by providing different `Assembly` instances 11 | /// to the `Assembler` 12 | public protocol Assembly { 13 | 14 | /// Provide hook for `Assembler` to load Services into the provided container 15 | /// 16 | /// - parameter container: the container provided by the `Assembler` 17 | /// 18 | func assemble(container: Container) 19 | 20 | /// Provides a hook to the `Assembly` that will be called once the `Assembler` has loaded all `Assembly` 21 | /// instances into the container. 22 | /// 23 | /// - parameter resolver: the resolver that can resolve instances from the built container 24 | /// 25 | func loaded(resolver: Resolver) 26 | } 27 | 28 | public extension Assembly { 29 | func loaded(resolver: Resolver) { 30 | // no-op 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Pods/Swinject/Sources/Container.Logging.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Container.Logging.swift 3 | // Swinject 4 | // 5 | // Created by Jakub Vaňo on 30/09/16. 6 | // Copyright © 2016 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | public typealias LoggingFunctionType = (String) -> Void 10 | 11 | public extension Container { 12 | /// Function to be used for logging debugging data. 13 | /// Default implementation writes to standard output. 14 | public static var loggingFunction: LoggingFunctionType? { 15 | get { return _loggingFunction } 16 | set { _loggingFunction = newValue } 17 | } 18 | 19 | internal static func log(_ message: String) { 20 | _loggingFunction?(message) 21 | } 22 | } 23 | 24 | private var _loggingFunction: LoggingFunctionType? = { print($0) } 25 | -------------------------------------------------------------------------------- /Pods/Swinject/Sources/FunctionType.swift: -------------------------------------------------------------------------------- 1 | // 2 | // FunctionType.swift 3 | // Swinject 4 | // 5 | // Created by Yoichi Tagaya on 11/28/15. 6 | // Copyright © 2015 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | // Type alias to expect a closure. 10 | internal typealias FunctionType = Any 11 | -------------------------------------------------------------------------------- /Pods/Swinject/Sources/InstanceStorage.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InstanceStorage.swift 3 | // Swinject 4 | // 5 | // Created by Jakub Vaňo on 11/11/16. 6 | // Copyright © 2016 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | /// Storage provided by `ObjectScope`. It is used by `Container` to persist resolved instances. 10 | public protocol InstanceStorage: AnyObject { 11 | var instance: Any? { get set } 12 | } 13 | 14 | /// Persists stored instance until it is explicitly discarded. 15 | public final class PermanentStorage: InstanceStorage { 16 | public var instance: Any? 17 | 18 | public init() {} 19 | } 20 | 21 | /// Does not persist stored instance. 22 | public final class TransientStorage: InstanceStorage { 23 | public var instance: Any? { 24 | get { return nil } 25 | set {} 26 | } 27 | 28 | public init() {} 29 | } 30 | 31 | /// Does not persist value types. 32 | /// Persists reference types as long as there are strong references to given instance. 33 | public final class WeakStorage: InstanceStorage { 34 | private weak var object: AnyObject? 35 | 36 | #if os(Linux) 37 | public var instance: Any? { 38 | get { return object } 39 | set { object = newValue.flatMap { $0 as? AnyObject } } 40 | } 41 | #else 42 | public var instance: Any? { 43 | get { return object } 44 | set { object = newValue as AnyObject? } 45 | } 46 | #endif 47 | 48 | public init () {} 49 | } 50 | -------------------------------------------------------------------------------- /Pods/Swinject/Sources/ObjectScope.Standard.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ObjectScope.Standard.swift 3 | // Swinject 4 | // 5 | // Created by Jakub Vaňo on 11/11/16. 6 | // Copyright © 2016 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | extension ObjectScope { 10 | /// A new instance is always created by the `Container` when a type is resolved. 11 | /// The instance is not shared. 12 | public static let transient = ObjectScope(storageFactory: TransientStorage.init, description: "transient") 13 | 14 | /// Instances are shared only when an object graph is being created, 15 | /// otherwise a new instance is created by the `Container`. This is the default scope. 16 | public static let graph = ObjectScope(storageFactory: PermanentStorage.init, description: "graph") 17 | 18 | /// An instance provided by the `Container` is shared within the `Container` and its child `Containers`. 19 | public static let container = ObjectScope(storageFactory: PermanentStorage.init, description: "container") 20 | 21 | /// An instance provided by the `Container` is shared within the `Container` and its child `Container`s 22 | /// as long as there are strong references to given instance. Otherwise new instance is created 23 | /// when resolving the type. 24 | public static let weak = ObjectScope(storageFactory: WeakStorage.init, description: "weak") 25 | } 26 | -------------------------------------------------------------------------------- /Pods/Swinject/Sources/SpinLock.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SpinLock.swift 3 | // Swinject 4 | // 5 | // Created by Yoichi Tagaya on 11/26/15. 6 | // Copyright © 2015 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | internal final class SpinLock { 12 | private let lock = NSLock() 13 | 14 | func sync(action: () -> T) -> T { 15 | lock.lock() 16 | defer { lock.unlock() } 17 | return action() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Pods/Swinject/Sources/Swinject.h: -------------------------------------------------------------------------------- 1 | // 2 | // Swinject.h 3 | // Swinject 4 | // 5 | // Created by Yoichi Tagaya on 7/22/15. 6 | // Copyright © 2015 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for Swinject. 12 | FOUNDATION_EXPORT double SwinjectVersionNumber; 13 | 14 | //! Project version string for Swinject. 15 | FOUNDATION_EXPORT const unsigned char SwinjectVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | -------------------------------------------------------------------------------- /Pods/Swinject/Sources/SynchronizedResolver.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SynchronizedResolver.swift 3 | // Swinject 4 | // 5 | // Created by Yoichi Tagaya on 11/23/15. 6 | // Copyright © 2015 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | internal final class SynchronizedResolver { 10 | internal let container: Container 11 | 12 | internal init(container: Container) { 13 | self.container = container 14 | } 15 | } 16 | 17 | extension SynchronizedResolver: _Resolver { 18 | internal func _resolve(name: String?, option: ServiceKeyOption?, invoker: (Factory) -> Service) -> Service? { 19 | return container.lock.sync { 20 | return self.container._resolve(name: name, option: option, invoker: invoker) 21 | } 22 | } 23 | } 24 | 25 | extension SynchronizedResolver: Resolver { 26 | internal func resolve(_ serviceType: Service.Type) -> Service? { 27 | return container.lock.sync { 28 | return self.container.resolve(serviceType) 29 | } 30 | } 31 | 32 | internal func resolve(_ serviceType: Service.Type, name: String?) -> Service? { 33 | return container.lock.sync { 34 | return self.container.resolve(serviceType, name: name) 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Pods/Swinject/Sources/UnavailableItems.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UnavailableItems.swift 3 | // Swinject 4 | // 5 | // Created by Yoichi Tagaya on 11/30/16. 6 | // Copyright © 2016 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | // MARK: For auto migration from Swinject v1 to v2. 10 | extension ObjectScope { 11 | @available(*, unavailable, renamed: "transient") 12 | public static let none = transient 13 | 14 | @available(*, unavailable, renamed: "container") 15 | public static let hierarchy = container 16 | } 17 | 18 | @available(*, unavailable, renamed: "Resolver") 19 | public protocol ResolverType { } 20 | 21 | @available(*, unavailable, renamed: "Assembly") 22 | public protocol AssemblyType { } 23 | 24 | @available(*, unavailable, renamed: "ServiceKeyOption") 25 | public protocol ServiceKeyOptionType { } 26 | -------------------------------------------------------------------------------- /Pods/Swinject/Sources/_Resolver.swift: -------------------------------------------------------------------------------- 1 | // 2 | // _Resolver.swift 3 | // Swinject 4 | // 5 | // Created by Yoichi Tagaya on 5/4/16. 6 | // Copyright © 2016 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | /// This protocol is designed for the use to extend Swinject functionality. 10 | /// Do NOT use this protocol unless you intend to write an extension or plugin to Swinject framework. 11 | /// 12 | /// A type conforming Resolver protocol must conform _Resolver protocol too. 13 | public protocol _Resolver { 14 | /// This method is designed for the use to extend Swinject functionality. 15 | /// Do NOT use this method unless you intend to write an extension or plugin to Swinject framework. 16 | /// 17 | /// - Parameter name: The registration name. 18 | /// - Parameter option: A service key option for an extension/plugin. 19 | /// - Parameter invoker: A closure to execute service resolution. 20 | /// 21 | /// - Returns: The resolved service type instance, or nil if no service is found. 22 | func _resolve(name: String?, option: ServiceKeyOption?, invoker: (Factory) -> Service) -> Service? 23 | } 24 | -------------------------------------------------------------------------------- /Pods/SwinjectStoryboard/LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Swinject Contributors 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 all 13 | 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 THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Pods/SwinjectStoryboard/Sources/Box.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Box.swift 3 | // Swinject 4 | // 5 | // Created by Yoichi Tagaya on 11/27/15. 6 | // Copyright © 2015 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | internal final class Box { 12 | internal let value: T 13 | 14 | internal init(_ value: T) { 15 | self.value = value 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Pods/SwinjectStoryboard/Sources/InjectionVerifiable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // InjectionVerifiable.swift 3 | // Swinject 4 | // 5 | // Created by Jakub Vaňo on 28/10/16. 6 | // Copyright © 2016 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | internal protocol InjectionVerifiable: AnyObject { 10 | var wasInjected: Bool { get set } 11 | } 12 | -------------------------------------------------------------------------------- /Pods/SwinjectStoryboard/Sources/RegistrationNameAssociatable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // RegistrationNameAssociatable.swift 3 | // Swinject 4 | // 5 | // Created by Yoichi Tagaya on 8/1/15. 6 | // Copyright © 2015 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | internal protocol RegistrationNameAssociatable: AnyObject { 10 | var swinjectRegistrationName: String? { get set } 11 | } 12 | -------------------------------------------------------------------------------- /Pods/SwinjectStoryboard/Sources/SwinjectStoryboard+StoryboardReference.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwinjectStoryboard+StoryboardReference. 3 | // SwinjectStoryboard 4 | // 5 | // Created by Jakub Vaňo on 01/09/16. 6 | // Copyright © 2016 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | internal extension SwinjectStoryboard { 10 | 11 | static func pushInstantiatingStoryboard(_ storyboard: SwinjectStoryboard) { 12 | storyboardStack.append(storyboard) 13 | } 14 | 15 | @discardableResult 16 | static func popInstantiatingStoryboard() -> SwinjectStoryboard? { 17 | return storyboardStack.popLast() 18 | } 19 | 20 | static var isCreatingStoryboardReference: Bool { 21 | return referencingStoryboard != nil 22 | } 23 | 24 | static var referencingStoryboard: SwinjectStoryboard? { 25 | return storyboardStack.last 26 | } 27 | 28 | static func createReferenced(name: String, bundle storyboardBundleOrNil: Bundle?) -> SwinjectStoryboard { 29 | if let container = referencingStoryboard?.container.value { 30 | return create(name: name, bundle: storyboardBundleOrNil, container: container) 31 | } else { 32 | return create(name: name, bundle: storyboardBundleOrNil) 33 | } 34 | } 35 | } 36 | 37 | private var storyboardStack = [SwinjectStoryboard]() 38 | -------------------------------------------------------------------------------- /Pods/SwinjectStoryboard/Sources/SwinjectStoryboard.h: -------------------------------------------------------------------------------- 1 | // 2 | // SwinjectStoryboard.h 3 | // SwinjectStoryboard 4 | // 5 | // Created by Yoichi Tagaya on 5/5/16. 6 | // Copyright © 2016 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for SwinjectStoryboard. 12 | FOUNDATION_EXPORT double SwinjectStoryboardVersionNumber; 13 | 14 | //! Project version string for SwinjectStoryboard. 15 | FOUNDATION_EXPORT const unsigned char SwinjectStoryboardVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | // TARGET_OS_MAC includes iOS, watchOS and tvOS, so TARGET_OS_MAC must be evaluated after them. 21 | #if TARGET_OS_IOS || TARGET_OS_TV || (!TARGET_OS_WATCH && TARGET_OS_MAC) 22 | 23 | #import 24 | 25 | #endif 26 | -------------------------------------------------------------------------------- /Pods/SwinjectStoryboard/Sources/SwinjectStoryboardOption.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwinjectStoryboardOption.swift 3 | // Swinject 4 | // 5 | // Created by Yoichi Tagaya on 2/28/16. 6 | // Copyright © 2016 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | import Swinject 10 | 11 | #if os(iOS) || os(OSX) || os(tvOS) 12 | internal struct SwinjectStoryboardOption: ServiceKeyOption { 13 | internal let controllerType: String 14 | 15 | internal init(controllerType: Container.Controller.Type) { 16 | self.controllerType = String(reflecting: controllerType) 17 | } 18 | 19 | internal func isEqualTo(_ another: ServiceKeyOption) -> Bool { 20 | guard let another = another as? SwinjectStoryboardOption else { 21 | return false 22 | } 23 | 24 | return self.controllerType == another.controllerType 25 | } 26 | 27 | internal var hashValue: Int { 28 | return controllerType.hashValue 29 | } 30 | 31 | internal var description: String { 32 | return "Storyboard: \(controllerType)" 33 | } 34 | } 35 | #endif 36 | -------------------------------------------------------------------------------- /Pods/SwinjectStoryboard/Sources/SwinjectStoryboardProtocol.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SwinjectStoryboardProtocol.swift 3 | // Swinject 4 | // 5 | // Created by Yoichi Tagaya on 10/12/15. 6 | // Copyright © 2015 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | #if os(iOS) || os(OSX) || os(tvOS) 10 | 11 | // Objective-C optional protocol method is used instead of protocol extension to workaround the issue that 12 | // default implementation of a protocol method is always called if a class method conforming the protocol 13 | // is defined as an extention in a different framework. 14 | @objc 15 | public protocol SwinjectStoryboardProtocol { 16 | /// Called by Swinject framework once before SwinjectStoryboard is instantiated. 17 | /// 18 | /// - Note: 19 | /// Implement this method and setup the default container if you implicitly instantiate UIWindow 20 | /// and its root view controller from "Main" storyboard. 21 | /// 22 | /// ```swift 23 | /// extension SwinjectStoryboard { 24 | /// class func setup() { 25 | /// let container = defaultContainer 26 | /// container.register(SomeType.self) { 27 | /// _ in 28 | /// SomeClass() 29 | /// } 30 | /// container.storyboardInitCompleted(ViewController.self) { 31 | /// r, c in 32 | /// c.something = r.resolve(SomeType.self) 33 | /// } 34 | /// } 35 | /// } 36 | /// ``` 37 | @objc optional static func setup() 38 | } 39 | 40 | #endif 41 | -------------------------------------------------------------------------------- /Pods/SwinjectStoryboard/Sources/UnavailableItems.swift: -------------------------------------------------------------------------------- 1 | // 2 | // UnavailableItems.swift 3 | // SwinjectStoryboard 4 | // 5 | // Created by Yoichi Tagaya on 12/10/16. 6 | // Copyright © 2016 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | // MARK: For auto migration to Swinject v1. 10 | @available(*, unavailable, renamed: "SwinjectStoryboardProtocol") 11 | public protocol SwinjectStoryboardType { } 12 | -------------------------------------------------------------------------------- /Pods/SwinjectStoryboard/Sources/iOS-tvOS/_SwinjectStoryboardBase.h: -------------------------------------------------------------------------------- 1 | // 2 | // _SwinjectStoryboardBase.h 3 | // Swinject 4 | // 5 | // Created by Yoichi Tagaya on 8/2/15. 6 | // Copyright © 2015 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | /// The base class of `SwinjectStoryboard`, which should not be used directly in your app. 12 | @interface _SwinjectStoryboardBase : UIStoryboard 13 | 14 | /// The factory method, which should not be used directly in your app. 15 | + (nonnull instancetype)_create:(nonnull NSString *)name bundle:(nullable NSBundle *)storyboardBundleOrNil; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Pods/SwinjectStoryboard/Sources/iOS-tvOS/_SwinjectStoryboardBase.m: -------------------------------------------------------------------------------- 1 | // 2 | // _SwinjectStoryboardBase.m 3 | // Swinject 4 | // 5 | // Created by Yoichi Tagaya on 8/2/15. 6 | // Copyright © 2015 Swinject Contributors. All rights reserved. 7 | // 8 | 9 | #import "_SwinjectStoryboardBase.h" 10 | 11 | @implementation _SwinjectStoryboardBase 12 | 13 | + (nonnull instancetype)_create:(nonnull NSString *)name bundle:(nullable NSBundle *)storyboardBundleOrNil { 14 | return (id)[self storyboardWithName:name bundle:storyboardBundleOrNil]; 15 | } 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Alamofire/Alamofire-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Alamofire : NSObject 3 | @end 4 | @implementation PodsDummy_Alamofire 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Alamofire/Alamofire-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Alamofire/Alamofire-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | 6 | FOUNDATION_EXPORT double AlamofireVersionNumber; 7 | FOUNDATION_EXPORT const unsigned char AlamofireVersionString[]; 8 | 9 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Alamofire/Alamofire.modulemap: -------------------------------------------------------------------------------- 1 | framework module Alamofire { 2 | umbrella header "Alamofire-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Alamofire/Alamofire.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Alamofire 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 4 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Alamofire/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 | 4.3.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/AlamofireImage/AlamofireImage-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_AlamofireImage : NSObject 3 | @end 4 | @implementation PodsDummy_AlamofireImage 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/AlamofireImage/AlamofireImage-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /Pods/Target Support Files/AlamofireImage/AlamofireImage-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | 6 | FOUNDATION_EXPORT double AlamofireImageVersionNumber; 7 | FOUNDATION_EXPORT const unsigned char AlamofireImageVersionString[]; 8 | 9 | -------------------------------------------------------------------------------- /Pods/Target Support Files/AlamofireImage/AlamofireImage.modulemap: -------------------------------------------------------------------------------- 1 | framework module AlamofireImage { 2 | umbrella header "AlamofireImage-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/AlamofireImage/AlamofireImage.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/AlamofireImage 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Alamofire" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 5 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 6 | PODS_BUILD_DIR = $BUILD_DIR 7 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT} 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | -------------------------------------------------------------------------------- /Pods/Target Support Files/AlamofireImage/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 | 3.2.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Decodable/Decodable-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Decodable : NSObject 3 | @end 4 | @implementation PodsDummy_Decodable 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Decodable/Decodable-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Decodable/Decodable-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | #import "Decodable.h" 6 | 7 | FOUNDATION_EXPORT double DecodableVersionNumber; 8 | FOUNDATION_EXPORT const unsigned char DecodableVersionString[]; 9 | 10 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Decodable/Decodable.modulemap: -------------------------------------------------------------------------------- 1 | framework module Decodable { 2 | umbrella header "Decodable-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Decodable/Decodable.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Decodable 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 4 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Decodable/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 | 0.5.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-HyperRecipe/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.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-HyperRecipe/Pods-HyperRecipe-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_HyperRecipe : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_HyperRecipe 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-HyperRecipe/Pods-HyperRecipe-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | 6 | FOUNDATION_EXPORT double Pods_HyperRecipeVersionNumber; 7 | FOUNDATION_EXPORT const unsigned char Pods_HyperRecipeVersionString[]; 8 | 9 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Pods-HyperRecipe/Pods-HyperRecipe.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_HyperRecipe { 2 | umbrella header "Pods-HyperRecipe-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/RxCocoa/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 | 3.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/RxCocoa/RxCocoa-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_RxCocoa : NSObject 3 | @end 4 | @implementation PodsDummy_RxCocoa 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/RxCocoa/RxCocoa-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /Pods/Target Support Files/RxCocoa/RxCocoa-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | #import "RxCocoa.h" 6 | #import "RxCocoaRuntime.h" 7 | #import "_RX.h" 8 | #import "_RXDelegateProxy.h" 9 | #import "_RXKVOObserver.h" 10 | #import "_RXObjCRuntime.h" 11 | 12 | FOUNDATION_EXPORT double RxCocoaVersionNumber; 13 | FOUNDATION_EXPORT const unsigned char RxCocoaVersionString[]; 14 | 15 | -------------------------------------------------------------------------------- /Pods/Target Support Files/RxCocoa/RxCocoa.modulemap: -------------------------------------------------------------------------------- 1 | framework module RxCocoa { 2 | umbrella header "RxCocoa-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/RxCocoa/RxCocoa.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/RxCocoa 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/RxSwift" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 5 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 6 | PODS_BUILD_DIR = $BUILD_DIR 7 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT} 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | -------------------------------------------------------------------------------- /Pods/Target Support Files/RxSwift/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 | 3.1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/RxSwift/RxSwift-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_RxSwift : NSObject 3 | @end 4 | @implementation PodsDummy_RxSwift 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/RxSwift/RxSwift-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /Pods/Target Support Files/RxSwift/RxSwift-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | 6 | FOUNDATION_EXPORT double RxSwiftVersionNumber; 7 | FOUNDATION_EXPORT const unsigned char RxSwiftVersionString[]; 8 | 9 | -------------------------------------------------------------------------------- /Pods/Target Support Files/RxSwift/RxSwift.modulemap: -------------------------------------------------------------------------------- 1 | framework module RxSwift { 2 | umbrella header "RxSwift-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/RxSwift/RxSwift.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/RxSwift 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 4 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Swinject/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 | 2.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Swinject/Swinject-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Swinject : NSObject 3 | @end 4 | @implementation PodsDummy_Swinject 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Swinject/Swinject-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Swinject/Swinject-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | #import "Swinject.h" 6 | 7 | FOUNDATION_EXPORT double SwinjectVersionNumber; 8 | FOUNDATION_EXPORT const unsigned char SwinjectVersionString[]; 9 | 10 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Swinject/Swinject.modulemap: -------------------------------------------------------------------------------- 1 | framework module Swinject { 2 | umbrella header "Swinject-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/Swinject/Swinject.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Swinject 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 4 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /Pods/Target Support Files/SwinjectStoryboard/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.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/SwinjectStoryboard/SwinjectStoryboard-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_SwinjectStoryboard : NSObject 3 | @end 4 | @implementation PodsDummy_SwinjectStoryboard 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/SwinjectStoryboard/SwinjectStoryboard-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /Pods/Target Support Files/SwinjectStoryboard/SwinjectStoryboard-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | #import "_SwinjectStoryboardBase.h" 6 | #import "SwinjectStoryboard.h" 7 | 8 | FOUNDATION_EXPORT double SwinjectStoryboardVersionNumber; 9 | FOUNDATION_EXPORT const unsigned char SwinjectStoryboardVersionString[]; 10 | 11 | -------------------------------------------------------------------------------- /Pods/Target Support Files/SwinjectStoryboard/SwinjectStoryboard.modulemap: -------------------------------------------------------------------------------- 1 | framework module SwinjectStoryboard { 2 | umbrella header "SwinjectStoryboard-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/SwinjectStoryboard/SwinjectStoryboard.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/SwinjectStoryboard 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Swinject" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 5 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 6 | PODS_BUILD_DIR = $BUILD_DIR 7 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 8 | PODS_ROOT = ${SRCROOT} 9 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 10 | SKIP_INSTALL = YES 11 | -------------------------------------------------------------------------------- /Pods/Target Support Files/expanding-collection/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.4 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Pods/Target Support Files/expanding-collection/expanding-collection-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_expanding_collection : NSObject 3 | @end 4 | @implementation PodsDummy_expanding_collection 5 | @end 6 | -------------------------------------------------------------------------------- /Pods/Target Support Files/expanding-collection/expanding-collection-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | -------------------------------------------------------------------------------- /Pods/Target Support Files/expanding-collection/expanding-collection-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | 6 | FOUNDATION_EXPORT double expanding_collectionVersionNumber; 7 | FOUNDATION_EXPORT const unsigned char expanding_collectionVersionString[]; 8 | 9 | -------------------------------------------------------------------------------- /Pods/Target Support Files/expanding-collection/expanding-collection.modulemap: -------------------------------------------------------------------------------- 1 | framework module expanding_collection { 2 | umbrella header "expanding-collection-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Pods/Target Support Files/expanding-collection/expanding-collection.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/expanding-collection 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" 4 | OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" 5 | PODS_BUILD_DIR = $BUILD_DIR 6 | PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_ROOT = ${SRCROOT} 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /Pods/expanding-collection/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Ramotion 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 all 13 | 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 THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Pods/expanding-collection/Source/Helpers/Animations/CornerAnimatable/CornerAnimatable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CornerAnimatable.swift 3 | // TestCollectionView 4 | // 5 | // Created by Alex K. on 20/05/16. 6 | // Copyright © 2016 Alex K. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | 12 | protocol CornerAnimatable { 13 | func animationCornerRadius(_ radius: CGFloat, duration: Double) 14 | } 15 | 16 | extension CornerAnimatable where Self: UIView { 17 | 18 | func animationCornerRadius(_ radius: CGFloat, duration: Double) { 19 | let animation = Init(CABasicAnimation(keyPath: "cornerRadius")) { 20 | $0.duration = duration 21 | $0.toValue = radius 22 | $0.fillMode = kCAFillModeForwards 23 | $0.isRemovedOnCompletion = false; 24 | } 25 | 26 | layer.add(animation, forKey: nil) 27 | } 28 | } 29 | 30 | extension UIView: CornerAnimatable {} 31 | -------------------------------------------------------------------------------- /Pods/expanding-collection/Source/Helpers/ConfigurationHelper/ConfigurationHelper.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ConfigurationHelper.swift 3 | // TestCollectionView 4 | // 5 | // Created by Alex K. on 05/05/16. 6 | // Copyright © 2016 Alex K. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | 12 | internal func Init(_ value : Type, block: (_ object: Type) -> Void) -> Type 13 | { 14 | block(value) 15 | return value 16 | } 17 | -------------------------------------------------------------------------------- /Pods/expanding-collection/Source/Helpers/ScreenShot/ScreenShotHelper.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ScreenShotHelper.swift 3 | // TestCollectionView 4 | // 5 | // Created by Alex K. on 11/05/16. 6 | // Copyright © 2016 Alex K. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | extension UIView { 12 | func takeSnapshot(_ frame: CGRect) -> UIImage? { 13 | UIGraphicsBeginImageContextWithOptions(frame.size, false, 0.0) 14 | 15 | let context = UIGraphicsGetCurrentContext(); 16 | context?.translateBy(x: frame.origin.x * -1, y: frame.origin.y * -1) 17 | 18 | guard let currentContext = UIGraphicsGetCurrentContext() else { 19 | return nil 20 | } 21 | 22 | self.layer.render(in: currentContext) 23 | let image = UIGraphicsGetImageFromCurrentImageContext() 24 | UIGraphicsEndImageContext() 25 | 26 | return image 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Pods/expanding-collection/Source/Helpers/SubviewsForEach/SubviewsForEach.swift: -------------------------------------------------------------------------------- 1 | // 2 | // SubviewsForEach.swift 3 | // DemoExpandingCollection 4 | // 5 | // Created by Alex K. on 26/05/16. 6 | // Copyright © 2016 Alex K. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | protocol SubviewsForEach { 12 | func subviewsForEach(_ f: (UIView) -> Void) 13 | } 14 | 15 | extension SubviewsForEach where Self: UIView { 16 | 17 | func subviewsForEach(_ f: (UIView) -> Void) { 18 | forEachView(self, f: f) 19 | } 20 | 21 | fileprivate func forEachView(_ view: UIView, f: (UIView) -> Void) { 22 | view.subviews.forEach { 23 | f($0) 24 | 25 | if $0.subviews.count > 0 { 26 | forEachView($0, f: f) 27 | } 28 | } 29 | } 30 | } 31 | 32 | extension UIView: SubviewsForEach {} 33 | -------------------------------------------------------------------------------- /README/Add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/README/Add.png -------------------------------------------------------------------------------- /README/AppIcon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/README/AppIcon.png -------------------------------------------------------------------------------- /README/Explore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/README/Explore.png -------------------------------------------------------------------------------- /README/SplashScreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Aymenworks/HyperRecipe/8c7ea75d70109c82d1734d3157e2eb37e737c130/README/SplashScreen.png --------------------------------------------------------------------------------