[
  {
    "path": ".github/workflows/pr.yml",
    "content": "name: PR\n\non:\n  pull_request: \n    branches:\n      - master\n\njobs:\n  pr:\n    runs-on: macos-11\n    \n    steps:\n      - uses: actions/checkout@v2\n      - uses: ruby/setup-ruby@v1\n        with:\n          ruby-version: 2.6\n\n      - uses: maxim-lobanov/setup-xcode@v1\n        with:\n          xcode-version: latest-stable\n\n      - name: Prepare\n        run: bundle install\n      \n      - name: Test\n        run: bundle exec fastlane test"
  },
  {
    "path": ".gitignore",
    "content": "# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n## macOS \n.DS_Store\n\n## Build generated\nbuild/\nDerivedData\n\n## Various settings\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata\n\n## Other\n*.xccheckout\n*.moved-aside\n*.xcuserstate\n*.xcscmblueprint\n\n## Obj-C/Swift specific\n*.hmap\n*.ipa\n\n## Playgrounds\ntimeline.xctimeline\nplayground.xcworkspace\n\n# Swift Package Manager\n#\n# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.\n# Packages/\n.build/\n.bundle/\n\n# CocoaPods\n#\n# We recommend against adding the Pods directory to your .gitignore. However\n# you should judge for yourself, the pros and cons are mentioned at:\n# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control\n#\n# Pods/\n\n# Carthage\n#\n# Add this line if you want to avoid checking in source code from Carthage dependencies.\n# Carthage/Checkouts\n\nCarthage/\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the\n# screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://github.com/fastlane/fastlane/blob/master/docs/Gitignore.md\n\nfastlane/report.xml\nfastlane/screenshots\n"
  },
  {
    "path": ".gitmodules",
    "content": ""
  },
  {
    "path": ".swiftformat",
    "content": "# file options\n\n--exclude Carthage,Build,.build,.swiftpm,SourcePackages\n--symlinks ignore\n--swiftversion 5.3\n\n# format options\n\n--allman false\n--binarygrouping 4,8\n--commas inline\n--comments indent\n--decimalgrouping 3,6\n--elseposition same-line\n--empty void\n--exponentcase lowercase\n--exponentgrouping disabled\n--fractiongrouping disabled\n--guardelse same-line\n--header ignore\n--hexgrouping 4,8\n--hexliteralcase uppercase\n--ifdef indent\n--indent 2\n--indentcase false\n--importgrouping testable-bottom\n--linebreaks lf\n--maxwidth none\n--octalgrouping 4,8\n--patternlet hoist\n--operatorfunc spaced\n--nospaceoperators ..<, ...\n--self remove\n--semicolons inline\n--stripunusedargs always\n--trimwhitespace always\n--wraparguments before-first\n--wrapcollections before-first\n"
  },
  {
    "path": ".swiftlint.yml",
    "content": "disabled_rules:\n  - redundant_string_enum_value\n  - line_length\n  - trailing_whitespace\n  - identifier_name\n  - opening_brace\n\nopt_in_rules:\n  - closure_spacing\n  - conditional_returns_on_newline\n  - empty_count\n  - explicit_init\n  - fatal_error_message\n  - first_where\n  - force_unwrapping\n  - overridden_super_call\n  - prohibited_super_call\n  - redundant_nil_coalescing\n  - operator_usage_whitespace\n\n  - array_init\n  - contains_over_first_not_nil\n  - joined_default_parameter\n  - line_length\n  - literal_expression_end_indentation\n  - multiline_parameters\n  - override_in_extension\n  - pattern_matching_keywords\n  - redundant_string_enum_value\n  - sorted_first_last\n  - unneeded_parentheses_in_closure_argument\n  - vertical_parameter_alignment_on_call\n\n  - nimble_operator\n  - quick_discouraged_call\n  - quick_discouraged_focused_test\n  - quick_discouraged_pending_test\n  - single_test_class\n\n  # TODO: maybe turn it on one day... (a lot of fixes)\n  # - closure_end_indentation\n  # - let_var_whitespace\n  # - implicitly_unwrapped_optional\n  # - private_outlet\n  # - object_literal\n  # - sorted_imports\n  # - strict_fileprivate\n  # - switch_case_on_newline\n\nincluded:\n  - Sources\n  - Tests\n  - Example\n\nexcluded:\n  - SourcePackages\n  - .build \n  - Build\n  - .swiftpm\n  - Carthage\n\n\ncyclomatic_complexity:\n  warning: 25\n\ntype_body_length:\n  warning: 300\n  error: 500\n\nfile_length:\n  warning: 500\n  error: 800\n\ntype_name:\n  min_length: 3\n  max_length:\n    warning: 50\n    error: 60\n  excluded:\n    - Id\n    - Ad\n\nnesting:\n  type_level:\n    warning: 3\n    error: 5\n\nsuperfluous_disable_command: warning\nforce_unwrapping: error\ntrailing_semicolon: error\n\nreporter: \"xcode\"\n"
  },
  {
    "path": ".swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": ".swiftpm/xcode/xcshareddata/xcschemes/Carlos.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1150\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"Carlos\"\n               BuildableName = \"Carlos\"\n               BlueprintName = \"Carlos\"\n               ReferencedContainer = \"container:\">\n            </BuildableReference>\n         </BuildActionEntry>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"NO\"\n            buildForProfiling = \"NO\"\n            buildForArchiving = \"NO\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"CarlosTests\"\n               BuildableName = \"CarlosTests\"\n               BlueprintName = \"CarlosTests\"\n               ReferencedContainer = \"container:\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      codeCoverageEnabled = \"YES\"\n      onlyGenerateCoverageForSpecifiedTargets = \"YES\">\n      <CodeCoverageTargets>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"Carlos\"\n            BuildableName = \"Carlos\"\n            BlueprintName = \"Carlos\"\n            ReferencedContainer = \"container:\">\n         </BuildableReference>\n      </CodeCoverageTargets>\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"CarlosTests\"\n               BuildableName = \"CarlosTests\"\n               BlueprintName = \"CarlosTests\"\n               ReferencedContainer = \"container:\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"Carlos\"\n            BuildableName = \"Carlos\"\n            BlueprintName = \"Carlos\"\n            ReferencedContainer = \"container:\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\n\n## 1.0.0 \n**Breaking Changes**\n- Swift 5.3 and Xcode 12 support \n- The codebase has been migrated from PiedPiper to Combine\n- The minimum supported OS version set to Combine's minimum supported version: iOS 13, macOS 10.15, watchOS 6, tvOS 13.\n- Removed `Dispatched.swift` and `RequestCapperCache.swift` because the functionality they provided could be easily re-implemented using Combine operators.\n\n**New Features** \n- `Carlos` is now powered by Combine which means you can use awesome Combine provided operators on the Carlos cached values!\n\n## 0.10.0\n**New Features**\n- Swift Package Manager Support \n- Xcode 11.5 Migration\n\n## 0.9\n\n**Breaking Changes**\n- Swift 3.0 support (for Swift 2.3 use specific commit `5d354c829d766568f164c386c59de21357b5ccff` instead)\n- `batchGetAll` has been removed and replaced with a reified `allBatch` (see **New features**)\n- All deprecated functions have been removed\n- All custom operators have been removed in favor of their function counterparts\n- macOS and tvOS support has been temporarily dropped and will be probably re-added in the future \n- `set` method on `CacheLevel` now returns a `Future` enabling error-handling and progress-tracking of `set` calls.\n\n**New Features**\n- It's now possible to lift a `CacheLevel` into one that operates on a sequence of keys and returns a sequence of values. You can use `allBatch` to create a concrete `BatchAllCache`. You can use `get` on this cache if you want to pass a list of keys and get the success callback when **all** of them succeed and the failure callback **as soon as one** of them fails (old behavior of `batchGetAll`), or you can compose or transform an `allBatch` cache just like any another `CacheLevel`. Consult the `README.md` for an example.\n\n\n## 0.8\n\n**Breaking Changes**\n- The codebase has been migrated to Swift 2.2\n- `Promise` now has only an empty `init`. If you used one of the convenience `init` (with `value:`, with `error:` or with `value:error:`), they now moved to `Future`.\n\n## 0.7\n**Breaking Changes**\n- `onCompletion` argument now is a closure accepting a `Result<T>` as a parameter instead of a tuple `(value: T?, error: ErrorType?)`. `Result<T>` is the usual `enum` (aka `Either`) that can be `.Success(T)`, `.Error(ErrorType)` or `Cancelled` in case of canceled computations.\n- Please add a `import PiedPiper` line everywhere you make use of Carlos' `Future`s or `Promise`s, since with 0.7 we now ship a separate `Pied Piper` framework.\n- `AsyncComputation` has been removed from the public API. Please use `OneWayTransformer` (or `CacheLevel`) instead now.\n\n**Deprecated**\n- APIs using closures instead of `Fetcher`, `CacheLevel` or `OneWayTransformer` parameters are now deprecated in favor of their counterparts. They will be removed from Carlos with the 1.0 release.\n\n**New Features**\n- It's now possible to batch a set of fetch requests. You can use `batchGetAll` if you want to pass a list of keys and get the success callback when **all** of them succeed and the failure callback **as soon as one** of them fails, or `batchGetSome` if you want to pass a list of keys and get the success callback when all of them completed (successfully or not) but only get the list of successful responses back.\n\n**Fixes**\n- Correctly updates access date on the disk cache when calling `set` on a `DiskCacheLevel`\n\n## 0.6\n\n**New features**\n- It's now possible to conditionally post-process values fetched from `CacheLevel`s (or fetch closures) on the key used to fetch the value. Use the function `conditionedPostProcess` or consult the `README.md` for more information\n- It's now possible to conditionally transform values fetched from (or set on) `CacheLevel`s on the key used to fetch (or set) the value. Use the function `conditionedValueTransformation` or consult the `README.md` for more information\n\n**Fixes**\n- `Carthage` integration works again\n\n**Minor improvements**\n- `CacheProvider` now has accessors to retrieve shared instances of the built-in caches (`sharedImageCache`, `sharedDataCache` and `sharedJSONCache`)\n\n## 0.5\n\n**New features**\n- `Promise` can now be canceled. Call `cancel()` to cancel a `Promise`. Be notified of a canceled operation with the `onCancel` function. Use `onCancel` to setup the cancel behavior of your custom operation. Remember that an operation can only be canceled once, and can only be *executing*, *canceled*, *failed* or *succeeded* at any given time.\n- It's now possible to apply a condition to a `OneWayTransformer`. You can call `conditioned` on the instance of `OneWayTransformer` to decorate and pass the condition on the input. This means you can effectively implement conditioned key transformations on `CacheLevel`s. Moreover, you can implement conditioned post processing transformations as well. For this, though, keep in mind that the input of the `OneWayTransformer` will be the output of the cache, not the key.\n- It's now possible to apply a condition to a `TwoWayTransformer`. You can call `conditioned` on the instance of `TwoWayTransformer` to decorate and pass two conditions: the one to apply for the forward transformation and the one to apply for the inverse transformation, that will take of course different input types. This means you can effectively implement conditioned value transformations on `CacheLevel`s. \n- A new `NSUserDefaultsCacheLevel` is now included in `Carlos`. You can use this `CacheLevel` to persist values on `NSUserDefaults`, and you can even use multiple instances of this level to persist sandboxed sets of values\n- It's now possible to dispatch a `CacheLevel` or a fetch closure on a given GCD queue. Use the `dispatch` protocol extension or the `~>>` operator and pass the  specific `dispatch_queue_t`. Global functions are not provided since we're moving towards a global-functions-free API for `Carlos 1.0`\n\n**Major changes**\n- **API Breaking**: `CacheRequest` is now renamed to `Future`. All the public API return `Future` instances now, and you can use `Promise` for your custom cache levels and fetchers\n- **API Breaking**: `OneWayTransformer` and `TwoWayTransformer` are now asynchronous, i.e. they return a `Future<T>` instead of a `T` directly\n- **API Breaking**: all the `conditioned` variants now take an asynchronous condition closure, i.e. the closure has to return a `Future<Bool>` instead of a `(Bool, ErrorType)` tuple\n- All the global functions are now **deprecated**. They will be removed from the public API with the release of `Carlos 1.0`\n\n**Minor improvements**\n- `Promise` can now be initialized with an `Optional<T>` and an `ErrorType`, correctly behaving depending on the optional value\n- `Promise` now has a `mimic` function that takes a `Future<T>` and succeeds or fails when the given `Future` does so\n- `ImageTransformer` now applies its tranformations on a background queue\n- `JSONTransformer` now passes the right error when the transformations fail \n- `CacheProvider.dataCache` now pools requests on the network **and** disk levels, so pooled requests don't result in multiple `set` calls on the disk level\n- It's now possible to `cancel` operations coming from a `NetworkFetcher`\n- `Int`, `Float`, `Double` and `Character` conform to `ExpensiveObject` now with a unit (`1`) cost\n- Added a `MIGRATING.md` to the repo and to the Wiki that explains how to migrate to new versions of `Carlos` (only for breaking changes)\n\n\n## 0.4\n\n**Major changes**\n- Adds a `Fetcher` protocol that you can use to create your custom fetchers.\n- Adds the possibility to transform values coming out of `Fetcher` instances through `OneWayTransformer` objects without forcing them to be `TwoWayTransformer` as in the case of transforming values of `CacheLevel` instances \n- Adds a `JSONCache` function to `CacheProvider`\n- Adds output processers to process/sanitize values coming out of `CacheLevel`s (see `postProcess`) \n- Adds a way to compose multiple `OneWayTransformer`s through functions, operators and protocol extensions\n- Adds a way to compose multiple `TwoWayTransformer`s through functions, operators and protocol extensions\n- Adds a `normalize` function and protocol extension transforming `CacheLevel` instances into `BasicCache` ones to make it easier to store instance properties\n- Adds a `JSONTransformer` class conforming to `TwoWayTransformer`\n- Adds a `ImageTransformer` class for the iOS and WatchOS 2 frameworks conforming to `TwoWayTransformer`\n- Adds a `StringTransformer` class conforming to `TwoWayTransformer`\n\n**Minor improvements**\n- `invert` is now available as a protocol extension to the `TwoWayTransformer` protocol\n\n**WatchOS 2**\n- Adds `WatchOS 2` support through `CocoaPods`\n\n**tvOS**\n- Adds framework support for `tvOS`\n\n## 0.3\n\n**Major changes**\n- Codebase converted to `Swift 2.0`\n- Adds `WatchOS 2` support\n- Adds `Mac OS X 10.9+` support\n\n**API-Breaking changes**\n- `CacheRequest.onFailure` now passes an `ErrorType` instead of an `NSError`\n\n**Minor improvements**\n- Adds an `onCompletion` method to the `CacheRequest` class, that will be called in both success and failure cases\n\n## 0.2\n\n**Major changes**\n- Includes a `CacheProvider` class to create commonly used caches\n- Includes a Playground to quickly test Carlos and custom cache architectures\n- includes a new `switchLevels` function to have multiple cache lanes\n\n**Minor improvements**\n- Improves `DiskCacheLevel` and `MemoryCacheLevel` by having protocol-based keys\n- Defines safer Transformers (either `OneWayTransformer` or `TwoWayTransformer`) that return Optionals. If a conversion fails, set operations silently fail and get operations fail with a meaningful error.\n- Extends the `conditioned` function and the `<?>` operator to support fetch closures\n- Improves the code documentation\n\n**Bugfixes**\n- Fixes an issue where the `NetworkFetcher` would not correctly handle multiple get requests for the same URL\n\n## 0.1\n\n- First release\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing to Carlos\n\nIf you want to contribute to this repo, please:\n\n- Create an issue explaining your problem and your solution\n- Clone the repo on your local machine\n- Create a branch with the issue number and a short abstract of the feature name\n- Implement your solution\n- Write tests (untested features won't be merged)\n- When all the tests are written and green, create a pull request, with a short description of the approach taken"
  },
  {
    "path": "Carlos.podspec",
    "content": "#\n# Be sure to run `pod lib lint Carlos.podspec' to ensure this is a\n# valid spec and remove all comments before submitting the spec.\n#\n\nPod::Spec.new do |s|\n  s.name             = \"Carlos\"\n  s.version          = \"1.0.0\"\n  s.summary          = \"A simple but flexible cache.\"\n  s.description      = <<-DESC\n\t\t\tCarlos is a small set of classes convenience operators to realize custom, flexible and powerful cache layers in your iOS, watchOS, tvOS and Mac OS X applications.\n                       DESC\n  s.homepage         = \"https://github.com/spring-media/Carlos\"\n  s.license          = 'MIT'\n  s.author           = { \"Vittorio Monaco\" => \"vittorio.monaco1@gmail.com\" }\n  s.source           = { :git => \"https://github.com/spring-media/Carlos.git\", :tag => s.version.to_s }\n  s.swift_version    = '5.0'\n\n  s.ios.deployment_target     = '13.0'\n  s.watchos.deployment_target = '6.0'\n\n  s.source_files          = 'Sources/Carlos/*.swift'\n  s.watchos.exclude_files = 'Sources/Carlos/MemoryWarning.swift'\n\n  s.requires_arc = true\nend\n"
  },
  {
    "path": "Carlos.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 52;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t5205729B1BB8716E0098DD09 /* StringTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5205729A1BB8716E0098DD09 /* StringTransformer.swift */; };\n\t\t520572A91BB8752B0098DD09 /* StringTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520572A81BB8752B0098DD09 /* StringTransformerTests.swift */; };\n\t\t5207E6991BE13D2E0062DEAC /* ExpensiveObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5207E6981BE13D2E0062DEAC /* ExpensiveObject.swift */; };\n\t\t5207E6AD1BE15BCE0062DEAC /* NSUserDefaultsCacheLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5207E6AC1BE15BCE0062DEAC /* NSUserDefaultsCacheLevel.swift */; };\n\t\t520DBB4F1CF6307500F9ABE3 /* BatchAllCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DBB4E1CF6307500F9ABE3 /* BatchAllCache.swift */; };\n\t\t5222107C1C501C5400E682D1 /* ConditionedOneWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5222107B1C501C5400E682D1 /* ConditionedOneWayTransformer.swift */; };\n\t\t5222108B1C501F2100E682D1 /* ConditionedTwoWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5222108A1C501F2100E682D1 /* ConditionedTwoWayTransformer.swift */; };\n\t\t522210901C50358700E682D1 /* ConditionedOneWayTransformationBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5222108F1C50358700E682D1 /* ConditionedOneWayTransformationBoxTests.swift */; };\n\t\t523257D21B51993000A10A56 /* TwoWayTransformationBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 523257D11B51993000A10A56 /* TwoWayTransformationBoxTests.swift */; };\n\t\t523257D41B519AB900A10A56 /* OneWayTransformationBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 523257D31B519AB900A10A56 /* OneWayTransformationBoxTests.swift */; };\n\t\t5235BAD71BE175BE0049CFA6 /* NSUserDefaultsCacheLevelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5235BAD61BE175BE0049CFA6 /* NSUserDefaultsCacheLevelTests.swift */; };\n\t\t524019BC1C0AF9ED00749957 /* CacheProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 524019BB1C0AF9ED00749957 /* CacheProviderTests.swift */; };\n\t\t5243C4B31B77670F00737B3B /* StringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5243C4B21B77670F00737B3B /* StringConvertible.swift */; };\n\t\t5243C4BF1B77686300737B3B /* StringConvertibleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5243C4BE1B77686300737B3B /* StringConvertibleTests.swift */; };\n\t\t52463F6E1C181D1B0034D032 /* ConditionedOutputProcessing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52463F6D1C181D1B0034D032 /* ConditionedOutputProcessing.swift */; };\n\t\t52463F7D1C18264B0034D032 /* ConditionedOutputProcessingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52463F7C1C18264B0034D032 /* ConditionedOutputProcessingTests.swift */; };\n\t\t52463F7F1C1837CF0034D032 /* ConditionedValueTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52463F7E1C1837CF0034D032 /* ConditionedValueTransformation.swift */; };\n\t\t5250E3801BB1345700EB7388 /* Normalize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5250E37F1BB1345700EB7388 /* Normalize.swift */; };\n\t\t5250E3841BB137BF00EB7388 /* NormalizationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5250E3831BB137BF00EB7388 /* NormalizationTests.swift */; };\n\t\t5257BBB41BBFC3FD00787819 /* ComposedTwoWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5257BBB31BBFC3FD00787819 /* ComposedTwoWayTransformer.swift */; };\n\t\t5257BBC21BBFC7A800787819 /* TwoWayTransformerCompositionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5257BBC11BBFC7A800787819 /* TwoWayTransformerCompositionTests.swift */; };\n\t\t526005AF1BB84AB200D96242 /* ImageTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526005AE1BB84AB200D96242 /* ImageTransformerTests.swift */; };\n\t\t526078251BE2590E0022040B /* ConditionedTransformersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526078241BE2590E0022040B /* ConditionedTransformersTests.swift */; };\n\t\t52615CD41BBC8123001DA9BE /* ComposedOneWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52615CD31BBC8123001DA9BE /* ComposedOneWayTransformer.swift */; };\n\t\t52615CE21BBC87F4001DA9BE /* OneWayTransformerCompositionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52615CE11BBC87F4001DA9BE /* OneWayTransformerCompositionTests.swift */; };\n\t\t526339751B52435C00074CB9 /* KeyTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339741B52435C00074CB9 /* KeyTransformation.swift */; };\n\t\t526339771B52450C00074CB9 /* ConditionedCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339761B52450C00074CB9 /* ConditionedCacheTests.swift */; };\n\t\t5263397B1B52536700074CB9 /* KeyTransformationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5263397A1B52536700074CB9 /* KeyTransformationTests.swift */; };\n\t\t5263397D1B525D1600074CB9 /* MemoryCacheLevelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5263397C1B525D1600074CB9 /* MemoryCacheLevelTests.swift */; };\n\t\t5263397F1B52760F00074CB9 /* ValueTransformationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5263397E1B52760F00074CB9 /* ValueTransformationTests.swift */; };\n\t\t526339811B52805000074CB9 /* MemoryWarningNotificationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339801B52805000074CB9 /* MemoryWarningNotificationTests.swift */; };\n\t\t526339831B52866900074CB9 /* BasicCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339821B52866900074CB9 /* BasicCacheTests.swift */; };\n\t\t526339851B52A82800074CB9 /* CompositionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339841B52A82800074CB9 /* CompositionTests.swift */; };\n\t\t526339891B52B51C00074CB9 /* DiskCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339881B52B51C00074CB9 /* DiskCacheTests.swift */; };\n\t\t52635A4F1B4F0F6F00F187EE /* BasicCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A3C1B4F0F6F00F187EE /* BasicCache.swift */; };\n\t\t52635A511B4F0F6F00F187EE /* Carlos.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A3E1B4F0F6F00F187EE /* Carlos.swift */; };\n\t\t52635A521B4F0F6F00F187EE /* Composed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A3F1B4F0F6F00F187EE /* Composed.swift */; };\n\t\t52635A531B4F0F6F00F187EE /* Conditioned.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A401B4F0F6F00F187EE /* Conditioned.swift */; };\n\t\t52635A551B4F0F6F00F187EE /* DiskCacheLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A421B4F0F6F00F187EE /* DiskCacheLevel.swift */; };\n\t\t52635A561B4F0F6F00F187EE /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A431B4F0F6F00F187EE /* Errors.swift */; };\n\t\t52635A571B4F0F6F00F187EE /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A441B4F0F6F00F187EE /* Extensions.swift */; };\n\t\t52635A581B4F0F6F00F187EE /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A451B4F0F6F00F187EE /* Logger.swift */; };\n\t\t52635A591B4F0F6F00F187EE /* MemoryCacheLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A461B4F0F6F00F187EE /* MemoryCacheLevel.swift */; };\n\t\t52635A5A1B4F0F6F00F187EE /* MemoryWarning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A471B4F0F6F00F187EE /* MemoryWarning.swift */; };\n\t\t52635A5B1B4F0F6F00F187EE /* NetworkFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A481B4F0F6F00F187EE /* NetworkFetcher.swift */; };\n\t\t52635A5C1B4F0F6F00F187EE /* OneWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A491B4F0F6F00F187EE /* OneWayTransformer.swift */; };\n\t\t52635A5D1B4F0F6F00F187EE /* PoolCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A4A1B4F0F6F00F187EE /* PoolCache.swift */; };\n\t\t52635A5F1B4F0F6F00F187EE /* ValueTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A4C1B4F0F6F00F187EE /* ValueTransformation.swift */; };\n\t\t52635A601B4F0F6F00F187EE /* Transformers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A4D1B4F0F6F00F187EE /* Transformers.swift */; };\n\t\t52635A611B4F0F6F00F187EE /* TwoWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A4E1B4F0F6F00F187EE /* TwoWayTransformer.swift */; };\n\t\t5274A99B1BC05CB0006962E8 /* FetcherValueTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5274A99A1BC05CB0006962E8 /* FetcherValueTransformation.swift */; };\n\t\t5274A9A01BC0613C006962E8 /* BasicFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5274A99F1BC0613C006962E8 /* BasicFetcher.swift */; };\n\t\t5274A9CD1BC06976006962E8 /* BasicFetcherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5274A9CC1BC06976006962E8 /* BasicFetcherTests.swift */; };\n\t\t5274A9D91BC069E7006962E8 /* FetcherValueTransformationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5274A9D81BC069E7006962E8 /* FetcherValueTransformationTests.swift */; };\n\t\t527C65471B7A66D90005023B /* SwitchCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527C65461B7A66D90005023B /* SwitchCache.swift */; };\n\t\t527C65531B7A89440005023B /* SwitchCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527C65521B7A89440005023B /* SwitchCacheTests.swift */; };\n\t\t5291C8531BB7FAA800C4E15E /* JSONTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5291C8521BB7FAA800C4E15E /* JSONTransformerTests.swift */; };\n\t\t52B7621C1BB84F160087CD91 /* JSONTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52B7621B1BB84F160087CD91 /* JSONTransformer.swift */; };\n\t\t52BBFD561B51BA140000084A /* CacheLevelFake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52BBFD551B51BA140000084A /* CacheLevelFake.swift */; };\n\t\t52BBFD581B51BAD20000084A /* PoolCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52BBFD571B51BAD20000084A /* PoolCacheTests.swift */; };\n\t\t52BED3501CE87C38002C045A /* Carlos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 52635A1D1B4F0F3D00F187EE /* Carlos.framework */; };\n\t\t52D5F3481C503C6700BA3452 /* ConditionedTwoWayTransformationBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D5F3471C503C6700BA3452 /* ConditionedTwoWayTransformationBoxTests.swift */; };\n\t\t52D5F3541C52C32000BA3452 /* ConditionedValueTransformationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D5F3531C52C32000BA3452 /* ConditionedValueTransformationTests.swift */; };\n\t\t52D7DDAD1C54F4E1007E5328 /* CacheLevel+Batch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D7DDAC1C54F4E1007E5328 /* CacheLevel+Batch.swift */; };\n\t\t52D7DDBC1C552854007E5328 /* BatchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D7DDBB1C552854007E5328 /* BatchTests.swift */; };\n\t\t52E0CBF91BBC4E1800F20C22 /* PostProcess.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52E0CBF81BBC4E1800F20C22 /* PostProcess.swift */; };\n\t\t52E197021BBC6B27004BF6C5 /* PostProcessTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52E197011BBC6B27004BF6C5 /* PostProcessTests.swift */; };\n\t\t52F0644F1B51AC0D00145C98 /* NSDateFormatterTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52F0644E1B51AC0D00145C98 /* NSDateFormatterTransformerTests.swift */; };\n\t\t52F064511B51AE4300145C98 /* NSNumberFormatterTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52F064501B51AE4300145C98 /* NSNumberFormatterTransformerTests.swift */; };\n\t\t52F064551B51B26200145C98 /* MKDistanceFormatterTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52F064541B51B26200145C98 /* MKDistanceFormatterTransformerTests.swift */; };\n\t\tAD22FB2D1B70BBF6007F319F /* CacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD22FB2C1B70BBF5007F319F /* CacheProvider.swift */; };\n\t\tC71C59751B6A722800AE5294 /* NetworkFetcherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C71C59731B6A721C00AE5294 /* NetworkFetcherTests.swift */; };\n\t\tCC0313E124ACBBC8002AB2BE /* Base64EncodedImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC0313DF24ACBBC8002AB2BE /* Base64EncodedImage.swift */; };\n\t\tCC0313E724ACCF94002AB2BE /* Transformers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A4D1B4F0F6F00F187EE /* Transformers.swift */; };\n\t\tCC0313E824ACCF94002AB2BE /* ConditionedTwoWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5222108A1C501F2100E682D1 /* ConditionedTwoWayTransformer.swift */; };\n\t\tCC0313E924ACCF94002AB2BE /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A441B4F0F6F00F187EE /* Extensions.swift */; };\n\t\tCC0313EA24ACCF94002AB2BE /* ConditionedValueTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52463F7E1C1837CF0034D032 /* ConditionedValueTransformation.swift */; };\n\t\tCC0313EB24ACCF94002AB2BE /* NetworkFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A481B4F0F6F00F187EE /* NetworkFetcher.swift */; };\n\t\tCC0313EC24ACCF94002AB2BE /* SwitchCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527C65461B7A66D90005023B /* SwitchCache.swift */; };\n\t\tCC0313ED24ACCF94002AB2BE /* MemoryCacheLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A461B4F0F6F00F187EE /* MemoryCacheLevel.swift */; };\n\t\tCC0313EE24ACCF94002AB2BE /* Carlos.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A3E1B4F0F6F00F187EE /* Carlos.swift */; };\n\t\tCC0313EF24ACCF94002AB2BE /* CacheLevel+Batch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D7DDAC1C54F4E1007E5328 /* CacheLevel+Batch.swift */; };\n\t\tCC0313F024ACCF94002AB2BE /* BasicCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A3C1B4F0F6F00F187EE /* BasicCache.swift */; };\n\t\tCC0313F224ACCF94002AB2BE /* ImageTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC7061D24AC93EA00D16827 /* ImageTransformer.swift */; };\n\t\tCC0313F324ACCF94002AB2BE /* ValueTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A4C1B4F0F6F00F187EE /* ValueTransformation.swift */; };\n\t\tCC0313F424ACCF94002AB2BE /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A451B4F0F6F00F187EE /* Logger.swift */; };\n\t\tCC0313F524ACCF94002AB2BE /* ComposedTwoWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5257BBB31BBFC3FD00787819 /* ComposedTwoWayTransformer.swift */; };\n\t\tCC0313F624ACCF94002AB2BE /* KeyTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339741B52435C00074CB9 /* KeyTransformation.swift */; };\n\t\tCC0313F724ACCF94002AB2BE /* CacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD22FB2C1B70BBF5007F319F /* CacheProvider.swift */; };\n\t\tCC0313F824ACCF94002AB2BE /* NSUserDefaultsCacheLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5207E6AC1BE15BCE0062DEAC /* NSUserDefaultsCacheLevel.swift */; };\n\t\tCC0313F924ACCF94002AB2BE /* BatchAllCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DBB4E1CF6307500F9ABE3 /* BatchAllCache.swift */; };\n\t\tCC0313FC24ACCF94002AB2BE /* ComposedOneWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52615CD31BBC8123001DA9BE /* ComposedOneWayTransformer.swift */; };\n\t\tCC0313FD24ACCF94002AB2BE /* StringTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5205729A1BB8716E0098DD09 /* StringTransformer.swift */; };\n\t\tCC0313FE24ACCF94002AB2BE /* FetcherValueTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5274A99A1BC05CB0006962E8 /* FetcherValueTransformation.swift */; };\n\t\tCC0313FF24ACCF94002AB2BE /* PoolCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A4A1B4F0F6F00F187EE /* PoolCache.swift */; };\n\t\tCC03140024ACCF94002AB2BE /* PostProcess.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52E0CBF81BBC4E1800F20C22 /* PostProcess.swift */; };\n\t\tCC03140224ACCF94002AB2BE /* OneWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A491B4F0F6F00F187EE /* OneWayTransformer.swift */; };\n\t\tCC03140324ACCF94002AB2BE /* ConditionedOutputProcessing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52463F6D1C181D1B0034D032 /* ConditionedOutputProcessing.swift */; };\n\t\tCC03140424ACCF94002AB2BE /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A431B4F0F6F00F187EE /* Errors.swift */; };\n\t\tCC03140524ACCF94002AB2BE /* ExpensiveObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5207E6981BE13D2E0062DEAC /* ExpensiveObject.swift */; };\n\t\tCC03140624ACCF94002AB2BE /* TwoWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A4E1B4F0F6F00F187EE /* TwoWayTransformer.swift */; };\n\t\tCC03140724ACCF94002AB2BE /* CacheProvider+ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC7061C24AC93EA00D16827 /* CacheProvider+ImageCache.swift */; };\n\t\tCC03140824ACCF94002AB2BE /* DiskCacheLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A421B4F0F6F00F187EE /* DiskCacheLevel.swift */; };\n\t\tCC03140924ACCF94002AB2BE /* MemoryWarning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A471B4F0F6F00F187EE /* MemoryWarning.swift */; };\n\t\tCC03140A24ACCF94002AB2BE /* Composed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A3F1B4F0F6F00F187EE /* Composed.swift */; };\n\t\tCC03140B24ACCF94002AB2BE /* Conditioned.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A401B4F0F6F00F187EE /* Conditioned.swift */; };\n\t\tCC03140C24ACCF94002AB2BE /* JSONTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52B7621B1BB84F160087CD91 /* JSONTransformer.swift */; };\n\t\tCC03140D24ACCF94002AB2BE /* StringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5243C4B21B77670F00737B3B /* StringConvertible.swift */; };\n\t\tCC03140E24ACCF94002AB2BE /* BasicFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5274A99F1BC0613C006962E8 /* BasicFetcher.swift */; };\n\t\tCC03140F24ACCF94002AB2BE /* Normalize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5250E37F1BB1345700EB7388 /* Normalize.swift */; };\n\t\tCC03141024ACCF94002AB2BE /* ConditionedOneWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5222107B1C501C5400E682D1 /* ConditionedOneWayTransformer.swift */; };\n\t\tCC03142024ACCF99002AB2BE /* ImageTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526005AE1BB84AB200D96242 /* ImageTransformerTests.swift */; };\n\t\tCC03142124ACCF99002AB2BE /* MemoryWarningNotificationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339801B52805000074CB9 /* MemoryWarningNotificationTests.swift */; };\n\t\tCC03142224ACCF99002AB2BE /* StringConvertibleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5243C4BE1B77686300737B3B /* StringConvertibleTests.swift */; };\n\t\tCC03142324ACCF99002AB2BE /* DiskCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339881B52B51C00074CB9 /* DiskCacheTests.swift */; };\n\t\tCC03142424ACCF99002AB2BE /* ConditionedTwoWayTransformationBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D5F3471C503C6700BA3452 /* ConditionedTwoWayTransformationBoxTests.swift */; };\n\t\tCC03142524ACCF99002AB2BE /* MKDistanceFormatterTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52F064541B51B26200145C98 /* MKDistanceFormatterTransformerTests.swift */; };\n\t\tCC03142624ACCF99002AB2BE /* StringTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520572A81BB8752B0098DD09 /* StringTransformerTests.swift */; };\n\t\tCC03142724ACCF99002AB2BE /* ConditionedOutputProcessingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52463F7C1C18264B0034D032 /* ConditionedOutputProcessingTests.swift */; };\n\t\tCC03142924ACCF99002AB2BE /* OneWayTransformerCompositionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52615CE11BBC87F4001DA9BE /* OneWayTransformerCompositionTests.swift */; };\n\t\tCC03142A24ACCF99002AB2BE /* JSONTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5291C8521BB7FAA800C4E15E /* JSONTransformerTests.swift */; };\n\t\tCC03142B24ACCF99002AB2BE /* OneWayTransformationBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 523257D31B519AB900A10A56 /* OneWayTransformationBoxTests.swift */; };\n\t\tCC03142C24ACCF99002AB2BE /* ConditionedOneWayTransformationBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5222108F1C50358700E682D1 /* ConditionedOneWayTransformationBoxTests.swift */; };\n\t\tCC03142D24ACCF99002AB2BE /* SwitchCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527C65521B7A89440005023B /* SwitchCacheTests.swift */; };\n\t\tCC03142F24ACCF99002AB2BE /* CacheLevelFake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52BBFD551B51BA140000084A /* CacheLevelFake.swift */; };\n\t\tCC03143124ACCF99002AB2BE /* BatchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D7DDBB1C552854007E5328 /* BatchTests.swift */; };\n\t\tCC03143224ACCF99002AB2BE /* NSDateFormatterTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52F0644E1B51AC0D00145C98 /* NSDateFormatterTransformerTests.swift */; };\n\t\tCC03143324ACCF99002AB2BE /* FetcherValueTransformationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5274A9D81BC069E7006962E8 /* FetcherValueTransformationTests.swift */; };\n\t\tCC03143424ACCF99002AB2BE /* Base64EncodedImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC0313DF24ACBBC8002AB2BE /* Base64EncodedImage.swift */; };\n\t\tCC03143524ACCF99002AB2BE /* BasicCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339821B52866900074CB9 /* BasicCacheTests.swift */; };\n\t\tCC03143624ACCF99002AB2BE /* ValueTransformationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5263397E1B52760F00074CB9 /* ValueTransformationTests.swift */; };\n\t\tCC03143724ACCF99002AB2BE /* TwoWayTransformerCompositionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5257BBC11BBFC7A800787819 /* TwoWayTransformerCompositionTests.swift */; };\n\t\tCC03143824ACCF99002AB2BE /* CacheProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 524019BB1C0AF9ED00749957 /* CacheProviderTests.swift */; };\n\t\tCC03143924ACCF99002AB2BE /* MemoryCacheLevelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5263397C1B525D1600074CB9 /* MemoryCacheLevelTests.swift */; };\n\t\tCC03143A24ACCF99002AB2BE /* KeyTransformationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5263397A1B52536700074CB9 /* KeyTransformationTests.swift */; };\n\t\tCC03143B24ACCF99002AB2BE /* ConditionedTransformersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526078241BE2590E0022040B /* ConditionedTransformersTests.swift */; };\n\t\tCC03143C24ACCF99002AB2BE /* CompositionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339841B52A82800074CB9 /* CompositionTests.swift */; };\n\t\tCC03143D24ACCF99002AB2BE /* PoolCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52BBFD571B51BAD20000084A /* PoolCacheTests.swift */; };\n\t\tCC03143E24ACCF99002AB2BE /* ConditionedCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339761B52450C00074CB9 /* ConditionedCacheTests.swift */; };\n\t\tCC03143F24ACCF99002AB2BE /* NSNumberFormatterTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52F064501B51AE4300145C98 /* NSNumberFormatterTransformerTests.swift */; };\n\t\tCC03144024ACCF99002AB2BE /* NetworkFetcherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C71C59731B6A721C00AE5294 /* NetworkFetcherTests.swift */; };\n\t\tCC03144124ACCF99002AB2BE /* BasicFetcherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5274A9CC1BC06976006962E8 /* BasicFetcherTests.swift */; };\n\t\tCC03144224ACCF99002AB2BE /* ConditionedValueTransformationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D5F3531C52C32000BA3452 /* ConditionedValueTransformationTests.swift */; };\n\t\tCC03144324ACCF99002AB2BE /* PostProcessTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52E197011BBC6B27004BF6C5 /* PostProcessTests.swift */; };\n\t\tCC03144424ACCF99002AB2BE /* NSUserDefaultsCacheLevelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5235BAD61BE175BE0049CFA6 /* NSUserDefaultsCacheLevelTests.swift */; };\n\t\tCC03144524ACCF99002AB2BE /* NormalizationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5250E3831BB137BF00EB7388 /* NormalizationTests.swift */; };\n\t\tCC03144624ACCF99002AB2BE /* TwoWayTransformationBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 523257D11B51993000A10A56 /* TwoWayTransformationBoxTests.swift */; };\n\t\tCC03145924ACCFA0002AB2BE /* Transformers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A4D1B4F0F6F00F187EE /* Transformers.swift */; };\n\t\tCC03145A24ACCFA0002AB2BE /* ConditionedTwoWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5222108A1C501F2100E682D1 /* ConditionedTwoWayTransformer.swift */; };\n\t\tCC03145B24ACCFA0002AB2BE /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A441B4F0F6F00F187EE /* Extensions.swift */; };\n\t\tCC03145C24ACCFA0002AB2BE /* ConditionedValueTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52463F7E1C1837CF0034D032 /* ConditionedValueTransformation.swift */; };\n\t\tCC03145D24ACCFA0002AB2BE /* NetworkFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A481B4F0F6F00F187EE /* NetworkFetcher.swift */; };\n\t\tCC03145E24ACCFA0002AB2BE /* SwitchCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527C65461B7A66D90005023B /* SwitchCache.swift */; };\n\t\tCC03145F24ACCFA0002AB2BE /* MemoryCacheLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A461B4F0F6F00F187EE /* MemoryCacheLevel.swift */; };\n\t\tCC03146024ACCFA0002AB2BE /* Carlos.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A3E1B4F0F6F00F187EE /* Carlos.swift */; };\n\t\tCC03146124ACCFA0002AB2BE /* CacheLevel+Batch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D7DDAC1C54F4E1007E5328 /* CacheLevel+Batch.swift */; };\n\t\tCC03146224ACCFA0002AB2BE /* BasicCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A3C1B4F0F6F00F187EE /* BasicCache.swift */; };\n\t\tCC03146424ACCFA0002AB2BE /* ImageTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC7061D24AC93EA00D16827 /* ImageTransformer.swift */; };\n\t\tCC03146524ACCFA0002AB2BE /* ValueTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A4C1B4F0F6F00F187EE /* ValueTransformation.swift */; };\n\t\tCC03146624ACCFA0002AB2BE /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A451B4F0F6F00F187EE /* Logger.swift */; };\n\t\tCC03146724ACCFA0002AB2BE /* ComposedTwoWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5257BBB31BBFC3FD00787819 /* ComposedTwoWayTransformer.swift */; };\n\t\tCC03146824ACCFA0002AB2BE /* KeyTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339741B52435C00074CB9 /* KeyTransformation.swift */; };\n\t\tCC03146924ACCFA0002AB2BE /* CacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD22FB2C1B70BBF5007F319F /* CacheProvider.swift */; };\n\t\tCC03146A24ACCFA0002AB2BE /* NSUserDefaultsCacheLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5207E6AC1BE15BCE0062DEAC /* NSUserDefaultsCacheLevel.swift */; };\n\t\tCC03146B24ACCFA0002AB2BE /* BatchAllCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DBB4E1CF6307500F9ABE3 /* BatchAllCache.swift */; };\n\t\tCC03146E24ACCFA0002AB2BE /* ComposedOneWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52615CD31BBC8123001DA9BE /* ComposedOneWayTransformer.swift */; };\n\t\tCC03146F24ACCFA0002AB2BE /* StringTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5205729A1BB8716E0098DD09 /* StringTransformer.swift */; };\n\t\tCC03147024ACCFA0002AB2BE /* FetcherValueTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5274A99A1BC05CB0006962E8 /* FetcherValueTransformation.swift */; };\n\t\tCC03147124ACCFA0002AB2BE /* PoolCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A4A1B4F0F6F00F187EE /* PoolCache.swift */; };\n\t\tCC03147224ACCFA0002AB2BE /* PostProcess.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52E0CBF81BBC4E1800F20C22 /* PostProcess.swift */; };\n\t\tCC03147424ACCFA0002AB2BE /* OneWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A491B4F0F6F00F187EE /* OneWayTransformer.swift */; };\n\t\tCC03147524ACCFA0002AB2BE /* ConditionedOutputProcessing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52463F6D1C181D1B0034D032 /* ConditionedOutputProcessing.swift */; };\n\t\tCC03147624ACCFA0002AB2BE /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A431B4F0F6F00F187EE /* Errors.swift */; };\n\t\tCC03147724ACCFA0002AB2BE /* ExpensiveObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5207E6981BE13D2E0062DEAC /* ExpensiveObject.swift */; };\n\t\tCC03147824ACCFA0002AB2BE /* TwoWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A4E1B4F0F6F00F187EE /* TwoWayTransformer.swift */; };\n\t\tCC03147924ACCFA0002AB2BE /* CacheProvider+ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC7061C24AC93EA00D16827 /* CacheProvider+ImageCache.swift */; };\n\t\tCC03147A24ACCFA0002AB2BE /* DiskCacheLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A421B4F0F6F00F187EE /* DiskCacheLevel.swift */; };\n\t\tCC03147B24ACCFA0002AB2BE /* MemoryWarning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A471B4F0F6F00F187EE /* MemoryWarning.swift */; };\n\t\tCC03147C24ACCFA0002AB2BE /* Composed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A3F1B4F0F6F00F187EE /* Composed.swift */; };\n\t\tCC03147D24ACCFA0002AB2BE /* Conditioned.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A401B4F0F6F00F187EE /* Conditioned.swift */; };\n\t\tCC03147E24ACCFA0002AB2BE /* JSONTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52B7621B1BB84F160087CD91 /* JSONTransformer.swift */; };\n\t\tCC03147F24ACCFA0002AB2BE /* StringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5243C4B21B77670F00737B3B /* StringConvertible.swift */; };\n\t\tCC03148024ACCFA0002AB2BE /* BasicFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5274A99F1BC0613C006962E8 /* BasicFetcher.swift */; };\n\t\tCC03148124ACCFA0002AB2BE /* Normalize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5250E37F1BB1345700EB7388 /* Normalize.swift */; };\n\t\tCC03148224ACCFA0002AB2BE /* ConditionedOneWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5222107B1C501C5400E682D1 /* ConditionedOneWayTransformer.swift */; };\n\t\tCC0314C924ACCFAC002AB2BE /* ImageTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526005AE1BB84AB200D96242 /* ImageTransformerTests.swift */; };\n\t\tCC0314CA24ACCFAC002AB2BE /* MemoryWarningNotificationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339801B52805000074CB9 /* MemoryWarningNotificationTests.swift */; };\n\t\tCC0314CB24ACCFAC002AB2BE /* StringConvertibleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5243C4BE1B77686300737B3B /* StringConvertibleTests.swift */; };\n\t\tCC0314CC24ACCFAC002AB2BE /* DiskCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339881B52B51C00074CB9 /* DiskCacheTests.swift */; };\n\t\tCC0314CD24ACCFAC002AB2BE /* ConditionedTwoWayTransformationBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D5F3471C503C6700BA3452 /* ConditionedTwoWayTransformationBoxTests.swift */; };\n\t\tCC0314CE24ACCFAC002AB2BE /* MKDistanceFormatterTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52F064541B51B26200145C98 /* MKDistanceFormatterTransformerTests.swift */; };\n\t\tCC0314CF24ACCFAC002AB2BE /* StringTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520572A81BB8752B0098DD09 /* StringTransformerTests.swift */; };\n\t\tCC0314D024ACCFAC002AB2BE /* ConditionedOutputProcessingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52463F7C1C18264B0034D032 /* ConditionedOutputProcessingTests.swift */; };\n\t\tCC0314D224ACCFAC002AB2BE /* OneWayTransformerCompositionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52615CE11BBC87F4001DA9BE /* OneWayTransformerCompositionTests.swift */; };\n\t\tCC0314D324ACCFAC002AB2BE /* JSONTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5291C8521BB7FAA800C4E15E /* JSONTransformerTests.swift */; };\n\t\tCC0314D424ACCFAC002AB2BE /* OneWayTransformationBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 523257D31B519AB900A10A56 /* OneWayTransformationBoxTests.swift */; };\n\t\tCC0314D524ACCFAC002AB2BE /* ConditionedOneWayTransformationBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5222108F1C50358700E682D1 /* ConditionedOneWayTransformationBoxTests.swift */; };\n\t\tCC0314D624ACCFAC002AB2BE /* SwitchCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527C65521B7A89440005023B /* SwitchCacheTests.swift */; };\n\t\tCC0314D824ACCFAC002AB2BE /* CacheLevelFake.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52BBFD551B51BA140000084A /* CacheLevelFake.swift */; };\n\t\tCC0314DA24ACCFAC002AB2BE /* BatchTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D7DDBB1C552854007E5328 /* BatchTests.swift */; };\n\t\tCC0314DB24ACCFAC002AB2BE /* NSDateFormatterTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52F0644E1B51AC0D00145C98 /* NSDateFormatterTransformerTests.swift */; };\n\t\tCC0314DC24ACCFAC002AB2BE /* FetcherValueTransformationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5274A9D81BC069E7006962E8 /* FetcherValueTransformationTests.swift */; };\n\t\tCC0314DD24ACCFAC002AB2BE /* Base64EncodedImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC0313DF24ACBBC8002AB2BE /* Base64EncodedImage.swift */; };\n\t\tCC0314DE24ACCFAC002AB2BE /* BasicCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339821B52866900074CB9 /* BasicCacheTests.swift */; };\n\t\tCC0314DF24ACCFAC002AB2BE /* ValueTransformationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5263397E1B52760F00074CB9 /* ValueTransformationTests.swift */; };\n\t\tCC0314E024ACCFAC002AB2BE /* TwoWayTransformerCompositionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5257BBC11BBFC7A800787819 /* TwoWayTransformerCompositionTests.swift */; };\n\t\tCC0314E124ACCFAC002AB2BE /* CacheProviderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 524019BB1C0AF9ED00749957 /* CacheProviderTests.swift */; };\n\t\tCC0314E224ACCFAC002AB2BE /* MemoryCacheLevelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5263397C1B525D1600074CB9 /* MemoryCacheLevelTests.swift */; };\n\t\tCC0314E324ACCFAC002AB2BE /* KeyTransformationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5263397A1B52536700074CB9 /* KeyTransformationTests.swift */; };\n\t\tCC0314E424ACCFAC002AB2BE /* ConditionedTransformersTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526078241BE2590E0022040B /* ConditionedTransformersTests.swift */; };\n\t\tCC0314E524ACCFAC002AB2BE /* CompositionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339841B52A82800074CB9 /* CompositionTests.swift */; };\n\t\tCC0314E624ACCFAC002AB2BE /* PoolCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52BBFD571B51BAD20000084A /* PoolCacheTests.swift */; };\n\t\tCC0314E724ACCFAC002AB2BE /* ConditionedCacheTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339761B52450C00074CB9 /* ConditionedCacheTests.swift */; };\n\t\tCC0314E824ACCFAC002AB2BE /* NSNumberFormatterTransformerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52F064501B51AE4300145C98 /* NSNumberFormatterTransformerTests.swift */; };\n\t\tCC0314E924ACCFAC002AB2BE /* NetworkFetcherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C71C59731B6A721C00AE5294 /* NetworkFetcherTests.swift */; };\n\t\tCC0314EA24ACCFAC002AB2BE /* BasicFetcherTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5274A9CC1BC06976006962E8 /* BasicFetcherTests.swift */; };\n\t\tCC0314EB24ACCFAC002AB2BE /* ConditionedValueTransformationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D5F3531C52C32000BA3452 /* ConditionedValueTransformationTests.swift */; };\n\t\tCC0314EC24ACCFAC002AB2BE /* PostProcessTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52E197011BBC6B27004BF6C5 /* PostProcessTests.swift */; };\n\t\tCC0314ED24ACCFAC002AB2BE /* NSUserDefaultsCacheLevelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5235BAD61BE175BE0049CFA6 /* NSUserDefaultsCacheLevelTests.swift */; };\n\t\tCC0314EE24ACCFAC002AB2BE /* NormalizationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5250E3831BB137BF00EB7388 /* NormalizationTests.swift */; };\n\t\tCC0314EF24ACCFAC002AB2BE /* TwoWayTransformationBoxTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 523257D11B51993000A10A56 /* TwoWayTransformationBoxTests.swift */; };\n\t\tCC03150224ACCFB1002AB2BE /* Transformers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A4D1B4F0F6F00F187EE /* Transformers.swift */; };\n\t\tCC03150324ACCFB1002AB2BE /* ConditionedTwoWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5222108A1C501F2100E682D1 /* ConditionedTwoWayTransformer.swift */; };\n\t\tCC03150424ACCFB1002AB2BE /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A441B4F0F6F00F187EE /* Extensions.swift */; };\n\t\tCC03150524ACCFB1002AB2BE /* ConditionedValueTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52463F7E1C1837CF0034D032 /* ConditionedValueTransformation.swift */; };\n\t\tCC03150624ACCFB1002AB2BE /* NetworkFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A481B4F0F6F00F187EE /* NetworkFetcher.swift */; };\n\t\tCC03150724ACCFB1002AB2BE /* SwitchCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 527C65461B7A66D90005023B /* SwitchCache.swift */; };\n\t\tCC03150824ACCFB1002AB2BE /* MemoryCacheLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A461B4F0F6F00F187EE /* MemoryCacheLevel.swift */; };\n\t\tCC03150924ACCFB1002AB2BE /* Carlos.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A3E1B4F0F6F00F187EE /* Carlos.swift */; };\n\t\tCC03150A24ACCFB1002AB2BE /* CacheLevel+Batch.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52D7DDAC1C54F4E1007E5328 /* CacheLevel+Batch.swift */; };\n\t\tCC03150B24ACCFB1002AB2BE /* BasicCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A3C1B4F0F6F00F187EE /* BasicCache.swift */; };\n\t\tCC03150D24ACCFB1002AB2BE /* ImageTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC7061D24AC93EA00D16827 /* ImageTransformer.swift */; };\n\t\tCC03150E24ACCFB1002AB2BE /* ValueTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A4C1B4F0F6F00F187EE /* ValueTransformation.swift */; };\n\t\tCC03150F24ACCFB1002AB2BE /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A451B4F0F6F00F187EE /* Logger.swift */; };\n\t\tCC03151024ACCFB1002AB2BE /* ComposedTwoWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5257BBB31BBFC3FD00787819 /* ComposedTwoWayTransformer.swift */; };\n\t\tCC03151124ACCFB1002AB2BE /* KeyTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 526339741B52435C00074CB9 /* KeyTransformation.swift */; };\n\t\tCC03151224ACCFB1002AB2BE /* CacheProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD22FB2C1B70BBF5007F319F /* CacheProvider.swift */; };\n\t\tCC03151324ACCFB1002AB2BE /* NSUserDefaultsCacheLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5207E6AC1BE15BCE0062DEAC /* NSUserDefaultsCacheLevel.swift */; };\n\t\tCC03151424ACCFB1002AB2BE /* BatchAllCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520DBB4E1CF6307500F9ABE3 /* BatchAllCache.swift */; };\n\t\tCC03151724ACCFB1002AB2BE /* ComposedOneWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52615CD31BBC8123001DA9BE /* ComposedOneWayTransformer.swift */; };\n\t\tCC03151824ACCFB1002AB2BE /* StringTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5205729A1BB8716E0098DD09 /* StringTransformer.swift */; };\n\t\tCC03151924ACCFB1002AB2BE /* FetcherValueTransformation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5274A99A1BC05CB0006962E8 /* FetcherValueTransformation.swift */; };\n\t\tCC03151A24ACCFB1002AB2BE /* PoolCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A4A1B4F0F6F00F187EE /* PoolCache.swift */; };\n\t\tCC03151B24ACCFB1002AB2BE /* PostProcess.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52E0CBF81BBC4E1800F20C22 /* PostProcess.swift */; };\n\t\tCC03151D24ACCFB1002AB2BE /* OneWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A491B4F0F6F00F187EE /* OneWayTransformer.swift */; };\n\t\tCC03151E24ACCFB1002AB2BE /* ConditionedOutputProcessing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52463F6D1C181D1B0034D032 /* ConditionedOutputProcessing.swift */; };\n\t\tCC03151F24ACCFB1002AB2BE /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A431B4F0F6F00F187EE /* Errors.swift */; };\n\t\tCC03152024ACCFB1002AB2BE /* ExpensiveObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5207E6981BE13D2E0062DEAC /* ExpensiveObject.swift */; };\n\t\tCC03152124ACCFB1002AB2BE /* TwoWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A4E1B4F0F6F00F187EE /* TwoWayTransformer.swift */; };\n\t\tCC03152224ACCFB1002AB2BE /* CacheProvider+ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC7061C24AC93EA00D16827 /* CacheProvider+ImageCache.swift */; };\n\t\tCC03152324ACCFB1002AB2BE /* DiskCacheLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A421B4F0F6F00F187EE /* DiskCacheLevel.swift */; };\n\t\tCC03152424ACCFB1002AB2BE /* MemoryWarning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A471B4F0F6F00F187EE /* MemoryWarning.swift */; };\n\t\tCC03152524ACCFB1002AB2BE /* Composed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A3F1B4F0F6F00F187EE /* Composed.swift */; };\n\t\tCC03152624ACCFB1002AB2BE /* Conditioned.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52635A401B4F0F6F00F187EE /* Conditioned.swift */; };\n\t\tCC03152724ACCFB1002AB2BE /* JSONTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52B7621B1BB84F160087CD91 /* JSONTransformer.swift */; };\n\t\tCC03152824ACCFB1002AB2BE /* StringConvertible.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5243C4B21B77670F00737B3B /* StringConvertible.swift */; };\n\t\tCC03152924ACCFB1002AB2BE /* BasicFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5274A99F1BC0613C006962E8 /* BasicFetcher.swift */; };\n\t\tCC03152A24ACCFB1002AB2BE /* Normalize.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5250E37F1BB1345700EB7388 /* Normalize.swift */; };\n\t\tCC03152B24ACCFB1002AB2BE /* ConditionedOneWayTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5222107B1C501C5400E682D1 /* ConditionedOneWayTransformer.swift */; };\n\t\tCC5C369224EC164D004AD171 /* FunctionComposition.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5C369024EC164C004AD171 /* FunctionComposition.swift */; };\n\t\tCC5C369324EC164D004AD171 /* FunctionComposition.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5C369024EC164C004AD171 /* FunctionComposition.swift */; };\n\t\tCC5C369424EC164D004AD171 /* FunctionComposition.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5C369024EC164C004AD171 /* FunctionComposition.swift */; };\n\t\tCC5C369524EC164D004AD171 /* FunctionComposition.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5C369024EC164C004AD171 /* FunctionComposition.swift */; };\n\t\tCC5C369624EC164D004AD171 /* UnfairLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5C369124EC164D004AD171 /* UnfairLock.swift */; };\n\t\tCC5C369724EC164D004AD171 /* UnfairLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5C369124EC164D004AD171 /* UnfairLock.swift */; };\n\t\tCC5C369824EC164D004AD171 /* UnfairLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5C369124EC164D004AD171 /* UnfairLock.swift */; };\n\t\tCC5C369924EC164D004AD171 /* UnfairLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5C369124EC164D004AD171 /* UnfairLock.swift */; };\n\t\tCC5C36A124EC16BB004AD171 /* Quick in Frameworks */ = {isa = PBXBuildFile; productRef = CC5C36A024EC16BB004AD171 /* Quick */; };\n\t\tCC5C36A324EC16BF004AD171 /* Nimble in Frameworks */ = {isa = PBXBuildFile; productRef = CC5C36A224EC16BF004AD171 /* Nimble */; };\n\t\tCC5C36A524EC16C6004AD171 /* Quick in Frameworks */ = {isa = PBXBuildFile; productRef = CC5C36A424EC16C6004AD171 /* Quick */; };\n\t\tCC5C36A724EC16C9004AD171 /* Nimble in Frameworks */ = {isa = PBXBuildFile; productRef = CC5C36A624EC16C9004AD171 /* Nimble */; };\n\t\tCC5C36AF24EC16D3004AD171 /* Quick in Frameworks */ = {isa = PBXBuildFile; productRef = CC5C36AE24EC16D3004AD171 /* Quick */; };\n\t\tCC5C36B124EC16D3004AD171 /* Nimble in Frameworks */ = {isa = PBXBuildFile; productRef = CC5C36B024EC16D3004AD171 /* Nimble */; };\n\t\tCC5C36BD24EC1725004AD171 /* FetcherFake.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5C36B824EC1717004AD171 /* FetcherFake.swift */; };\n\t\tCC5C36BE24EC1726004AD171 /* FetcherFake.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5C36B824EC1717004AD171 /* FetcherFake.swift */; };\n\t\tCC5C36BF24EC1727004AD171 /* FetcherFake.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC5C36B824EC1717004AD171 /* FetcherFake.swift */; };\n\t\tCCC7061E24AC93EA00D16827 /* CacheProvider+ImageCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC7061C24AC93EA00D16827 /* CacheProvider+ImageCache.swift */; };\n\t\tCCC7062224AC93EA00D16827 /* ImageTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC7061D24AC93EA00D16827 /* ImageTransformer.swift */; };\n\t\tCCC88F7624ADD4F2008C4060 /* Carlos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC03141924ACCF94002AB2BE /* Carlos.framework */; };\n\t\tCCC88F8424ADD56C008C4060 /* Carlos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CC03148B24ACCFA0002AB2BE /* Carlos.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t52635A6D1B4F110500F187EE /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = AD695CD71B46CD65004E998D /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 52635A1C1B4F0F3D00F187EE;\n\t\t\tremoteInfo = Carlos;\n\t\t};\n\t\tCC0315A824ACCFFD002AB2BE /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = AD695CD71B46CD65004E998D /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = CC0313E424ACCF94002AB2BE;\n\t\t\tremoteInfo = \"Carlos macOS\";\n\t\t};\n\t\tCC0315B624ACD0A1002AB2BE /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = AD695CD71B46CD65004E998D /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = CC03145624ACCFA0002AB2BE;\n\t\t\tremoteInfo = \"Carlos tvOS\";\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t52BED3511CE87C3C002C045A /* Copy Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 12;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Copy Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC03144D24ACCF99002AB2BE /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC0314F624ACCFAC002AB2BE /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCCC88F7524ADD4E0008C4060 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCCC88F8324ADD564008C4060 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCCC88F9124ADD5A1008C4060 /* Embed Frameworks */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 10;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tname = \"Embed Frameworks\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t5205729A1BB8716E0098DD09 /* StringTransformer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringTransformer.swift; sourceTree = \"<group>\"; };\n\t\t520572A81BB8752B0098DD09 /* StringTransformerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringTransformerTests.swift; sourceTree = \"<group>\"; };\n\t\t5207E6981BE13D2E0062DEAC /* ExpensiveObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExpensiveObject.swift; sourceTree = \"<group>\"; };\n\t\t5207E6AC1BE15BCE0062DEAC /* NSUserDefaultsCacheLevel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSUserDefaultsCacheLevel.swift; sourceTree = \"<group>\"; };\n\t\t520DBB4E1CF6307500F9ABE3 /* BatchAllCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BatchAllCache.swift; sourceTree = \"<group>\"; };\n\t\t5222107B1C501C5400E682D1 /* ConditionedOneWayTransformer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConditionedOneWayTransformer.swift; sourceTree = \"<group>\"; };\n\t\t5222108A1C501F2100E682D1 /* ConditionedTwoWayTransformer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConditionedTwoWayTransformer.swift; sourceTree = \"<group>\"; };\n\t\t5222108F1C50358700E682D1 /* ConditionedOneWayTransformationBoxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConditionedOneWayTransformationBoxTests.swift; sourceTree = \"<group>\"; };\n\t\t523257D11B51993000A10A56 /* TwoWayTransformationBoxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwoWayTransformationBoxTests.swift; sourceTree = \"<group>\"; };\n\t\t523257D31B519AB900A10A56 /* OneWayTransformationBoxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OneWayTransformationBoxTests.swift; sourceTree = \"<group>\"; };\n\t\t5235BAD61BE175BE0049CFA6 /* NSUserDefaultsCacheLevelTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSUserDefaultsCacheLevelTests.swift; sourceTree = \"<group>\"; };\n\t\t524019BB1C0AF9ED00749957 /* CacheProviderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CacheProviderTests.swift; sourceTree = \"<group>\"; };\n\t\t5243C4B21B77670F00737B3B /* StringConvertible.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringConvertible.swift; sourceTree = \"<group>\"; };\n\t\t5243C4BE1B77686300737B3B /* StringConvertibleTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringConvertibleTests.swift; sourceTree = \"<group>\"; };\n\t\t52463F6D1C181D1B0034D032 /* ConditionedOutputProcessing.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConditionedOutputProcessing.swift; sourceTree = \"<group>\"; };\n\t\t52463F7C1C18264B0034D032 /* ConditionedOutputProcessingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConditionedOutputProcessingTests.swift; sourceTree = \"<group>\"; };\n\t\t52463F7E1C1837CF0034D032 /* ConditionedValueTransformation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConditionedValueTransformation.swift; sourceTree = \"<group>\"; };\n\t\t5250E37F1BB1345700EB7388 /* Normalize.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Normalize.swift; sourceTree = \"<group>\"; };\n\t\t5250E3831BB137BF00EB7388 /* NormalizationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NormalizationTests.swift; sourceTree = \"<group>\"; };\n\t\t5257BBB31BBFC3FD00787819 /* ComposedTwoWayTransformer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ComposedTwoWayTransformer.swift; sourceTree = \"<group>\"; };\n\t\t5257BBC11BBFC7A800787819 /* TwoWayTransformerCompositionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwoWayTransformerCompositionTests.swift; sourceTree = \"<group>\"; };\n\t\t526005AE1BB84AB200D96242 /* ImageTransformerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageTransformerTests.swift; sourceTree = \"<group>\"; };\n\t\t526005BA1BB84BBC00D96242 /* swift-og.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = \"swift-og.png\"; sourceTree = \"<group>\"; };\n\t\t526078241BE2590E0022040B /* ConditionedTransformersTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConditionedTransformersTests.swift; sourceTree = \"<group>\"; };\n\t\t52615CD31BBC8123001DA9BE /* ComposedOneWayTransformer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ComposedOneWayTransformer.swift; sourceTree = \"<group>\"; };\n\t\t52615CE11BBC87F4001DA9BE /* OneWayTransformerCompositionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OneWayTransformerCompositionTests.swift; sourceTree = \"<group>\"; };\n\t\t526339741B52435C00074CB9 /* KeyTransformation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyTransformation.swift; sourceTree = \"<group>\"; };\n\t\t526339761B52450C00074CB9 /* ConditionedCacheTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConditionedCacheTests.swift; sourceTree = \"<group>\"; };\n\t\t5263397A1B52536700074CB9 /* KeyTransformationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyTransformationTests.swift; sourceTree = \"<group>\"; };\n\t\t5263397C1B525D1600074CB9 /* MemoryCacheLevelTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MemoryCacheLevelTests.swift; sourceTree = \"<group>\"; };\n\t\t5263397E1B52760F00074CB9 /* ValueTransformationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValueTransformationTests.swift; sourceTree = \"<group>\"; };\n\t\t526339801B52805000074CB9 /* MemoryWarningNotificationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MemoryWarningNotificationTests.swift; sourceTree = \"<group>\"; };\n\t\t526339821B52866900074CB9 /* BasicCacheTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BasicCacheTests.swift; sourceTree = \"<group>\"; };\n\t\t526339841B52A82800074CB9 /* CompositionTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CompositionTests.swift; sourceTree = \"<group>\"; };\n\t\t526339881B52B51C00074CB9 /* DiskCacheTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiskCacheTests.swift; sourceTree = \"<group>\"; };\n\t\t52635A1D1B4F0F3D00F187EE /* Carlos.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Carlos.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t52635A201B4F0F3D00F187EE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t52635A3C1B4F0F6F00F187EE /* BasicCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BasicCache.swift; sourceTree = \"<group>\"; };\n\t\t52635A3E1B4F0F6F00F187EE /* Carlos.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Carlos.swift; sourceTree = \"<group>\"; };\n\t\t52635A3F1B4F0F6F00F187EE /* Composed.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Composed.swift; sourceTree = \"<group>\"; };\n\t\t52635A401B4F0F6F00F187EE /* Conditioned.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Conditioned.swift; sourceTree = \"<group>\"; };\n\t\t52635A421B4F0F6F00F187EE /* DiskCacheLevel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DiskCacheLevel.swift; sourceTree = \"<group>\"; };\n\t\t52635A431B4F0F6F00F187EE /* Errors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Errors.swift; sourceTree = \"<group>\"; };\n\t\t52635A441B4F0F6F00F187EE /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = \"<group>\"; };\n\t\t52635A451B4F0F6F00F187EE /* Logger.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = \"<group>\"; };\n\t\t52635A461B4F0F6F00F187EE /* MemoryCacheLevel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MemoryCacheLevel.swift; sourceTree = \"<group>\"; };\n\t\t52635A471B4F0F6F00F187EE /* MemoryWarning.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MemoryWarning.swift; sourceTree = \"<group>\"; };\n\t\t52635A481B4F0F6F00F187EE /* NetworkFetcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkFetcher.swift; sourceTree = \"<group>\"; };\n\t\t52635A491B4F0F6F00F187EE /* OneWayTransformer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OneWayTransformer.swift; sourceTree = \"<group>\"; };\n\t\t52635A4A1B4F0F6F00F187EE /* PoolCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PoolCache.swift; sourceTree = \"<group>\"; };\n\t\t52635A4C1B4F0F6F00F187EE /* ValueTransformation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValueTransformation.swift; sourceTree = \"<group>\"; };\n\t\t52635A4D1B4F0F6F00F187EE /* Transformers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Transformers.swift; sourceTree = \"<group>\"; };\n\t\t52635A4E1B4F0F6F00F187EE /* TwoWayTransformer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TwoWayTransformer.swift; sourceTree = \"<group>\"; };\n\t\t52635A661B4F110500F187EE /* Carlos iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = \"Carlos iOS Tests.xctest\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t52635A691B4F110500F187EE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t5274A99A1BC05CB0006962E8 /* FetcherValueTransformation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetcherValueTransformation.swift; sourceTree = \"<group>\"; };\n\t\t5274A99F1BC0613C006962E8 /* BasicFetcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BasicFetcher.swift; sourceTree = \"<group>\"; };\n\t\t5274A9CC1BC06976006962E8 /* BasicFetcherTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BasicFetcherTests.swift; sourceTree = \"<group>\"; };\n\t\t5274A9D81BC069E7006962E8 /* FetcherValueTransformationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetcherValueTransformationTests.swift; sourceTree = \"<group>\"; };\n\t\t527C65461B7A66D90005023B /* SwitchCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwitchCache.swift; sourceTree = \"<group>\"; };\n\t\t527C65521B7A89440005023B /* SwitchCacheTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwitchCacheTests.swift; sourceTree = \"<group>\"; };\n\t\t5291C8521BB7FAA800C4E15E /* JSONTransformerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSONTransformerTests.swift; sourceTree = \"<group>\"; };\n\t\t52B7621B1BB84F160087CD91 /* JSONTransformer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSONTransformer.swift; sourceTree = \"<group>\"; };\n\t\t52BBFD551B51BA140000084A /* CacheLevelFake.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CacheLevelFake.swift; sourceTree = \"<group>\"; };\n\t\t52BBFD571B51BAD20000084A /* PoolCacheTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PoolCacheTests.swift; sourceTree = \"<group>\"; };\n\t\t52D5F3471C503C6700BA3452 /* ConditionedTwoWayTransformationBoxTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConditionedTwoWayTransformationBoxTests.swift; sourceTree = \"<group>\"; };\n\t\t52D5F3531C52C32000BA3452 /* ConditionedValueTransformationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConditionedValueTransformationTests.swift; sourceTree = \"<group>\"; };\n\t\t52D7DDAC1C54F4E1007E5328 /* CacheLevel+Batch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"CacheLevel+Batch.swift\"; sourceTree = \"<group>\"; };\n\t\t52D7DDBB1C552854007E5328 /* BatchTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BatchTests.swift; sourceTree = \"<group>\"; };\n\t\t52E0CBF81BBC4E1800F20C22 /* PostProcess.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostProcess.swift; sourceTree = \"<group>\"; };\n\t\t52E197011BBC6B27004BF6C5 /* PostProcessTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PostProcessTests.swift; sourceTree = \"<group>\"; };\n\t\t52F0644E1B51AC0D00145C98 /* NSDateFormatterTransformerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSDateFormatterTransformerTests.swift; sourceTree = \"<group>\"; };\n\t\t52F064501B51AE4300145C98 /* NSNumberFormatterTransformerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSNumberFormatterTransformerTests.swift; sourceTree = \"<group>\"; };\n\t\t52F064541B51B26200145C98 /* MKDistanceFormatterTransformerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MKDistanceFormatterTransformerTests.swift; sourceTree = \"<group>\"; };\n\t\tAD22FB2C1B70BBF5007F319F /* CacheProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CacheProvider.swift; sourceTree = \"<group>\"; };\n\t\tC71C59731B6A721C00AE5294 /* NetworkFetcherTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NetworkFetcherTests.swift; sourceTree = \"<group>\"; };\n\t\tCC0313DF24ACBBC8002AB2BE /* Base64EncodedImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Base64EncodedImage.swift; sourceTree = \"<group>\"; };\n\t\tCC0313E024ACBBC8002AB2BE /* CacheLevelFake.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CacheLevelFake.swift; sourceTree = \"<group>\"; };\n\t\tCC03141924ACCF94002AB2BE /* Carlos.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Carlos.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tCC03145424ACCF99002AB2BE /* Carlos macOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = \"Carlos macOS Tests.xctest\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tCC03148B24ACCFA0002AB2BE /* Carlos.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Carlos.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tCC0314FD24ACCFAC002AB2BE /* Carlos tvOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = \"Carlos tvOS Tests.xctest\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tCC03153424ACCFB1002AB2BE /* Carlos.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Carlos.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tCC5C369024EC164C004AD171 /* FunctionComposition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FunctionComposition.swift; sourceTree = \"<group>\"; };\n\t\tCC5C369124EC164D004AD171 /* UnfairLock.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UnfairLock.swift; sourceTree = \"<group>\"; };\n\t\tCC5C36B824EC1717004AD171 /* FetcherFake.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FetcherFake.swift; sourceTree = \"<group>\"; };\n\t\tCCC7061C24AC93EA00D16827 /* CacheProvider+ImageCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"CacheProvider+ImageCache.swift\"; sourceTree = \"<group>\"; };\n\t\tCCC7061D24AC93EA00D16827 /* ImageTransformer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageTransformer.swift; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t52635A191B4F0F3D00F187EE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t52635A631B4F110500F187EE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCC5C36A324EC16BF004AD171 /* Nimble in Frameworks */,\n\t\t\t\tCC5C36A124EC16BB004AD171 /* Quick in Frameworks */,\n\t\t\t\t52BED3501CE87C38002C045A /* Carlos.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC03141124ACCF94002AB2BE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC03144724ACCF99002AB2BE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCC5C36A724EC16C9004AD171 /* Nimble in Frameworks */,\n\t\t\t\tCC5C36A524EC16C6004AD171 /* Quick in Frameworks */,\n\t\t\t\tCCC88F7624ADD4F2008C4060 /* Carlos.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC03148324ACCFA0002AB2BE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC0314F024ACCFAC002AB2BE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCC5C36B124EC16D3004AD171 /* Nimble in Frameworks */,\n\t\t\t\tCC5C36AF24EC16D3004AD171 /* Quick in Frameworks */,\n\t\t\t\tCCC88F8424ADD56C008C4060 /* Carlos.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC03152C24ACCFB1002AB2BE /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t2677A0397774353D4B14F63F /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t52635A1E1B4F0F3D00F187EE /* Carlos */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCCC7061C24AC93EA00D16827 /* CacheProvider+ImageCache.swift */,\n\t\t\t\tCCC7061D24AC93EA00D16827 /* ImageTransformer.swift */,\n\t\t\t\t520DBB4E1CF6307500F9ABE3 /* BatchAllCache.swift */,\n\t\t\t\t52635A1F1B4F0F3D00F187EE /* Supporting Files */,\n\t\t\t\t52635A3C1B4F0F6F00F187EE /* BasicCache.swift */,\n\t\t\t\t52635A3E1B4F0F6F00F187EE /* Carlos.swift */,\n\t\t\t\t52635A3F1B4F0F6F00F187EE /* Composed.swift */,\n\t\t\t\t52635A401B4F0F6F00F187EE /* Conditioned.swift */,\n\t\t\t\t52635A421B4F0F6F00F187EE /* DiskCacheLevel.swift */,\n\t\t\t\t52635A431B4F0F6F00F187EE /* Errors.swift */,\n\t\t\t\t52635A441B4F0F6F00F187EE /* Extensions.swift */,\n\t\t\t\t52635A451B4F0F6F00F187EE /* Logger.swift */,\n\t\t\t\t52635A461B4F0F6F00F187EE /* MemoryCacheLevel.swift */,\n\t\t\t\t52635A471B4F0F6F00F187EE /* MemoryWarning.swift */,\n\t\t\t\t52635A481B4F0F6F00F187EE /* NetworkFetcher.swift */,\n\t\t\t\t52635A491B4F0F6F00F187EE /* OneWayTransformer.swift */,\n\t\t\t\t52635A4A1B4F0F6F00F187EE /* PoolCache.swift */,\n\t\t\t\t52635A4C1B4F0F6F00F187EE /* ValueTransformation.swift */,\n\t\t\t\t5274A99A1BC05CB0006962E8 /* FetcherValueTransformation.swift */,\n\t\t\t\tCC5C369024EC164C004AD171 /* FunctionComposition.swift */,\n\t\t\t\tCC5C369124EC164D004AD171 /* UnfairLock.swift */,\n\t\t\t\t52635A4D1B4F0F6F00F187EE /* Transformers.swift */,\n\t\t\t\t52635A4E1B4F0F6F00F187EE /* TwoWayTransformer.swift */,\n\t\t\t\t526339741B52435C00074CB9 /* KeyTransformation.swift */,\n\t\t\t\tAD22FB2C1B70BBF5007F319F /* CacheProvider.swift */,\n\t\t\t\t5243C4B21B77670F00737B3B /* StringConvertible.swift */,\n\t\t\t\t527C65461B7A66D90005023B /* SwitchCache.swift */,\n\t\t\t\t5250E37F1BB1345700EB7388 /* Normalize.swift */,\n\t\t\t\t52B7621B1BB84F160087CD91 /* JSONTransformer.swift */,\n\t\t\t\t5205729A1BB8716E0098DD09 /* StringTransformer.swift */,\n\t\t\t\t52E0CBF81BBC4E1800F20C22 /* PostProcess.swift */,\n\t\t\t\t52615CD31BBC8123001DA9BE /* ComposedOneWayTransformer.swift */,\n\t\t\t\t5257BBB31BBFC3FD00787819 /* ComposedTwoWayTransformer.swift */,\n\t\t\t\t5274A99F1BC0613C006962E8 /* BasicFetcher.swift */,\n\t\t\t\t5207E6981BE13D2E0062DEAC /* ExpensiveObject.swift */,\n\t\t\t\t5207E6AC1BE15BCE0062DEAC /* NSUserDefaultsCacheLevel.swift */,\n\t\t\t\t52463F6D1C181D1B0034D032 /* ConditionedOutputProcessing.swift */,\n\t\t\t\t52463F7E1C1837CF0034D032 /* ConditionedValueTransformation.swift */,\n\t\t\t\t5222107B1C501C5400E682D1 /* ConditionedOneWayTransformer.swift */,\n\t\t\t\t5222108A1C501F2100E682D1 /* ConditionedTwoWayTransformer.swift */,\n\t\t\t\t52D7DDAC1C54F4E1007E5328 /* CacheLevel+Batch.swift */,\n\t\t\t);\n\t\t\tname = Carlos;\n\t\t\tpath = Sources/Carlos;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\t52635A1F1B4F0F3D00F187EE /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t52635A201B4F0F3D00F187EE /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t52635A671B4F110500F187EE /* CarlosTests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCC0313DE24ACBBC8002AB2BE /* Fakes */,\n\t\t\t\t52635A681B4F110500F187EE /* Supporting Files */,\n\t\t\t\t523257D11B51993000A10A56 /* TwoWayTransformationBoxTests.swift */,\n\t\t\t\t523257D31B519AB900A10A56 /* OneWayTransformationBoxTests.swift */,\n\t\t\t\t52F0644E1B51AC0D00145C98 /* NSDateFormatterTransformerTests.swift */,\n\t\t\t\t52F064501B51AE4300145C98 /* NSNumberFormatterTransformerTests.swift */,\n\t\t\t\t52F064541B51B26200145C98 /* MKDistanceFormatterTransformerTests.swift */,\n\t\t\t\tC71C59731B6A721C00AE5294 /* NetworkFetcherTests.swift */,\n\t\t\t\t52BBFD571B51BAD20000084A /* PoolCacheTests.swift */,\n\t\t\t\t526339761B52450C00074CB9 /* ConditionedCacheTests.swift */,\n\t\t\t\t5263397A1B52536700074CB9 /* KeyTransformationTests.swift */,\n\t\t\t\t5263397C1B525D1600074CB9 /* MemoryCacheLevelTests.swift */,\n\t\t\t\t5263397E1B52760F00074CB9 /* ValueTransformationTests.swift */,\n\t\t\t\t526339801B52805000074CB9 /* MemoryWarningNotificationTests.swift */,\n\t\t\t\t526339821B52866900074CB9 /* BasicCacheTests.swift */,\n\t\t\t\t526339841B52A82800074CB9 /* CompositionTests.swift */,\n\t\t\t\t526339881B52B51C00074CB9 /* DiskCacheTests.swift */,\n\t\t\t\t5243C4BE1B77686300737B3B /* StringConvertibleTests.swift */,\n\t\t\t\t527C65521B7A89440005023B /* SwitchCacheTests.swift */,\n\t\t\t\t5250E3831BB137BF00EB7388 /* NormalizationTests.swift */,\n\t\t\t\t5291C8521BB7FAA800C4E15E /* JSONTransformerTests.swift */,\n\t\t\t\t526005AE1BB84AB200D96242 /* ImageTransformerTests.swift */,\n\t\t\t\t520572A81BB8752B0098DD09 /* StringTransformerTests.swift */,\n\t\t\t\t52E197011BBC6B27004BF6C5 /* PostProcessTests.swift */,\n\t\t\t\t52615CE11BBC87F4001DA9BE /* OneWayTransformerCompositionTests.swift */,\n\t\t\t\t5257BBC11BBFC7A800787819 /* TwoWayTransformerCompositionTests.swift */,\n\t\t\t\t5274A9CC1BC06976006962E8 /* BasicFetcherTests.swift */,\n\t\t\t\t5274A9D81BC069E7006962E8 /* FetcherValueTransformationTests.swift */,\n\t\t\t\t5235BAD61BE175BE0049CFA6 /* NSUserDefaultsCacheLevelTests.swift */,\n\t\t\t\t526078241BE2590E0022040B /* ConditionedTransformersTests.swift */,\n\t\t\t\t524019BB1C0AF9ED00749957 /* CacheProviderTests.swift */,\n\t\t\t\t52463F7C1C18264B0034D032 /* ConditionedOutputProcessingTests.swift */,\n\t\t\t\t5222108F1C50358700E682D1 /* ConditionedOneWayTransformationBoxTests.swift */,\n\t\t\t\t52D5F3471C503C6700BA3452 /* ConditionedTwoWayTransformationBoxTests.swift */,\n\t\t\t\t52D5F3531C52C32000BA3452 /* ConditionedValueTransformationTests.swift */,\n\t\t\t\t52D7DDBB1C552854007E5328 /* BatchTests.swift */,\n\t\t\t);\n\t\t\tname = CarlosTests;\n\t\t\tpath = Tests/CarlosTests;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\t52635A681B4F110500F187EE /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t526005BA1BB84BBC00D96242 /* swift-og.png */,\n\t\t\t\t52BBFD4A1B51BA070000084A /* Fakes */,\n\t\t\t\t52635A691B4F110500F187EE /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t52BBFD4A1B51BA070000084A /* Fakes */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t52BBFD551B51BA140000084A /* CacheLevelFake.swift */,\n\t\t\t);\n\t\t\tpath = Fakes;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAD695CD61B46CD65004E998D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t52635A1E1B4F0F3D00F187EE /* Carlos */,\n\t\t\t\t52635A671B4F110500F187EE /* CarlosTests */,\n\t\t\t\tAD695CE01B46CD65004E998D /* Products */,\n\t\t\t\t2677A0397774353D4B14F63F /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAD695CE01B46CD65004E998D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t52635A1D1B4F0F3D00F187EE /* Carlos.framework */,\n\t\t\t\t52635A661B4F110500F187EE /* Carlos iOS Tests.xctest */,\n\t\t\t\tCC03141924ACCF94002AB2BE /* Carlos.framework */,\n\t\t\t\tCC03145424ACCF99002AB2BE /* Carlos macOS Tests.xctest */,\n\t\t\t\tCC03148B24ACCFA0002AB2BE /* Carlos.framework */,\n\t\t\t\tCC0314FD24ACCFAC002AB2BE /* Carlos tvOS Tests.xctest */,\n\t\t\t\tCC03153424ACCFB1002AB2BE /* Carlos.framework */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tCC0313DE24ACBBC8002AB2BE /* Fakes */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCC5C36B824EC1717004AD171 /* FetcherFake.swift */,\n\t\t\t\tCC0313DF24ACBBC8002AB2BE /* Base64EncodedImage.swift */,\n\t\t\t\tCC0313E024ACBBC8002AB2BE /* CacheLevelFake.swift */,\n\t\t\t);\n\t\t\tpath = Fakes;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXHeadersBuildPhase section */\n\t\t52635A1A1B4F0F3D00F187EE /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC03141324ACCF94002AB2BE /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC03148524ACCFA0002AB2BE /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC03152E24ACCFB1002AB2BE /* Headers */ = {\n\t\t\tisa = PBXHeadersBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXHeadersBuildPhase section */\n\n/* Begin PBXNativeTarget section */\n\t\t52635A1C1B4F0F3D00F187EE /* Carlos iOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 52635A361B4F0F3E00F187EE /* Build configuration list for PBXNativeTarget \"Carlos iOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t52635A181B4F0F3D00F187EE /* Sources */,\n\t\t\t\t52635A191B4F0F3D00F187EE /* Frameworks */,\n\t\t\t\t52635A1A1B4F0F3D00F187EE /* Headers */,\n\t\t\t\t52635A1B1B4F0F3D00F187EE /* Resources */,\n\t\t\t\tCCC88F7524ADD4E0008C4060 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Carlos iOS\";\n\t\t\tpackageProductDependencies = (\n\t\t\t);\n\t\t\tproductName = Carlos;\n\t\t\tproductReference = 52635A1D1B4F0F3D00F187EE /* Carlos.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\t52635A651B4F110500F187EE /* Carlos iOS Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 52635A6F1B4F110500F187EE /* Build configuration list for PBXNativeTarget \"Carlos iOS Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t52635A621B4F110500F187EE /* Sources */,\n\t\t\t\t52635A631B4F110500F187EE /* Frameworks */,\n\t\t\t\t52635A641B4F110500F187EE /* Resources */,\n\t\t\t\t52BED3511CE87C3C002C045A /* Copy Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t52635A6E1B4F110500F187EE /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"Carlos iOS Tests\";\n\t\t\tpackageProductDependencies = (\n\t\t\t\tCC5C36A024EC16BB004AD171 /* Quick */,\n\t\t\t\tCC5C36A224EC16BF004AD171 /* Nimble */,\n\t\t\t);\n\t\t\tproductName = CarlosTests;\n\t\t\tproductReference = 52635A661B4F110500F187EE /* Carlos iOS Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\tCC0313E424ACCF94002AB2BE /* Carlos macOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = CC03141624ACCF94002AB2BE /* Build configuration list for PBXNativeTarget \"Carlos macOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tCC0313E524ACCF94002AB2BE /* Sources */,\n\t\t\t\tCC03141124ACCF94002AB2BE /* Frameworks */,\n\t\t\t\tCC03141324ACCF94002AB2BE /* Headers */,\n\t\t\t\tCC03141524ACCF94002AB2BE /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Carlos macOS\";\n\t\t\tpackageProductDependencies = (\n\t\t\t);\n\t\t\tproductName = Carlos;\n\t\t\tproductReference = CC03141924ACCF94002AB2BE /* Carlos.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tCC03141B24ACCF99002AB2BE /* Carlos macOS Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = CC03145124ACCF99002AB2BE /* Build configuration list for PBXNativeTarget \"Carlos macOS Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tCC03141E24ACCF99002AB2BE /* Sources */,\n\t\t\t\tCC03144724ACCF99002AB2BE /* Frameworks */,\n\t\t\t\tCC03144B24ACCF99002AB2BE /* Resources */,\n\t\t\t\tCC03144D24ACCF99002AB2BE /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tCC0315A924ACCFFD002AB2BE /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"Carlos macOS Tests\";\n\t\t\tpackageProductDependencies = (\n\t\t\t\tCC5C36A424EC16C6004AD171 /* Quick */,\n\t\t\t\tCC5C36A624EC16C9004AD171 /* Nimble */,\n\t\t\t);\n\t\t\tproductName = CarlosTests;\n\t\t\tproductReference = CC03145424ACCF99002AB2BE /* Carlos macOS Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\tCC03145624ACCFA0002AB2BE /* Carlos tvOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = CC03148824ACCFA0002AB2BE /* Build configuration list for PBXNativeTarget \"Carlos tvOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tCC03145724ACCFA0002AB2BE /* Sources */,\n\t\t\t\tCC03148324ACCFA0002AB2BE /* Frameworks */,\n\t\t\t\tCC03148524ACCFA0002AB2BE /* Headers */,\n\t\t\t\tCC03148724ACCFA0002AB2BE /* Resources */,\n\t\t\t\tCCC88F8324ADD564008C4060 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Carlos tvOS\";\n\t\t\tpackageProductDependencies = (\n\t\t\t);\n\t\t\tproductName = Carlos;\n\t\t\tproductReference = CC03148B24ACCFA0002AB2BE /* Carlos.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n\t\tCC0314C424ACCFAC002AB2BE /* Carlos tvOS Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = CC0314FA24ACCFAC002AB2BE /* Build configuration list for PBXNativeTarget \"Carlos tvOS Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tCC0314C724ACCFAC002AB2BE /* Sources */,\n\t\t\t\tCC0314F024ACCFAC002AB2BE /* Frameworks */,\n\t\t\t\tCC0314F424ACCFAC002AB2BE /* Resources */,\n\t\t\t\tCC0314F624ACCFAC002AB2BE /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tCC0315B724ACD0A1002AB2BE /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = \"Carlos tvOS Tests\";\n\t\t\tpackageProductDependencies = (\n\t\t\t\tCC5C36AE24EC16D3004AD171 /* Quick */,\n\t\t\t\tCC5C36B024EC16D3004AD171 /* Nimble */,\n\t\t\t);\n\t\t\tproductName = CarlosTests;\n\t\t\tproductReference = CC0314FD24ACCFAC002AB2BE /* Carlos tvOS Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n\t\tCC0314FF24ACCFB1002AB2BE /* Carlos watchOS */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = CC03153124ACCFB1002AB2BE /* Build configuration list for PBXNativeTarget \"Carlos watchOS\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tCC03150024ACCFB1002AB2BE /* Sources */,\n\t\t\t\tCC03152C24ACCFB1002AB2BE /* Frameworks */,\n\t\t\t\tCC03152E24ACCFB1002AB2BE /* Headers */,\n\t\t\t\tCC03153024ACCFB1002AB2BE /* Resources */,\n\t\t\t\tCCC88F9124ADD5A1008C4060 /* Embed Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"Carlos watchOS\";\n\t\t\tpackageProductDependencies = (\n\t\t\t);\n\t\t\tproductName = Carlos;\n\t\t\tproductReference = CC03153424ACCFB1002AB2BE /* Carlos.framework */;\n\t\t\tproductType = \"com.apple.product-type.framework\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tAD695CD71B46CD65004E998D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftMigration = 0700;\n\t\t\t\tLastSwiftUpdateCheck = 0730;\n\t\t\t\tLastUpgradeCheck = 1200;\n\t\t\t\tORGANIZATIONNAME = WeltN24;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t52635A1C1B4F0F3D00F187EE = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.4;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t};\n\t\t\t\t\t52635A651B4F110500F187EE = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.4;\n\t\t\t\t\t\tLastSwiftMigration = 1150;\n\t\t\t\t\t\tProvisioningStyle = Manual;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = AD695CDA1B46CD65004E998D /* Build configuration list for PBXProject \"Carlos\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = AD695CD61B46CD65004E998D;\n\t\t\tpackageReferences = (\n\t\t\t\tCC5C368A24EC1619004AD171 /* XCRemoteSwiftPackageReference \"Quick\" */,\n\t\t\t\tCC5C368D24EC1636004AD171 /* XCRemoteSwiftPackageReference \"Nimble\" */,\n\t\t\t);\n\t\t\tproductRefGroup = AD695CE01B46CD65004E998D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t52635A1C1B4F0F3D00F187EE /* Carlos iOS */,\n\t\t\t\t52635A651B4F110500F187EE /* Carlos iOS Tests */,\n\t\t\t\tCC0313E424ACCF94002AB2BE /* Carlos macOS */,\n\t\t\t\tCC03141B24ACCF99002AB2BE /* Carlos macOS Tests */,\n\t\t\t\tCC03145624ACCFA0002AB2BE /* Carlos tvOS */,\n\t\t\t\tCC0314C424ACCFAC002AB2BE /* Carlos tvOS Tests */,\n\t\t\t\tCC0314FF24ACCFB1002AB2BE /* Carlos watchOS */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t52635A1B1B4F0F3D00F187EE /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t52635A641B4F110500F187EE /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC03141524ACCF94002AB2BE /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC03144B24ACCF99002AB2BE /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC03148724ACCFA0002AB2BE /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC0314F424ACCFAC002AB2BE /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC03153024ACCFB1002AB2BE /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t52635A181B4F0F3D00F187EE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t52635A601B4F0F6F00F187EE /* Transformers.swift in Sources */,\n\t\t\t\t5222108B1C501F2100E682D1 /* ConditionedTwoWayTransformer.swift in Sources */,\n\t\t\t\t52635A571B4F0F6F00F187EE /* Extensions.swift in Sources */,\n\t\t\t\t52463F7F1C1837CF0034D032 /* ConditionedValueTransformation.swift in Sources */,\n\t\t\t\t52635A5B1B4F0F6F00F187EE /* NetworkFetcher.swift in Sources */,\n\t\t\t\t527C65471B7A66D90005023B /* SwitchCache.swift in Sources */,\n\t\t\t\t52635A591B4F0F6F00F187EE /* MemoryCacheLevel.swift in Sources */,\n\t\t\t\t52635A511B4F0F6F00F187EE /* Carlos.swift in Sources */,\n\t\t\t\t52D7DDAD1C54F4E1007E5328 /* CacheLevel+Batch.swift in Sources */,\n\t\t\t\t52635A4F1B4F0F6F00F187EE /* BasicCache.swift in Sources */,\n\t\t\t\tCCC7062224AC93EA00D16827 /* ImageTransformer.swift in Sources */,\n\t\t\t\t52635A5F1B4F0F6F00F187EE /* ValueTransformation.swift in Sources */,\n\t\t\t\t52635A581B4F0F6F00F187EE /* Logger.swift in Sources */,\n\t\t\t\t5257BBB41BBFC3FD00787819 /* ComposedTwoWayTransformer.swift in Sources */,\n\t\t\t\t526339751B52435C00074CB9 /* KeyTransformation.swift in Sources */,\n\t\t\t\tAD22FB2D1B70BBF6007F319F /* CacheProvider.swift in Sources */,\n\t\t\t\t5207E6AD1BE15BCE0062DEAC /* NSUserDefaultsCacheLevel.swift in Sources */,\n\t\t\t\t520DBB4F1CF6307500F9ABE3 /* BatchAllCache.swift in Sources */,\n\t\t\t\t52615CD41BBC8123001DA9BE /* ComposedOneWayTransformer.swift in Sources */,\n\t\t\t\t5205729B1BB8716E0098DD09 /* StringTransformer.swift in Sources */,\n\t\t\t\t5274A99B1BC05CB0006962E8 /* FetcherValueTransformation.swift in Sources */,\n\t\t\t\t52635A5D1B4F0F6F00F187EE /* PoolCache.swift in Sources */,\n\t\t\t\t52E0CBF91BBC4E1800F20C22 /* PostProcess.swift in Sources */,\n\t\t\t\t52635A5C1B4F0F6F00F187EE /* OneWayTransformer.swift in Sources */,\n\t\t\t\t52463F6E1C181D1B0034D032 /* ConditionedOutputProcessing.swift in Sources */,\n\t\t\t\t52635A561B4F0F6F00F187EE /* Errors.swift in Sources */,\n\t\t\t\t5207E6991BE13D2E0062DEAC /* ExpensiveObject.swift in Sources */,\n\t\t\t\t52635A611B4F0F6F00F187EE /* TwoWayTransformer.swift in Sources */,\n\t\t\t\tCC5C369224EC164D004AD171 /* FunctionComposition.swift in Sources */,\n\t\t\t\tCCC7061E24AC93EA00D16827 /* CacheProvider+ImageCache.swift in Sources */,\n\t\t\t\t52635A551B4F0F6F00F187EE /* DiskCacheLevel.swift in Sources */,\n\t\t\t\t52635A5A1B4F0F6F00F187EE /* MemoryWarning.swift in Sources */,\n\t\t\t\t52635A521B4F0F6F00F187EE /* Composed.swift in Sources */,\n\t\t\t\tCC5C369624EC164D004AD171 /* UnfairLock.swift in Sources */,\n\t\t\t\t52635A531B4F0F6F00F187EE /* Conditioned.swift in Sources */,\n\t\t\t\t52B7621C1BB84F160087CD91 /* JSONTransformer.swift in Sources */,\n\t\t\t\t5243C4B31B77670F00737B3B /* StringConvertible.swift in Sources */,\n\t\t\t\t5274A9A01BC0613C006962E8 /* BasicFetcher.swift in Sources */,\n\t\t\t\t5250E3801BB1345700EB7388 /* Normalize.swift in Sources */,\n\t\t\t\t5222107C1C501C5400E682D1 /* ConditionedOneWayTransformer.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t52635A621B4F110500F187EE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t526005AF1BB84AB200D96242 /* ImageTransformerTests.swift in Sources */,\n\t\t\t\t526339811B52805000074CB9 /* MemoryWarningNotificationTests.swift in Sources */,\n\t\t\t\t5243C4BF1B77686300737B3B /* StringConvertibleTests.swift in Sources */,\n\t\t\t\t526339891B52B51C00074CB9 /* DiskCacheTests.swift in Sources */,\n\t\t\t\t52D5F3481C503C6700BA3452 /* ConditionedTwoWayTransformationBoxTests.swift in Sources */,\n\t\t\t\t52F064551B51B26200145C98 /* MKDistanceFormatterTransformerTests.swift in Sources */,\n\t\t\t\t520572A91BB8752B0098DD09 /* StringTransformerTests.swift in Sources */,\n\t\t\t\t52463F7D1C18264B0034D032 /* ConditionedOutputProcessingTests.swift in Sources */,\n\t\t\t\t52615CE21BBC87F4001DA9BE /* OneWayTransformerCompositionTests.swift in Sources */,\n\t\t\t\t5291C8531BB7FAA800C4E15E /* JSONTransformerTests.swift in Sources */,\n\t\t\t\t523257D41B519AB900A10A56 /* OneWayTransformationBoxTests.swift in Sources */,\n\t\t\t\t522210901C50358700E682D1 /* ConditionedOneWayTransformationBoxTests.swift in Sources */,\n\t\t\t\t527C65531B7A89440005023B /* SwitchCacheTests.swift in Sources */,\n\t\t\t\t52BBFD561B51BA140000084A /* CacheLevelFake.swift in Sources */,\n\t\t\t\t52D7DDBC1C552854007E5328 /* BatchTests.swift in Sources */,\n\t\t\t\t52F0644F1B51AC0D00145C98 /* NSDateFormatterTransformerTests.swift in Sources */,\n\t\t\t\t5274A9D91BC069E7006962E8 /* FetcherValueTransformationTests.swift in Sources */,\n\t\t\t\tCC0313E124ACBBC8002AB2BE /* Base64EncodedImage.swift in Sources */,\n\t\t\t\t526339831B52866900074CB9 /* BasicCacheTests.swift in Sources */,\n\t\t\t\t5263397F1B52760F00074CB9 /* ValueTransformationTests.swift in Sources */,\n\t\t\t\t5257BBC21BBFC7A800787819 /* TwoWayTransformerCompositionTests.swift in Sources */,\n\t\t\t\t524019BC1C0AF9ED00749957 /* CacheProviderTests.swift in Sources */,\n\t\t\t\t5263397D1B525D1600074CB9 /* MemoryCacheLevelTests.swift in Sources */,\n\t\t\t\t5263397B1B52536700074CB9 /* KeyTransformationTests.swift in Sources */,\n\t\t\t\t526078251BE2590E0022040B /* ConditionedTransformersTests.swift in Sources */,\n\t\t\t\t526339851B52A82800074CB9 /* CompositionTests.swift in Sources */,\n\t\t\t\t52BBFD581B51BAD20000084A /* PoolCacheTests.swift in Sources */,\n\t\t\t\t526339771B52450C00074CB9 /* ConditionedCacheTests.swift in Sources */,\n\t\t\t\t52F064511B51AE4300145C98 /* NSNumberFormatterTransformerTests.swift in Sources */,\n\t\t\t\tC71C59751B6A722800AE5294 /* NetworkFetcherTests.swift in Sources */,\n\t\t\t\t5274A9CD1BC06976006962E8 /* BasicFetcherTests.swift in Sources */,\n\t\t\t\t52D5F3541C52C32000BA3452 /* ConditionedValueTransformationTests.swift in Sources */,\n\t\t\t\tCC5C36BF24EC1727004AD171 /* FetcherFake.swift in Sources */,\n\t\t\t\t52E197021BBC6B27004BF6C5 /* PostProcessTests.swift in Sources */,\n\t\t\t\t5235BAD71BE175BE0049CFA6 /* NSUserDefaultsCacheLevelTests.swift in Sources */,\n\t\t\t\t5250E3841BB137BF00EB7388 /* NormalizationTests.swift in Sources */,\n\t\t\t\t523257D21B51993000A10A56 /* TwoWayTransformationBoxTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC0313E524ACCF94002AB2BE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCC0313E724ACCF94002AB2BE /* Transformers.swift in Sources */,\n\t\t\t\tCC0313E824ACCF94002AB2BE /* ConditionedTwoWayTransformer.swift in Sources */,\n\t\t\t\tCC0313E924ACCF94002AB2BE /* Extensions.swift in Sources */,\n\t\t\t\tCC0313EA24ACCF94002AB2BE /* ConditionedValueTransformation.swift in Sources */,\n\t\t\t\tCC0313EB24ACCF94002AB2BE /* NetworkFetcher.swift in Sources */,\n\t\t\t\tCC0313EC24ACCF94002AB2BE /* SwitchCache.swift in Sources */,\n\t\t\t\tCC0313ED24ACCF94002AB2BE /* MemoryCacheLevel.swift in Sources */,\n\t\t\t\tCC0313EE24ACCF94002AB2BE /* Carlos.swift in Sources */,\n\t\t\t\tCC0313EF24ACCF94002AB2BE /* CacheLevel+Batch.swift in Sources */,\n\t\t\t\tCC0313F024ACCF94002AB2BE /* BasicCache.swift in Sources */,\n\t\t\t\tCC0313F224ACCF94002AB2BE /* ImageTransformer.swift in Sources */,\n\t\t\t\tCC0313F324ACCF94002AB2BE /* ValueTransformation.swift in Sources */,\n\t\t\t\tCC0313F424ACCF94002AB2BE /* Logger.swift in Sources */,\n\t\t\t\tCC0313F524ACCF94002AB2BE /* ComposedTwoWayTransformer.swift in Sources */,\n\t\t\t\tCC0313F624ACCF94002AB2BE /* KeyTransformation.swift in Sources */,\n\t\t\t\tCC0313F724ACCF94002AB2BE /* CacheProvider.swift in Sources */,\n\t\t\t\tCC0313F824ACCF94002AB2BE /* NSUserDefaultsCacheLevel.swift in Sources */,\n\t\t\t\tCC0313F924ACCF94002AB2BE /* BatchAllCache.swift in Sources */,\n\t\t\t\tCC0313FC24ACCF94002AB2BE /* ComposedOneWayTransformer.swift in Sources */,\n\t\t\t\tCC0313FD24ACCF94002AB2BE /* StringTransformer.swift in Sources */,\n\t\t\t\tCC0313FE24ACCF94002AB2BE /* FetcherValueTransformation.swift in Sources */,\n\t\t\t\tCC0313FF24ACCF94002AB2BE /* PoolCache.swift in Sources */,\n\t\t\t\tCC03140024ACCF94002AB2BE /* PostProcess.swift in Sources */,\n\t\t\t\tCC03140224ACCF94002AB2BE /* OneWayTransformer.swift in Sources */,\n\t\t\t\tCC03140324ACCF94002AB2BE /* ConditionedOutputProcessing.swift in Sources */,\n\t\t\t\tCC03140424ACCF94002AB2BE /* Errors.swift in Sources */,\n\t\t\t\tCC03140524ACCF94002AB2BE /* ExpensiveObject.swift in Sources */,\n\t\t\t\tCC03140624ACCF94002AB2BE /* TwoWayTransformer.swift in Sources */,\n\t\t\t\tCC5C369324EC164D004AD171 /* FunctionComposition.swift in Sources */,\n\t\t\t\tCC03140724ACCF94002AB2BE /* CacheProvider+ImageCache.swift in Sources */,\n\t\t\t\tCC03140824ACCF94002AB2BE /* DiskCacheLevel.swift in Sources */,\n\t\t\t\tCC03140924ACCF94002AB2BE /* MemoryWarning.swift in Sources */,\n\t\t\t\tCC03140A24ACCF94002AB2BE /* Composed.swift in Sources */,\n\t\t\t\tCC5C369724EC164D004AD171 /* UnfairLock.swift in Sources */,\n\t\t\t\tCC03140B24ACCF94002AB2BE /* Conditioned.swift in Sources */,\n\t\t\t\tCC03140C24ACCF94002AB2BE /* JSONTransformer.swift in Sources */,\n\t\t\t\tCC03140D24ACCF94002AB2BE /* StringConvertible.swift in Sources */,\n\t\t\t\tCC03140E24ACCF94002AB2BE /* BasicFetcher.swift in Sources */,\n\t\t\t\tCC03140F24ACCF94002AB2BE /* Normalize.swift in Sources */,\n\t\t\t\tCC03141024ACCF94002AB2BE /* ConditionedOneWayTransformer.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC03141E24ACCF99002AB2BE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCC03142024ACCF99002AB2BE /* ImageTransformerTests.swift in Sources */,\n\t\t\t\tCC03142124ACCF99002AB2BE /* MemoryWarningNotificationTests.swift in Sources */,\n\t\t\t\tCC03142224ACCF99002AB2BE /* StringConvertibleTests.swift in Sources */,\n\t\t\t\tCC03142324ACCF99002AB2BE /* DiskCacheTests.swift in Sources */,\n\t\t\t\tCC03142424ACCF99002AB2BE /* ConditionedTwoWayTransformationBoxTests.swift in Sources */,\n\t\t\t\tCC03142524ACCF99002AB2BE /* MKDistanceFormatterTransformerTests.swift in Sources */,\n\t\t\t\tCC03142624ACCF99002AB2BE /* StringTransformerTests.swift in Sources */,\n\t\t\t\tCC03142724ACCF99002AB2BE /* ConditionedOutputProcessingTests.swift in Sources */,\n\t\t\t\tCC03142924ACCF99002AB2BE /* OneWayTransformerCompositionTests.swift in Sources */,\n\t\t\t\tCC03142A24ACCF99002AB2BE /* JSONTransformerTests.swift in Sources */,\n\t\t\t\tCC03142B24ACCF99002AB2BE /* OneWayTransformationBoxTests.swift in Sources */,\n\t\t\t\tCC03142C24ACCF99002AB2BE /* ConditionedOneWayTransformationBoxTests.swift in Sources */,\n\t\t\t\tCC03142D24ACCF99002AB2BE /* SwitchCacheTests.swift in Sources */,\n\t\t\t\tCC03142F24ACCF99002AB2BE /* CacheLevelFake.swift in Sources */,\n\t\t\t\tCC03143124ACCF99002AB2BE /* BatchTests.swift in Sources */,\n\t\t\t\tCC03143224ACCF99002AB2BE /* NSDateFormatterTransformerTests.swift in Sources */,\n\t\t\t\tCC03143324ACCF99002AB2BE /* FetcherValueTransformationTests.swift in Sources */,\n\t\t\t\tCC03143424ACCF99002AB2BE /* Base64EncodedImage.swift in Sources */,\n\t\t\t\tCC03143524ACCF99002AB2BE /* BasicCacheTests.swift in Sources */,\n\t\t\t\tCC03143624ACCF99002AB2BE /* ValueTransformationTests.swift in Sources */,\n\t\t\t\tCC03143724ACCF99002AB2BE /* TwoWayTransformerCompositionTests.swift in Sources */,\n\t\t\t\tCC03143824ACCF99002AB2BE /* CacheProviderTests.swift in Sources */,\n\t\t\t\tCC03143924ACCF99002AB2BE /* MemoryCacheLevelTests.swift in Sources */,\n\t\t\t\tCC03143A24ACCF99002AB2BE /* KeyTransformationTests.swift in Sources */,\n\t\t\t\tCC03143B24ACCF99002AB2BE /* ConditionedTransformersTests.swift in Sources */,\n\t\t\t\tCC03143C24ACCF99002AB2BE /* CompositionTests.swift in Sources */,\n\t\t\t\tCC03143D24ACCF99002AB2BE /* PoolCacheTests.swift in Sources */,\n\t\t\t\tCC03143E24ACCF99002AB2BE /* ConditionedCacheTests.swift in Sources */,\n\t\t\t\tCC03143F24ACCF99002AB2BE /* NSNumberFormatterTransformerTests.swift in Sources */,\n\t\t\t\tCC03144024ACCF99002AB2BE /* NetworkFetcherTests.swift in Sources */,\n\t\t\t\tCC03144124ACCF99002AB2BE /* BasicFetcherTests.swift in Sources */,\n\t\t\t\tCC03144224ACCF99002AB2BE /* ConditionedValueTransformationTests.swift in Sources */,\n\t\t\t\tCC5C36BE24EC1726004AD171 /* FetcherFake.swift in Sources */,\n\t\t\t\tCC03144324ACCF99002AB2BE /* PostProcessTests.swift in Sources */,\n\t\t\t\tCC03144424ACCF99002AB2BE /* NSUserDefaultsCacheLevelTests.swift in Sources */,\n\t\t\t\tCC03144524ACCF99002AB2BE /* NormalizationTests.swift in Sources */,\n\t\t\t\tCC03144624ACCF99002AB2BE /* TwoWayTransformationBoxTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC03145724ACCFA0002AB2BE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCC03145924ACCFA0002AB2BE /* Transformers.swift in Sources */,\n\t\t\t\tCC03145A24ACCFA0002AB2BE /* ConditionedTwoWayTransformer.swift in Sources */,\n\t\t\t\tCC03145B24ACCFA0002AB2BE /* Extensions.swift in Sources */,\n\t\t\t\tCC03145C24ACCFA0002AB2BE /* ConditionedValueTransformation.swift in Sources */,\n\t\t\t\tCC03145D24ACCFA0002AB2BE /* NetworkFetcher.swift in Sources */,\n\t\t\t\tCC03145E24ACCFA0002AB2BE /* SwitchCache.swift in Sources */,\n\t\t\t\tCC03145F24ACCFA0002AB2BE /* MemoryCacheLevel.swift in Sources */,\n\t\t\t\tCC03146024ACCFA0002AB2BE /* Carlos.swift in Sources */,\n\t\t\t\tCC03146124ACCFA0002AB2BE /* CacheLevel+Batch.swift in Sources */,\n\t\t\t\tCC03146224ACCFA0002AB2BE /* BasicCache.swift in Sources */,\n\t\t\t\tCC03146424ACCFA0002AB2BE /* ImageTransformer.swift in Sources */,\n\t\t\t\tCC03146524ACCFA0002AB2BE /* ValueTransformation.swift in Sources */,\n\t\t\t\tCC03146624ACCFA0002AB2BE /* Logger.swift in Sources */,\n\t\t\t\tCC03146724ACCFA0002AB2BE /* ComposedTwoWayTransformer.swift in Sources */,\n\t\t\t\tCC03146824ACCFA0002AB2BE /* KeyTransformation.swift in Sources */,\n\t\t\t\tCC03146924ACCFA0002AB2BE /* CacheProvider.swift in Sources */,\n\t\t\t\tCC03146A24ACCFA0002AB2BE /* NSUserDefaultsCacheLevel.swift in Sources */,\n\t\t\t\tCC03146B24ACCFA0002AB2BE /* BatchAllCache.swift in Sources */,\n\t\t\t\tCC03146E24ACCFA0002AB2BE /* ComposedOneWayTransformer.swift in Sources */,\n\t\t\t\tCC03146F24ACCFA0002AB2BE /* StringTransformer.swift in Sources */,\n\t\t\t\tCC03147024ACCFA0002AB2BE /* FetcherValueTransformation.swift in Sources */,\n\t\t\t\tCC03147124ACCFA0002AB2BE /* PoolCache.swift in Sources */,\n\t\t\t\tCC03147224ACCFA0002AB2BE /* PostProcess.swift in Sources */,\n\t\t\t\tCC03147424ACCFA0002AB2BE /* OneWayTransformer.swift in Sources */,\n\t\t\t\tCC03147524ACCFA0002AB2BE /* ConditionedOutputProcessing.swift in Sources */,\n\t\t\t\tCC03147624ACCFA0002AB2BE /* Errors.swift in Sources */,\n\t\t\t\tCC03147724ACCFA0002AB2BE /* ExpensiveObject.swift in Sources */,\n\t\t\t\tCC03147824ACCFA0002AB2BE /* TwoWayTransformer.swift in Sources */,\n\t\t\t\tCC5C369424EC164D004AD171 /* FunctionComposition.swift in Sources */,\n\t\t\t\tCC03147924ACCFA0002AB2BE /* CacheProvider+ImageCache.swift in Sources */,\n\t\t\t\tCC03147A24ACCFA0002AB2BE /* DiskCacheLevel.swift in Sources */,\n\t\t\t\tCC03147B24ACCFA0002AB2BE /* MemoryWarning.swift in Sources */,\n\t\t\t\tCC03147C24ACCFA0002AB2BE /* Composed.swift in Sources */,\n\t\t\t\tCC5C369824EC164D004AD171 /* UnfairLock.swift in Sources */,\n\t\t\t\tCC03147D24ACCFA0002AB2BE /* Conditioned.swift in Sources */,\n\t\t\t\tCC03147E24ACCFA0002AB2BE /* JSONTransformer.swift in Sources */,\n\t\t\t\tCC03147F24ACCFA0002AB2BE /* StringConvertible.swift in Sources */,\n\t\t\t\tCC03148024ACCFA0002AB2BE /* BasicFetcher.swift in Sources */,\n\t\t\t\tCC03148124ACCFA0002AB2BE /* Normalize.swift in Sources */,\n\t\t\t\tCC03148224ACCFA0002AB2BE /* ConditionedOneWayTransformer.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC0314C724ACCFAC002AB2BE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCC0314C924ACCFAC002AB2BE /* ImageTransformerTests.swift in Sources */,\n\t\t\t\tCC0314CA24ACCFAC002AB2BE /* MemoryWarningNotificationTests.swift in Sources */,\n\t\t\t\tCC0314CB24ACCFAC002AB2BE /* StringConvertibleTests.swift in Sources */,\n\t\t\t\tCC0314CC24ACCFAC002AB2BE /* DiskCacheTests.swift in Sources */,\n\t\t\t\tCC0314CD24ACCFAC002AB2BE /* ConditionedTwoWayTransformationBoxTests.swift in Sources */,\n\t\t\t\tCC0314CE24ACCFAC002AB2BE /* MKDistanceFormatterTransformerTests.swift in Sources */,\n\t\t\t\tCC0314CF24ACCFAC002AB2BE /* StringTransformerTests.swift in Sources */,\n\t\t\t\tCC0314D024ACCFAC002AB2BE /* ConditionedOutputProcessingTests.swift in Sources */,\n\t\t\t\tCC0314D224ACCFAC002AB2BE /* OneWayTransformerCompositionTests.swift in Sources */,\n\t\t\t\tCC0314D324ACCFAC002AB2BE /* JSONTransformerTests.swift in Sources */,\n\t\t\t\tCC0314D424ACCFAC002AB2BE /* OneWayTransformationBoxTests.swift in Sources */,\n\t\t\t\tCC0314D524ACCFAC002AB2BE /* ConditionedOneWayTransformationBoxTests.swift in Sources */,\n\t\t\t\tCC0314D624ACCFAC002AB2BE /* SwitchCacheTests.swift in Sources */,\n\t\t\t\tCC0314D824ACCFAC002AB2BE /* CacheLevelFake.swift in Sources */,\n\t\t\t\tCC0314DA24ACCFAC002AB2BE /* BatchTests.swift in Sources */,\n\t\t\t\tCC0314DB24ACCFAC002AB2BE /* NSDateFormatterTransformerTests.swift in Sources */,\n\t\t\t\tCC0314DC24ACCFAC002AB2BE /* FetcherValueTransformationTests.swift in Sources */,\n\t\t\t\tCC0314DD24ACCFAC002AB2BE /* Base64EncodedImage.swift in Sources */,\n\t\t\t\tCC0314DE24ACCFAC002AB2BE /* BasicCacheTests.swift in Sources */,\n\t\t\t\tCC0314DF24ACCFAC002AB2BE /* ValueTransformationTests.swift in Sources */,\n\t\t\t\tCC0314E024ACCFAC002AB2BE /* TwoWayTransformerCompositionTests.swift in Sources */,\n\t\t\t\tCC0314E124ACCFAC002AB2BE /* CacheProviderTests.swift in Sources */,\n\t\t\t\tCC0314E224ACCFAC002AB2BE /* MemoryCacheLevelTests.swift in Sources */,\n\t\t\t\tCC0314E324ACCFAC002AB2BE /* KeyTransformationTests.swift in Sources */,\n\t\t\t\tCC0314E424ACCFAC002AB2BE /* ConditionedTransformersTests.swift in Sources */,\n\t\t\t\tCC0314E524ACCFAC002AB2BE /* CompositionTests.swift in Sources */,\n\t\t\t\tCC0314E624ACCFAC002AB2BE /* PoolCacheTests.swift in Sources */,\n\t\t\t\tCC0314E724ACCFAC002AB2BE /* ConditionedCacheTests.swift in Sources */,\n\t\t\t\tCC0314E824ACCFAC002AB2BE /* NSNumberFormatterTransformerTests.swift in Sources */,\n\t\t\t\tCC0314E924ACCFAC002AB2BE /* NetworkFetcherTests.swift in Sources */,\n\t\t\t\tCC0314EA24ACCFAC002AB2BE /* BasicFetcherTests.swift in Sources */,\n\t\t\t\tCC0314EB24ACCFAC002AB2BE /* ConditionedValueTransformationTests.swift in Sources */,\n\t\t\t\tCC5C36BD24EC1725004AD171 /* FetcherFake.swift in Sources */,\n\t\t\t\tCC0314EC24ACCFAC002AB2BE /* PostProcessTests.swift in Sources */,\n\t\t\t\tCC0314ED24ACCFAC002AB2BE /* NSUserDefaultsCacheLevelTests.swift in Sources */,\n\t\t\t\tCC0314EE24ACCFAC002AB2BE /* NormalizationTests.swift in Sources */,\n\t\t\t\tCC0314EF24ACCFAC002AB2BE /* TwoWayTransformationBoxTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tCC03150024ACCFB1002AB2BE /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCC03150224ACCFB1002AB2BE /* Transformers.swift in Sources */,\n\t\t\t\tCC03150324ACCFB1002AB2BE /* ConditionedTwoWayTransformer.swift in Sources */,\n\t\t\t\tCC03150424ACCFB1002AB2BE /* Extensions.swift in Sources */,\n\t\t\t\tCC03150524ACCFB1002AB2BE /* ConditionedValueTransformation.swift in Sources */,\n\t\t\t\tCC03150624ACCFB1002AB2BE /* NetworkFetcher.swift in Sources */,\n\t\t\t\tCC03150724ACCFB1002AB2BE /* SwitchCache.swift in Sources */,\n\t\t\t\tCC03150824ACCFB1002AB2BE /* MemoryCacheLevel.swift in Sources */,\n\t\t\t\tCC03150924ACCFB1002AB2BE /* Carlos.swift in Sources */,\n\t\t\t\tCC03150A24ACCFB1002AB2BE /* CacheLevel+Batch.swift in Sources */,\n\t\t\t\tCC03150B24ACCFB1002AB2BE /* BasicCache.swift in Sources */,\n\t\t\t\tCC03150D24ACCFB1002AB2BE /* ImageTransformer.swift in Sources */,\n\t\t\t\tCC03150E24ACCFB1002AB2BE /* ValueTransformation.swift in Sources */,\n\t\t\t\tCC03150F24ACCFB1002AB2BE /* Logger.swift in Sources */,\n\t\t\t\tCC03151024ACCFB1002AB2BE /* ComposedTwoWayTransformer.swift in Sources */,\n\t\t\t\tCC03151124ACCFB1002AB2BE /* KeyTransformation.swift in Sources */,\n\t\t\t\tCC03151224ACCFB1002AB2BE /* CacheProvider.swift in Sources */,\n\t\t\t\tCC03151324ACCFB1002AB2BE /* NSUserDefaultsCacheLevel.swift in Sources */,\n\t\t\t\tCC03151424ACCFB1002AB2BE /* BatchAllCache.swift in Sources */,\n\t\t\t\tCC03151724ACCFB1002AB2BE /* ComposedOneWayTransformer.swift in Sources */,\n\t\t\t\tCC03151824ACCFB1002AB2BE /* StringTransformer.swift in Sources */,\n\t\t\t\tCC03151924ACCFB1002AB2BE /* FetcherValueTransformation.swift in Sources */,\n\t\t\t\tCC03151A24ACCFB1002AB2BE /* PoolCache.swift in Sources */,\n\t\t\t\tCC03151B24ACCFB1002AB2BE /* PostProcess.swift in Sources */,\n\t\t\t\tCC03151D24ACCFB1002AB2BE /* OneWayTransformer.swift in Sources */,\n\t\t\t\tCC03151E24ACCFB1002AB2BE /* ConditionedOutputProcessing.swift in Sources */,\n\t\t\t\tCC03151F24ACCFB1002AB2BE /* Errors.swift in Sources */,\n\t\t\t\tCC03152024ACCFB1002AB2BE /* ExpensiveObject.swift in Sources */,\n\t\t\t\tCC03152124ACCFB1002AB2BE /* TwoWayTransformer.swift in Sources */,\n\t\t\t\tCC5C369524EC164D004AD171 /* FunctionComposition.swift in Sources */,\n\t\t\t\tCC03152224ACCFB1002AB2BE /* CacheProvider+ImageCache.swift in Sources */,\n\t\t\t\tCC03152324ACCFB1002AB2BE /* DiskCacheLevel.swift in Sources */,\n\t\t\t\tCC03152424ACCFB1002AB2BE /* MemoryWarning.swift in Sources */,\n\t\t\t\tCC03152524ACCFB1002AB2BE /* Composed.swift in Sources */,\n\t\t\t\tCC5C369924EC164D004AD171 /* UnfairLock.swift in Sources */,\n\t\t\t\tCC03152624ACCFB1002AB2BE /* Conditioned.swift in Sources */,\n\t\t\t\tCC03152724ACCFB1002AB2BE /* JSONTransformer.swift in Sources */,\n\t\t\t\tCC03152824ACCFB1002AB2BE /* StringConvertible.swift in Sources */,\n\t\t\t\tCC03152924ACCFB1002AB2BE /* BasicFetcher.swift in Sources */,\n\t\t\t\tCC03152A24ACCFB1002AB2BE /* Normalize.swift in Sources */,\n\t\t\t\tCC03152B24ACCFB1002AB2BE /* ConditionedOneWayTransformer.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t52635A6E1B4F110500F187EE /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 52635A1C1B4F0F3D00F187EE /* Carlos iOS */;\n\t\t\ttargetProxy = 52635A6D1B4F110500F187EE /* PBXContainerItemProxy */;\n\t\t};\n\t\tCC0315A924ACCFFD002AB2BE /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = CC0313E424ACCF94002AB2BE /* Carlos macOS */;\n\t\t\ttargetProxy = CC0315A824ACCFFD002AB2BE /* PBXContainerItemProxy */;\n\t\t};\n\t\tCC0315B724ACD0A1002AB2BE /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = CC03145624ACCFA0002AB2BE /* Carlos tvOS */;\n\t\t\ttargetProxy = CC0315B624ACD0A1002AB2BE /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t52635A371B4F0F3E00F187EE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"$(inherited)\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0.0;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSUPPORTED_PLATFORMS = \"iphonesimulator iphoneos\";\n\t\t\t\tSUPPORTS_MACCATALYST = YES;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t52635A381B4F0F3E00F187EE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0.0;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSUPPORTED_PLATFORMS = \"iphonesimulator iphoneos\";\n\t\t\t\tSUPPORTS_MACCATALYST = YES;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t52635A701B4F110500F187EE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(SDKROOT)/Developer/Library/Frameworks\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/iOS\",\n\t\t\t\t);\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Tests/CarlosTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = \"iphonesimulator iphoneos\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t52635A711B4F110500F187EE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(SDKROOT)/Developer/Library/Frameworks\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/iOS\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Tests/CarlosTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = \"iphonesimulator iphoneos\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tAD695CFC1B46CD65004E998D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = Sources/Carlos/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.15;\n\t\t\t\tMARKETING_VERSION = 0.10.0;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.axelspringer.carlos;\n\t\t\t\tPRODUCT_NAME = Carlos;\n\t\t\t\tSUPPORTED_PLATFORMS = \"iphonesimulator iphoneos appletvos macosx watchos watchsimulator appletvsimulator\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 10.0;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 3.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tAD695CFD1B46CD65004E998D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tINFOPLIST_FILE = Sources/Carlos/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.15;\n\t\t\t\tMARKETING_VERSION = 0.10.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.axelspringer.carlos;\n\t\t\t\tPRODUCT_NAME = Carlos;\n\t\t\t\tSUPPORTED_PLATFORMS = \"iphonesimulator iphoneos appletvos macosx watchos watchsimulator appletvsimulator\";\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 10.0;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 3.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tCC03141724ACCF94002AB2BE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"$(inherited)\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0.0;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSUPPORTED_PLATFORMS = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tCC03141824ACCF94002AB2BE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0.0;\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSUPPORTED_PLATFORMS = macosx;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tCC03145224ACCF99002AB2BE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(SDKROOT)/Developer/Library/Frameworks\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Tests/CarlosTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSUPPORTED_PLATFORMS = macosx;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tCC03145324ACCF99002AB2BE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(SDKROOT)/Developer/Library/Frameworks\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/Mac\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Tests/CarlosTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSUPPORTED_PLATFORMS = macosx;\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tCC03148924ACCFA0002AB2BE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"$(inherited)\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0.0;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSUPPORTED_PLATFORMS = \"appletvsimulator appletvos\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tCC03148A24ACCFA0002AB2BE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0.0;\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSUPPORTED_PLATFORMS = \"appletvsimulator appletvos\";\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tCC0314FB24ACCFAC002AB2BE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(SDKROOT)/Developer/Library/Frameworks\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/tvOS\",\n\t\t\t\t);\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Tests/CarlosTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSUPPORTED_PLATFORMS = \"appletvsimulator appletvos\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tCC0314FC24ACCFAC002AB2BE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tDEVELOPMENT_TEAM = \"\";\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = (\n\t\t\t\t\t\"$(SDKROOT)/Developer/Library/Frameworks\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"$(PROJECT_DIR)/Carthage/Build/tvOS\",\n\t\t\t\t);\n\t\t\t\tINFOPLIST_FILE = Tests/CarlosTests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSUPPORTED_PLATFORMS = \"appletvsimulator appletvos\";\n\t\t\t\tSWIFT_SWIFT3_OBJC_INFERENCE = Default;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tCC03153224ACCFB1002AB2BE /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"$(inherited)\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0.0;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = watchos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSUPPORTED_PLATFORMS = \"watchsimulator watchos\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tCC03153324ACCFB1002AB2BE /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tAPPLICATION_EXTENSION_API_ONLY = YES;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tDEFINES_MODULE = YES;\n\t\t\t\tDYLIB_COMPATIBILITY_VERSION = 1;\n\t\t\t\tDYLIB_CURRENT_VERSION = 1;\n\t\t\t\tDYLIB_INSTALL_NAME_BASE = \"@rpath\";\n\t\t\t\tINSTALL_PATH = \"$(LOCAL_LIBRARY_DIR)/Frameworks\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tMARKETING_VERSION = 1.0.0;\n\t\t\t\tSDKROOT = watchos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSUPPORTED_PLATFORMS = \"watchsimulator watchos\";\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tVERSIONING_SYSTEM = \"apple-generic\";\n\t\t\t\tVERSION_INFO_PREFIX = \"\";\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t52635A361B4F0F3E00F187EE /* Build configuration list for PBXNativeTarget \"Carlos iOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t52635A371B4F0F3E00F187EE /* Debug */,\n\t\t\t\t52635A381B4F0F3E00F187EE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t52635A6F1B4F110500F187EE /* Build configuration list for PBXNativeTarget \"Carlos iOS Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t52635A701B4F110500F187EE /* Debug */,\n\t\t\t\t52635A711B4F110500F187EE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tAD695CDA1B46CD65004E998D /* Build configuration list for PBXProject \"Carlos\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tAD695CFC1B46CD65004E998D /* Debug */,\n\t\t\t\tAD695CFD1B46CD65004E998D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tCC03141624ACCF94002AB2BE /* Build configuration list for PBXNativeTarget \"Carlos macOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tCC03141724ACCF94002AB2BE /* Debug */,\n\t\t\t\tCC03141824ACCF94002AB2BE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tCC03145124ACCF99002AB2BE /* Build configuration list for PBXNativeTarget \"Carlos macOS Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tCC03145224ACCF99002AB2BE /* Debug */,\n\t\t\t\tCC03145324ACCF99002AB2BE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tCC03148824ACCFA0002AB2BE /* Build configuration list for PBXNativeTarget \"Carlos tvOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tCC03148924ACCFA0002AB2BE /* Debug */,\n\t\t\t\tCC03148A24ACCFA0002AB2BE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tCC0314FA24ACCFAC002AB2BE /* Build configuration list for PBXNativeTarget \"Carlos tvOS Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tCC0314FB24ACCFAC002AB2BE /* Debug */,\n\t\t\t\tCC0314FC24ACCFAC002AB2BE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tCC03153124ACCFB1002AB2BE /* Build configuration list for PBXNativeTarget \"Carlos watchOS\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tCC03153224ACCFB1002AB2BE /* Debug */,\n\t\t\t\tCC03153324ACCFB1002AB2BE /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCRemoteSwiftPackageReference section */\n\t\tCC5C368A24EC1619004AD171 /* XCRemoteSwiftPackageReference \"Quick\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/Quick/Quick.git\";\n\t\t\trequirement = {\n\t\t\t\tkind = upToNextMajorVersion;\n\t\t\t\tminimumVersion = 3.0.0;\n\t\t\t};\n\t\t};\n\t\tCC5C368D24EC1636004AD171 /* XCRemoteSwiftPackageReference \"Nimble\" */ = {\n\t\t\tisa = XCRemoteSwiftPackageReference;\n\t\t\trepositoryURL = \"https://github.com/Quick/Nimble.git\";\n\t\t\trequirement = {\n\t\t\t\tkind = upToNextMajorVersion;\n\t\t\t\tminimumVersion = 8.1.0;\n\t\t\t};\n\t\t};\n/* End XCRemoteSwiftPackageReference section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\tCC5C36A024EC16BB004AD171 /* Quick */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = CC5C368A24EC1619004AD171 /* XCRemoteSwiftPackageReference \"Quick\" */;\n\t\t\tproductName = Quick;\n\t\t};\n\t\tCC5C36A224EC16BF004AD171 /* Nimble */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = CC5C368D24EC1636004AD171 /* XCRemoteSwiftPackageReference \"Nimble\" */;\n\t\t\tproductName = Nimble;\n\t\t};\n\t\tCC5C36A424EC16C6004AD171 /* Quick */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = CC5C368A24EC1619004AD171 /* XCRemoteSwiftPackageReference \"Quick\" */;\n\t\t\tproductName = Quick;\n\t\t};\n\t\tCC5C36A624EC16C9004AD171 /* Nimble */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = CC5C368D24EC1636004AD171 /* XCRemoteSwiftPackageReference \"Nimble\" */;\n\t\t\tproductName = Nimble;\n\t\t};\n\t\tCC5C36AE24EC16D3004AD171 /* Quick */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = CC5C368A24EC1619004AD171 /* XCRemoteSwiftPackageReference \"Quick\" */;\n\t\t\tproductName = Quick;\n\t\t};\n\t\tCC5C36B024EC16D3004AD171 /* Nimble */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tpackage = CC5C368D24EC1636004AD171 /* XCRemoteSwiftPackageReference \"Nimble\" */;\n\t\t\tproductName = Nimble;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = AD695CD71B46CD65004E998D /* Project object */;\n}\n"
  },
  {
    "path": "Carlos.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Carlos.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Carlos.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved",
    "content": "{\n  \"object\": {\n    \"pins\": [\n      {\n        \"package\": \"Nimble\",\n        \"repositoryURL\": \"https://github.com/Quick/Nimble.git\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"7a46a5fc86cb917f69e3daf79fcb045283d8f008\",\n          \"version\": \"8.1.2\"\n        }\n      },\n      {\n        \"package\": \"Quick\",\n        \"repositoryURL\": \"https://github.com/Quick/Quick.git\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"0038bcbab4292f3b028632556507c124e5ba69f3\",\n          \"version\": \"3.0.0\"\n        }\n      }\n    ]\n  },\n  \"version\": 1\n}\n"
  },
  {
    "path": "Carlos.xcodeproj/xcshareddata/xcschemes/Carlos iOS.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1200\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"52635A1C1B4F0F3D00F187EE\"\n               BuildableName = \"Carlos.framework\"\n               BlueprintName = \"Carlos iOS\"\n               ReferencedContainer = \"container:Carlos.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"52635A651B4F110500F187EE\"\n               BuildableName = \"Carlos iOS Tests.xctest\"\n               BlueprintName = \"Carlos iOS Tests\"\n               ReferencedContainer = \"container:Carlos.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"52635A1C1B4F0F3D00F187EE\"\n            BuildableName = \"Carlos.framework\"\n            BlueprintName = \"Carlos iOS\"\n            ReferencedContainer = \"container:Carlos.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Carlos.xcodeproj/xcshareddata/xcschemes/Carlos watchOS.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1200\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"CC0314FF24ACCFB1002AB2BE\"\n               BuildableName = \"Carlos.framework\"\n               BlueprintName = \"Carlos watchOS\"\n               ReferencedContainer = \"container:Carlos.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"CC03156D24ACCFBE002AB2BE\"\n               BuildableName = \"Carlos watchOS Tests.xctest\"\n               BlueprintName = \"Carlos watchOS Tests\"\n               ReferencedContainer = \"container:Carlos.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"CC0314FF24ACCFB1002AB2BE\"\n            BuildableName = \"Carlos.framework\"\n            BlueprintName = \"Carlos watchOS\"\n            ReferencedContainer = \"container:Carlos.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "Carlos.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"group:\">\n   </FileRef>\n   <FileRef\n      location = \"group:Example/Example.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Carlos.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Carlos.xcworkspace/xcshareddata/swiftpm/Package.resolved",
    "content": "{\n  \"object\": {\n    \"pins\": [\n      {\n        \"package\": \"CwlCatchException\",\n        \"repositoryURL\": \"https://github.com/mattgallagher/CwlCatchException.git\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"682841464136f8c66e04afe5dbd01ab51a3a56f2\",\n          \"version\": \"2.1.0\"\n        }\n      },\n      {\n        \"package\": \"CwlPreconditionTesting\",\n        \"repositoryURL\": \"https://github.com/mattgallagher/CwlPreconditionTesting.git\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"02b7a39a99c4da27abe03cab2053a9034379639f\",\n          \"version\": \"2.0.0\"\n        }\n      },\n      {\n        \"package\": \"Nimble\",\n        \"repositoryURL\": \"https://github.com/Quick/Nimble.git\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"af1730dde4e6c0d45bf01b99f8a41713ce536790\",\n          \"version\": \"9.2.0\"\n        }\n      },\n      {\n        \"package\": \"Quick\",\n        \"repositoryURL\": \"https://github.com/Quick/Quick.git\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"bd86ca0141e3cfb333546de5a11ede63f0c4a0e6\",\n          \"version\": \"4.0.0\"\n        }\n      }\n    ]\n  },\n  \"version\": 1\n}\n"
  },
  {
    "path": "Example/CarlosMacSample/AppDelegate.swift",
    "content": "import Carlos\nimport Cocoa\nimport Combine\n\n@NSApplicationMain\nclass AppDelegate: NSObject, NSApplicationDelegate {\n  let cache = CacheProvider.dataCache()\n\n  private var cancellables = Set<AnyCancellable>()\n\n  func applicationDidFinishLaunching(_: Notification) {\n    cache.get(URL(string: \"https://github.com/WeltN24/Carlos\")!)\n      .sink(receiveCompletion: { completion in\n        if case let .failure(error) = completion {\n          print(\"Got the following error from the data cache:\")\n          print(error)\n        }\n      }, receiveValue: { value in\n        print(\"Got the following string from the data cache:\")\n        print(String(describing: String(data: value as Data, encoding: .utf8)))\n      })\n      .store(in: &cancellables)\n  }\n}\n"
  },
  {
    "path": "Example/CarlosMacSample/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"16x16\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"32x32\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"32x32\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"128x128\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"128x128\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"256x256\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"256x256\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"512x512\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"mac\",\n      \"size\" : \"512x512\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/CarlosMacSample/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder3.Cocoa.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"8187.4\" systemVersion=\"14F27\" targetRuntime=\"MacOSX.Cocoa\" propertyAccessControl=\"none\" useAutolayout=\"YES\" initialViewController=\"B8D-0N-5wS\">\n    <dependencies>\n        <deployment identifier=\"macosx\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.CocoaPlugin\" version=\"8187.4\"/>\n    </dependencies>\n    <scenes>\n        <!--Application-->\n        <scene sceneID=\"JPo-4y-FX3\">\n            <objects>\n                <application id=\"hnw-xV-0zn\" sceneMemberID=\"viewController\">\n                    <menu key=\"mainMenu\" title=\"Main Menu\" systemMenu=\"main\" id=\"AYu-sK-qS6\">\n                        <items>\n                            <menuItem title=\"CarlosMacSample\" id=\"1Xt-HY-uBw\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"CarlosMacSample\" systemMenu=\"apple\" id=\"uQy-DD-JDr\">\n                                    <items>\n                                        <menuItem title=\"Hide CarlosMacSample\" keyEquivalent=\"h\" id=\"Olw-nP-bQN\">\n                                            <connections>\n                                                <action selector=\"hide:\" target=\"Ady-hI-5gd\" id=\"PnN-Uc-m68\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Hide Others\" keyEquivalent=\"h\" id=\"Vdr-fp-XzO\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\" option=\"YES\" command=\"YES\"/>\n                                            <connections>\n                                                <action selector=\"hideOtherApplications:\" target=\"Ady-hI-5gd\" id=\"VT4-aY-XCT\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem title=\"Show All\" id=\"Kd2-mp-pUS\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"unhideAllApplications:\" target=\"Ady-hI-5gd\" id=\"Dhg-Le-xox\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"kCx-OE-vgT\"/>\n                                        <menuItem title=\"Quit CarlosMacSample\" keyEquivalent=\"q\" id=\"4sb-4s-VLi\">\n                                            <connections>\n                                                <action selector=\"terminate:\" target=\"Ady-hI-5gd\" id=\"Te7-pn-YzF\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                            <menuItem title=\"Window\" id=\"aUF-d1-5bR\">\n                                <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                <menu key=\"submenu\" title=\"Window\" systemMenu=\"window\" id=\"Td7-aD-5lo\">\n                                    <items>\n                                        <menuItem title=\"Minimize\" keyEquivalent=\"m\" id=\"OY7-WF-poV\">\n                                            <connections>\n                                                <action selector=\"performMiniaturize:\" target=\"Ady-hI-5gd\" id=\"VwT-WD-YPe\"/>\n                                            </connections>\n                                        </menuItem>\n                                        <menuItem isSeparatorItem=\"YES\" id=\"eu3-7i-yIM\"/>\n                                        <menuItem title=\"Bring All to Front\" id=\"LE2-aR-0XJ\">\n                                            <modifierMask key=\"keyEquivalentModifierMask\"/>\n                                            <connections>\n                                                <action selector=\"arrangeInFront:\" target=\"Ady-hI-5gd\" id=\"DRN-fu-gQh\"/>\n                                            </connections>\n                                        </menuItem>\n                                    </items>\n                                </menu>\n                            </menuItem>\n                        </items>\n                    </menu>\n                    <connections>\n                        <outlet property=\"delegate\" destination=\"Voe-Tx-rLC\" id=\"PrD-fu-P6m\"/>\n                    </connections>\n                </application>\n                <customObject id=\"Voe-Tx-rLC\" customClass=\"AppDelegate\" customModule=\"CarlosMacSample\" customModuleProvider=\"target\"/>\n                <customObject id=\"Ady-hI-5gd\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"0.0\"/>\n        </scene>\n        <!--Window Controller-->\n        <scene sceneID=\"R2V-B0-nI4\">\n            <objects>\n                <windowController id=\"B8D-0N-5wS\" sceneMemberID=\"viewController\">\n                    <window key=\"window\" title=\"Window\" allowsToolTipsWhenApplicationIsInactive=\"NO\" autorecalculatesKeyViewLoop=\"NO\" oneShot=\"NO\" releasedWhenClosed=\"NO\" showsToolbarButton=\"NO\" visibleAtLaunch=\"NO\" animationBehavior=\"default\" id=\"IQv-IB-iLA\">\n                        <windowStyleMask key=\"styleMask\" titled=\"YES\" closable=\"YES\" miniaturizable=\"YES\" resizable=\"YES\"/>\n                        <windowPositionMask key=\"initialPositionMask\" leftStrut=\"YES\" rightStrut=\"YES\" topStrut=\"YES\" bottomStrut=\"YES\"/>\n                        <rect key=\"contentRect\" x=\"196\" y=\"240\" width=\"480\" height=\"270\"/>\n                        <rect key=\"screenRect\" x=\"0.0\" y=\"0.0\" width=\"1680\" height=\"1027\"/>\n                    </window>\n                    <connections>\n                        <segue destination=\"XfG-lQ-9wD\" kind=\"relationship\" relationship=\"window.shadowedContentViewController\" id=\"cq2-FE-JQM\"/>\n                    </connections>\n                </windowController>\n                <customObject id=\"Oky-zY-oP4\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"250\"/>\n        </scene>\n        <!--View Controller-->\n        <scene sceneID=\"hIz-AP-VOD\">\n            <objects>\n                <viewController id=\"XfG-lQ-9wD\" customClass=\"ViewController\" customModule=\"CarlosMacSample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <view key=\"view\" id=\"m2S-Jp-Qdl\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"480\" height=\"270\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </view>\n                </viewController>\n                <customObject id=\"rPt-NT-nkU\" userLabel=\"First Responder\" customClass=\"NSResponder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"75\" y=\"655\"/>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Example/CarlosMacSample/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIconFile</key>\n\t<string></string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSMinimumSystemVersion</key>\n\t<string>$(MACOSX_DEPLOYMENT_TARGET)</string>\n\t<key>NSHumanReadableCopyright</key>\n\t<string>Copyright © 2015 WeltN24. All rights reserved.</string>\n\t<key>NSMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>NSPrincipalClass</key>\n\t<string>NSApplication</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/CarlosMacSample/ViewController.swift",
    "content": "import Cocoa\n\nclass ViewController: NSViewController {\n  override func viewDidLoad() {\n    if #available(OSX 10.10, *) {\n      super.viewDidLoad()\n    }\n  }\n}\n"
  },
  {
    "path": "Example/CarlosTvSample/AppDelegate.swift",
    "content": "import UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n  var window: UIWindow?\n\n  private func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n    true\n  }\n}\n"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Back.imagestacklayer/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Contents.json",
    "content": "{\n  \"layers\" : [\n    {\n      \"filename\" : \"Front.imagestacklayer\"\n    },\n    {\n      \"filename\" : \"Middle.imagestacklayer\"\n    },\n    {\n      \"filename\" : \"Back.imagestacklayer\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Front.imagestacklayer/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Large.imagestack/Middle.imagestacklayer/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Back.imagestacklayer/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Contents.json",
    "content": "{\n  \"layers\" : [\n    {\n      \"filename\" : \"Front.imagestacklayer\"\n    },\n    {\n      \"filename\" : \"Middle.imagestacklayer\"\n    },\n    {\n      \"filename\" : \"Back.imagestacklayer\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}\n"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Front.imagestacklayer/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Content.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/App Icon - Small.imagestack/Middle.imagestacklayer/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Contents.json",
    "content": "{\n  \"assets\" : [\n    {\n      \"filename\" : \"App Icon - Large.imagestack\",\n      \"idiom\" : \"tv\",\n      \"role\" : \"primary-app-icon\",\n      \"size\" : \"1280x768\"\n    },\n    {\n      \"filename\" : \"App Icon - Small.imagestack\",\n      \"idiom\" : \"tv\",\n      \"role\" : \"primary-app-icon\",\n      \"size\" : \"400x240\"\n    },\n    {\n      \"filename\" : \"Top Shelf Image Wide.imageset\",\n      \"idiom\" : \"tv\",\n      \"role\" : \"top-shelf-image-wide\",\n      \"size\" : \"2320x720\"\n    },\n    {\n      \"filename\" : \"Top Shelf Image.imageset\",\n      \"idiom\" : \"tv\",\n      \"role\" : \"top-shelf-image\",\n      \"size\" : \"1920x720\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image Wide.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/App Icon & Top Shelf Image.brandassets/Top Shelf Image.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"tv\",\n      \"scale\" : \"2x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/CarlosTvSample/Assets.xcassets/LaunchImage.launchimage/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"tv\",\n      \"minimum-system-version\" : \"11.0\",\n      \"orientation\" : \"landscape\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"extent\" : \"full-screen\",\n      \"idiom\" : \"tv\",\n      \"minimum-system-version\" : \"9.0\",\n      \"orientation\" : \"landscape\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Example/CarlosTvSample/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n<document type=\"com.apple.InterfaceBuilder.AppleTV.Storyboard\" version=\"3.0\" toolsVersion=\"9052\" systemVersion=\"14F27\" targetRuntime=\"AppleTV\" propertyAccessControl=\"none\" useAutolayout=\"YES\" initialViewController=\"BYZ-38-t0r\">\n    <dependencies>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"9040\"/>\n    </dependencies>\n    <scenes>\n        <!--View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"ViewController\" customModule=\"CarlosTvSample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"y3c-jy-aDJ\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wfy-db-euE\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"1920\" height=\"1080\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <color key=\"backgroundColor\" white=\"0.0\" alpha=\"0.0\" colorSpace=\"custom\" customColorSpace=\"calibratedWhite\"/>\n                    </view>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n        </scene>\n    </scenes>\n</document>\n"
  },
  {
    "path": "Example/CarlosTvSample/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>NSAppTransportSecurity</key>\n\t<dict>\n\t\t<key>NSAllowsArbitraryLoads</key>\n\t\t<true/>\n\t</dict>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>arm64</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/CarlosTvSample/ViewController.swift",
    "content": "import Carlos\nimport Combine\nimport UIKit\n\nclass BitcoinResult {\n  let USDValue: Float\n\n  init(USDValue: Float) {\n    self.USDValue = USDValue\n  }\n}\n\nextension BitcoinResult: ExpensiveObject {\n  var cost: Int {\n    1\n  }\n}\n\nenum SampleError: Error {\n  case invalidJSON\n}\n\nclass ViewController: UIViewController {\n  private var cancellables = Set<AnyCancellable>()\n\n  override func viewDidLoad() {\n    super.viewDidLoad()\n\n    let JSONFetcher: BasicFetcher<URL, AnyObject> = NetworkFetcher().transformValues(JSONTransformer())\n    let cache = JSONFetcher.transformValues(BTCTransformer())\n\n    cache.get(URL(string: \"http://coinabul.com/api.php\")!)\n      .sink(receiveCompletion: { completion in\n        print(completion)\n      }, receiveValue: { result in\n        print(\"Bitcoin value is \\(result.USDValue) USD\")\n      }).store(in: &cancellables)\n  }\n}\n\nstruct BTCTransformer: OneWayTransformer {\n  func transform(_ val: AnyObject) -> AnyPublisher<BitcoinResult, Error> {\n    Future { promise in\n      if let JSON = val as? [String: AnyObject],\n        let BTCDict = JSON[\"BTC\"] as? [String: AnyObject],\n        let USDStringValue = BTCDict[\"USD\"] as? String,\n        let USDFloatValue = Float(USDStringValue)\n      {\n        promise(.success(BitcoinResult(USDValue: USDFloatValue)))\n      } else {\n        promise(.failure(SampleError.invalidJSON))\n      }\n    }.eraseToAnyPublisher()\n  }\n}\n"
  },
  {
    "path": "Example/CarlosWatchSample/Assets.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"watch\",\n      \"role\" : \"notificationCenter\",\n      \"scale\" : \"2x\",\n      \"size\" : \"24x24\",\n      \"subtype\" : \"38mm\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"role\" : \"notificationCenter\",\n      \"scale\" : \"2x\",\n      \"size\" : \"27.5x27.5\",\n      \"subtype\" : \"42mm\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"role\" : \"companionSettings\",\n      \"scale\" : \"2x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"role\" : \"companionSettings\",\n      \"scale\" : \"3x\",\n      \"size\" : \"29x29\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"role\" : \"appLauncher\",\n      \"scale\" : \"2x\",\n      \"size\" : \"40x40\",\n      \"subtype\" : \"38mm\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"role\" : \"appLauncher\",\n      \"scale\" : \"2x\",\n      \"size\" : \"44x44\",\n      \"subtype\" : \"40mm\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"role\" : \"appLauncher\",\n      \"scale\" : \"2x\",\n      \"size\" : \"50x50\",\n      \"subtype\" : \"44mm\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"role\" : \"quickLook\",\n      \"scale\" : \"2x\",\n      \"size\" : \"86x86\",\n      \"subtype\" : \"38mm\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"role\" : \"quickLook\",\n      \"scale\" : \"2x\",\n      \"size\" : \"98x98\",\n      \"subtype\" : \"42mm\"\n    },\n    {\n      \"idiom\" : \"watch\",\n      \"role\" : \"quickLook\",\n      \"scale\" : \"2x\",\n      \"size\" : \"108x108\",\n      \"subtype\" : \"44mm\"\n    },\n    {\n      \"idiom\" : \"watch-marketing\",\n      \"scale\" : \"1x\",\n      \"size\" : \"1024x1024\"\n    }\n  ],\n  \"info\" : {\n    \"author\" : \"xcode\",\n    \"version\" : 1\n  }\n}\n"
  },
  {
    "path": "Example/CarlosWatchSample/Base.lproj/Interface.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder.WatchKit.Storyboard\" version=\"3.0\" toolsVersion=\"16097\" targetRuntime=\"watchKit\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"AgC-eL-Hgc\">\n    <device id=\"watch38\"/>\n    <dependencies>\n        <deployment identifier=\"watchOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"16087\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBWatchKitPlugin\" version=\"16012\"/>\n    </dependencies>\n    <scenes>\n        <!--Interface Controller-->\n        <scene sceneID=\"aou-V4-d1y\">\n            <objects>\n                <controller id=\"AgC-eL-Hgc\" customClass=\"InterfaceController\" customModule=\"CarlosWatchSample\" customModuleProvider=\"target\">\n                    <items>\n                        <table alignment=\"left\" id=\"4vB-1a-vCi\">\n                            <items>\n                                <tableRow identifier=\"CountryRow\" selectable=\"NO\" id=\"bP4-0c-GQ5\" customClass=\"CountryRow\" customModule=\"CarlosWatchSample_Extension\">\n                                    <group key=\"rootItem\" width=\"1\" alignment=\"left\" id=\"LFy-O2-6xt\">\n                                        <items>\n                                            <imageView width=\"40\" height=\"40\" alignment=\"left\" verticalAlignment=\"center\" image=\"placeholder\" contentMode=\"scaleAspectFit\" id=\"NVm-KX-mV7\"/>\n                                            <label alignment=\"right\" verticalAlignment=\"center\" text=\"Label\" textAlignment=\"right\" id=\"ctA-kb-6ko\"/>\n                                        </items>\n                                    </group>\n                                    <connections>\n                                        <outlet property=\"countryName\" destination=\"ctA-kb-6ko\" id=\"CpW-S9-yCK\"/>\n                                        <outlet property=\"flagImage\" destination=\"NVm-KX-mV7\" id=\"oHm-K2-5el\"/>\n                                    </connections>\n                                </tableRow>\n                            </items>\n                        </table>\n                    </items>\n                    <connections>\n                        <outlet property=\"tableView\" destination=\"4vB-1a-vCi\" id=\"lfY-0Y-VFd\"/>\n                    </connections>\n                </controller>\n            </objects>\n            <point key=\"canvasLocation\" x=\"34\" y=\"31\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <image name=\"placeholder\" width=\"50\" height=\"32.5\"/>\n    </resources>\n</document>\n"
  },
  {
    "path": "Example/CarlosWatchSample/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>CarlosSample</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t</array>\n\t<key>WKCompanionAppBundleIdentifier</key>\n\t<string>de.axelspringer.CarlosSample</string>\n\t<key>WKWatchKitApp</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/CarlosWatchSample Extension/Assets.xcassets/Contents.json",
    "content": "{\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/CarlosWatchSample Extension/Assets.xcassets/placeholder.imageset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"placeholder.jpg\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"filename\" : \"placeholder-1.jpg\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"universal\",\n      \"scale\" : \"3x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/CarlosWatchSample Extension/CountryRow.swift",
    "content": "import Foundation\nimport WatchKit\n\nclass CountryRow: NSObject {\n  @IBOutlet var countryName: WKInterfaceLabel!\n  @IBOutlet var flagImage: WKInterfaceImage!\n}\n"
  },
  {
    "path": "Example/CarlosWatchSample Extension/ExtensionDelegate.swift",
    "content": "import WatchKit\n\nclass ExtensionDelegate: NSObject, WKExtensionDelegate {\n  func applicationDidFinishLaunching() {}\n}\n"
  },
  {
    "path": "Example/CarlosWatchSample Extension/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleDisplayName</key>\n\t<string>CarlosWatchSample Extension</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>XPC!</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>NSAppTransportSecurity</key>\n\t<dict>\n\t\t<key>NSAllowsArbitraryLoads</key>\n\t\t<true/>\n\t</dict>\n\t<key>NSExtension</key>\n\t<dict>\n\t\t<key>NSExtensionAttributes</key>\n\t\t<dict>\n\t\t\t<key>WKAppBundleIdentifier</key>\n\t\t\t<string>de.axelspringer.CarlosSample.watchkitapp</string>\n\t\t</dict>\n\t\t<key>NSExtensionPointIdentifier</key>\n\t\t<string>com.apple.watchkit</string>\n\t</dict>\n\t<key>RemoteInterfacePrincipalClass</key>\n\t<string>$(PRODUCT_MODULE_NAME).InterfaceController</string>\n\t<key>WKExtensionDelegateClassName</key>\n\t<string>$(PRODUCT_MODULE_NAME).ExtensionDelegate</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/CarlosWatchSample Extension/InterfaceController.swift",
    "content": "import Foundation\nimport WatchKit\n\nimport Carlos\nimport Combine\n\nprivate struct Country {\n  let name: String\n  let flagURL: URL\n}\n\nclass InterfaceController: WKInterfaceController {\n  @IBOutlet var tableView: WKInterfaceTable!\n\n  let imageCache = CacheProvider.imageCache()\n\n  private var cancellables = Set<AnyCancellable>()\n\n  private let countries = [\n    Country(name: \"Italy\", flagURL: URL(string: \"http://2.bp.blogspot.com/-51ZhmfLCi9s/VBLNUQL-giI/AAAAAAAAAfA/LTayxh5K3C4/s1600/flag_italy_mini.gif\")!),\n    Country(name: \"Germany\", flagURL: URL(string: \"http://www.weezerpedia.com/wiki/images/e/eb/Flag-germany.png\")!),\n    Country(name: \"France\", flagURL: URL(string: \"http://www.worldflagsportal.com/pics/thumbnails/france-flag.png\")!),\n    Country(name: \"Netherlands\", flagURL: URL(string: \"https://upload.wikimedia.org/wikipedia/commons/thumb/2/20/Flag_of_the_Netherlands.svg/50px-Flag_of_the_Netherlands.svg.png\")!),\n    Country(name: \"South Africa\", flagURL: URL(string: \"https://8b90b43d6bcfc09ee36c-3ad5470e7d4bb324e402ac2f90d6d0ba.ssl.cf3.rackcdn.com/soaf_1.gif\")!),\n    Country(name: \"USA\", flagURL: URL(string: \"http://www.scramblestuff.us/images/us_flag.png\")!),\n    Country(name: \"Australia\", flagURL: URL(string: \"http://dropdownaustralia.com/wp-content/uploads/2013/11/Australian-Flag.png\")!),\n    Country(name: \"Spain\", flagURL: URL(string: \"http://www.romanhomes.com/vacation_rentals/images/navona-campo-fiori-turtles-dream/navona-campo-fiori-turtles-dream/flag-spain-small.jpg\")!),\n    Country(name: \"Austria\", flagURL: URL(string: \"http://flagpedia.net/data/flags/mini/at.png\")!),\n    Country(name: \"Congo\", flagURL: URL(string: \"https://www.usaid.gov/sites/default/files/styles/40x24_flag/public/missions/flags/congo-democratic-republic-of.gif?itok=xRT3uqRi\")!),\n    Country(name: \"Cuba\", flagURL: URL(string: \"http://flagpedia.net/data/flags/mini/cu.png\")!),\n    Country(name: \"UK\", flagURL: URL(string: \"http://images.smh.com.au/2012/07/18/3464759/Olympic-Flag-Icon_Great_Britain.gif\")!)\n  ]\n\n  override func awake(withContext context: Any?) {\n    super.awake(withContext: context)\n\n    tableView.setNumberOfRows(countries.count, withRowType: \"CountryRow\")\n\n    for (idx, country) in countries.enumerated() {\n      if let row = tableView.rowController(at: idx) as? CountryRow {\n        row.countryName.setText(country.name)\n        row.flagImage.setImage(UIImage(named: \"placeholder\"))\n\n        imageCache.get(country.flagURL).sink(receiveCompletion: { _ in }) { image in\n          row.flagImage.setImage(image)\n        }.store(in: &cancellables)\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Example/Example/AppDelegate.swift",
    "content": "import Carlos\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n  var window: UIWindow?\n\n  func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {\n    true\n  }\n}\n\nfunc simpleCache() -> BasicCache<URL, NSData> {\n  CacheProvider.dataCache()\n}\n\nfunc delayedNetworkCache() -> BasicCache<URL, NSData> {\n  MemoryCacheLevel().compose(DiskCacheLevel()).compose(DelayedNetworkFetcher())\n}\n"
  },
  {
    "path": "Example/Example/Base.lproj/Main.storyboard",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"17156\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" useTraitCollections=\"YES\" colorMatched=\"YES\" initialViewController=\"VM7-XC-H0K\">\n    <device id=\"retina6_1\" orientation=\"portrait\" appearance=\"light\"/>\n    <dependencies>\n        <deployment identifier=\"iOS\"/>\n        <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"17126\"/>\n        <capability name=\"System colors in document resources\" minToolsVersion=\"11.0\"/>\n        <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n    </dependencies>\n    <scenes>\n        <!--Examples List View Controller-->\n        <scene sceneID=\"tne-QT-ifu\">\n            <objects>\n                <viewController id=\"BYZ-38-t0r\" customClass=\"ExamplesListViewController\" customModule=\"ExampleSample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"y3c-jy-aDJ\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"wfy-db-euE\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"8bC-Xf-vdC\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <tableView clipsSubviews=\"YES\" contentMode=\"scaleToFill\" alwaysBounceVertical=\"YES\" dataMode=\"prototypes\" style=\"plain\" separatorStyle=\"default\" rowHeight=\"55\" sectionHeaderHeight=\"25\" sectionFooterHeight=\"25\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"djL-bZ-Ujc\">\n                                <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"862\"/>\n                                <color key=\"backgroundColor\" systemColor=\"systemBackgroundColor\"/>\n                                <prototypes>\n                                    <tableViewCell contentMode=\"scaleToFill\" selectionStyle=\"gray\" accessoryType=\"disclosureIndicator\" hidesAccessoryWhenEditing=\"NO\" indentationLevel=\"1\" indentationWidth=\"0.0\" reuseIdentifier=\"ExampleCell\" textLabel=\"Y1w-6b-lFT\" detailTextLabel=\"M2d-GP-Pks\" style=\"IBUITableViewCellStyleSubtitle\" id=\"ZDi-Dd-fxb\" customClass=\"ExampleCell\" customModule=\"ExampleSample\" customModuleProvider=\"target\">\n                                        <rect key=\"frame\" x=\"0.0\" y=\"28\" width=\"414\" height=\"55\"/>\n                                        <autoresizingMask key=\"autoresizingMask\"/>\n                                        <tableViewCellContentView key=\"contentView\" opaque=\"NO\" clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"center\" tableViewCell=\"ZDi-Dd-fxb\" id=\"B7j-5P-dn7\">\n                                            <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"383\" height=\"55\"/>\n                                            <autoresizingMask key=\"autoresizingMask\"/>\n                                            <subviews>\n                                                <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" insetsLayoutMarginsFromSafeArea=\"NO\" text=\"Title\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"Y1w-6b-lFT\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"9\" width=\"33\" height=\"20.5\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                                <label opaque=\"NO\" multipleTouchEnabled=\"YES\" contentMode=\"left\" insetsLayoutMarginsFromSafeArea=\"NO\" text=\"Subtitle\" textAlignment=\"natural\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" id=\"M2d-GP-Pks\">\n                                                    <rect key=\"frame\" x=\"20\" y=\"30.5\" width=\"44\" height=\"14.5\"/>\n                                                    <autoresizingMask key=\"autoresizingMask\"/>\n                                                    <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"12\"/>\n                                                    <nil key=\"textColor\"/>\n                                                    <nil key=\"highlightedColor\"/>\n                                                </label>\n                                            </subviews>\n                                        </tableViewCellContentView>\n                                    </tableViewCell>\n                                </prototypes>\n                                <connections>\n                                    <outlet property=\"dataSource\" destination=\"BYZ-38-t0r\" id=\"nKd-lv-2yD\"/>\n                                    <outlet property=\"delegate\" destination=\"BYZ-38-t0r\" id=\"pQc-8n-I1R\"/>\n                                </connections>\n                            </tableView>\n                        </subviews>\n                        <constraints>\n                            <constraint firstItem=\"wfy-db-euE\" firstAttribute=\"top\" secondItem=\"djL-bZ-Ujc\" secondAttribute=\"bottom\" id=\"Ck2-7n-bFe\"/>\n                            <constraint firstItem=\"djL-bZ-Ujc\" firstAttribute=\"top\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"top\" id=\"IWw-0Q-kP2\"/>\n                            <constraint firstItem=\"djL-bZ-Ujc\" firstAttribute=\"leading\" secondItem=\"8bC-Xf-vdC\" secondAttribute=\"leading\" id=\"ORi-fU-9V7\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"djL-bZ-Ujc\" secondAttribute=\"trailing\" id=\"qU0-CL-ASH\"/>\n                        </constraints>\n                    </view>\n                    <navigationItem key=\"navigationItem\" id=\"tKY-HU-2kc\"/>\n                    <simulatedStatusBarMetrics key=\"simulatedStatusBarMetrics\"/>\n                    <connections>\n                        <segue destination=\"pIu-kR-eaS\" kind=\"show\" identifier=\"userDefaultsCache\" id=\"5dU-FT-vcl\"/>\n                        <segue destination=\"cPe-S0-2ZW\" kind=\"show\" identifier=\"memoryWarning\" id=\"Q7g-M3-nP3\"/>\n                        <segue destination=\"gIf-ro-V0s\" kind=\"show\" identifier=\"complexCache\" id=\"ToB-8w-NSa\"/>\n                        <segue destination=\"jL4-x1-bK7\" kind=\"show\" identifier=\"conditionedCache\" id=\"QWJ-yc-wQc\"/>\n                        <segue destination=\"U7q-Zo-Ph8\" kind=\"show\" identifier=\"pooledCache\" id=\"g0G-lb-If9\"/>\n                        <segue destination=\"iWa-HA-Zrq\" kind=\"show\" identifier=\"switchedCache\" id=\"IYh-wq-B4X\"/>\n                        <segue destination=\"z71-b5-B3c\" kind=\"show\" identifier=\"imageCache\" id=\"kMG-uK-xOr\"/>\n                        <segue destination=\"cc7-Is-Czm\" kind=\"show\" identifier=\"jsonCache\" id=\"EDN-6y-gae\"/>\n                        <segue destination=\"7LF-i8-XhB\" kind=\"show\" identifier=\"dataCache\" id=\"1ue-4j-fmV\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"dkx-z0-nzr\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1197.1014492753625\" y=\"324.77678571428572\"/>\n        </scene>\n        <!--Image Cache Sample View Controller-->\n        <scene sceneID=\"KsD-v5-8ez\">\n            <objects>\n                <viewController id=\"z71-b5-B3c\" customClass=\"ImageCacheSampleViewController\" customModule=\"ExampleSample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"bVP-jU-SZv\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"e2Y-kR-dhP\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"c7c-tA-4hz\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"URL\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8d0-nd-unO\">\n                                <rect key=\"frame\" x=\"15\" y=\"108\" width=\"32\" height=\"20.5\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"249\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" borderStyle=\"roundedRect\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kqz-lq-vil\">\n                                <rect key=\"frame\" x=\"55\" y=\"103.5\" width=\"304\" height=\"30\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"30\" id=\"NRu-bS-Gfr\"/>\n                                </constraints>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\"/>\n                                <connections>\n                                    <outlet property=\"delegate\" destination=\"z71-b5-B3c\" id=\"FrK-U3-9tb\"/>\n                                </connections>\n                            </textField>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" enabled=\"NO\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ha3-ef-VDs\">\n                                <rect key=\"frame\" x=\"369\" y=\"103.5\" width=\"30\" height=\"30\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"30\" id=\"f7v-XY-J2W\"/>\n                                </constraints>\n                                <state key=\"normal\" title=\"GET\">\n                                    <color key=\"titleShadowColor\" red=\"0.5\" green=\"0.5\" blue=\"0.5\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                </state>\n                                <connections>\n                                    <action selector=\"fetchButtonTapped:\" destination=\"z71-b5-B3c\" eventType=\"touchUpInside\" id=\"fU3-3B-KLQ\"/>\n                                </connections>\n                            </button>\n                            <textView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" showsHorizontalScrollIndicator=\"NO\" editable=\"NO\" selectable=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"7MY-j6-7cP\">\n                                <rect key=\"frame\" x=\"15\" y=\"143.5\" width=\"384\" height=\"100\"/>\n                                <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"100\" id=\"VZI-tG-KOG\"/>\n                                </constraints>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\" autocapitalizationType=\"sentences\"/>\n                                <dataDetectorType key=\"dataDetectorTypes\" link=\"YES\"/>\n                            </textView>\n                            <imageView userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"nBE-fh-KJY\">\n                                <rect key=\"frame\" x=\"15\" y=\"253.5\" width=\"384\" height=\"588.5\"/>\n                            </imageView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"kqz-lq-vil\" firstAttribute=\"leading\" secondItem=\"8d0-nd-unO\" secondAttribute=\"trailing\" constant=\"8\" id=\"Bo5-KS-MJU\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"7MY-j6-7cP\" secondAttribute=\"trailing\" constant=\"15\" id=\"FC7-qJ-h1q\"/>\n                            <constraint firstItem=\"7MY-j6-7cP\" firstAttribute=\"leading\" secondItem=\"c7c-tA-4hz\" secondAttribute=\"leading\" constant=\"15\" id=\"GQg-o4-vJR\"/>\n                            <constraint firstItem=\"8d0-nd-unO\" firstAttribute=\"centerY\" secondItem=\"kqz-lq-vil\" secondAttribute=\"centerY\" id=\"Gnh-AO-0es\"/>\n                            <constraint firstItem=\"7MY-j6-7cP\" firstAttribute=\"top\" secondItem=\"kqz-lq-vil\" secondAttribute=\"bottom\" constant=\"10\" id=\"HFY-4o-Fdl\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"Ha3-ef-VDs\" secondAttribute=\"trailing\" constant=\"15\" id=\"JdP-4u-2Ta\"/>\n                            <constraint firstItem=\"nBE-fh-KJY\" firstAttribute=\"top\" secondItem=\"7MY-j6-7cP\" secondAttribute=\"bottom\" constant=\"10\" id=\"KsW-Zt-KZ7\"/>\n                            <constraint firstItem=\"nBE-fh-KJY\" firstAttribute=\"leading\" secondItem=\"c7c-tA-4hz\" secondAttribute=\"leading\" constant=\"15\" id=\"RBS-6m-boL\"/>\n                            <constraint firstItem=\"Ha3-ef-VDs\" firstAttribute=\"leading\" secondItem=\"kqz-lq-vil\" secondAttribute=\"trailing\" constant=\"10\" id=\"RQK-U0-hCs\"/>\n                            <constraint firstItem=\"8d0-nd-unO\" firstAttribute=\"leading\" secondItem=\"c7c-tA-4hz\" secondAttribute=\"leading\" constant=\"15\" id=\"WIC-xw-rV4\"/>\n                            <constraint firstItem=\"e2Y-kR-dhP\" firstAttribute=\"top\" secondItem=\"nBE-fh-KJY\" secondAttribute=\"bottom\" constant=\"20\" id=\"ahL-YM-SEu\"/>\n                            <constraint firstItem=\"8d0-nd-unO\" firstAttribute=\"top\" secondItem=\"c7c-tA-4hz\" secondAttribute=\"top\" constant=\"20\" id=\"apw-KG-E3D\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"nBE-fh-KJY\" secondAttribute=\"trailing\" constant=\"15\" id=\"cUs-po-Ebf\"/>\n                            <constraint firstItem=\"8d0-nd-unO\" firstAttribute=\"top\" secondItem=\"bVP-jU-SZv\" secondAttribute=\"bottom\" constant=\"20\" id=\"cWu-Qx-xWG\"/>\n                            <constraint firstItem=\"kqz-lq-vil\" firstAttribute=\"centerY\" secondItem=\"Ha3-ef-VDs\" secondAttribute=\"centerY\" id=\"s7h-E7-Nhi\"/>\n                        </constraints>\n                        <variation key=\"default\">\n                            <mask key=\"constraints\">\n                                <exclude reference=\"apw-KG-E3D\"/>\n                            </mask>\n                        </variation>\n                    </view>\n                    <connections>\n                        <outlet property=\"eventsLogView\" destination=\"7MY-j6-7cP\" id=\"gfQ-Cb-Hsa\"/>\n                        <outlet property=\"fetchButton\" destination=\"Ha3-ef-VDs\" id=\"YYF-WX-Tok\"/>\n                        <outlet property=\"imageView\" destination=\"nBE-fh-KJY\" id=\"Uqa-IU-64J\"/>\n                        <outlet property=\"urlKeyField\" destination=\"kqz-lq-vil\" id=\"m6g-I9-MYR\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"gW9-uL-GMD\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1937\" y=\"-1883\"/>\n        </scene>\n        <!--Pooled Cache Sample View Controller-->\n        <scene sceneID=\"Tdo-Ed-5Jp\">\n            <objects>\n                <viewController id=\"U7q-Zo-Ph8\" customClass=\"PooledCacheSampleViewController\" customModule=\"ExampleSample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"sFu-U5-FOw\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"LYb-f1-3hA\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"ivb-ef-6De\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <textView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" showsHorizontalScrollIndicator=\"NO\" editable=\"NO\" selectable=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"JTN-6f-1lJ\">\n                                <rect key=\"frame\" x=\"15\" y=\"193.5\" width=\"570\" height=\"410.5\"/>\n                                <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\" autocapitalizationType=\"sentences\"/>\n                                <dataDetectorType key=\"dataDetectorTypes\" link=\"YES\"/>\n                            </textView>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" enabled=\"NO\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"KIC-La-rLY\">\n                                <rect key=\"frame\" x=\"364\" y=\"103.5\" width=\"30\" height=\"30\"/>\n                                <state key=\"normal\" title=\"GET\">\n                                    <color key=\"titleShadowColor\" red=\"0.5\" green=\"0.5\" blue=\"0.5\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                </state>\n                                <connections>\n                                    <action selector=\"fetchButtonTapped:\" destination=\"U7q-Zo-Ph8\" eventType=\"touchUpInside\" id=\"SYs-Cn-wBt\"/>\n                                </connections>\n                            </button>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"URL\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"F9w-Jg-web\">\n                                <rect key=\"frame\" x=\"15\" y=\"108\" width=\"32\" height=\"20.5\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"249\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" borderStyle=\"roundedRect\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kjT-Hq-Ead\">\n                                <rect key=\"frame\" x=\"55\" y=\"101.5\" width=\"301\" height=\"34\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\"/>\n                                <connections>\n                                    <outlet property=\"delegate\" destination=\"U7q-Zo-Ph8\" id=\"t6v-X4-mMC\"/>\n                                </connections>\n                            </textField>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Requests are delayed by 2 seconds to let you experiment with multiple get requests for the same key URL\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"10\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"SXC-Hf-vOK\">\n                                <rect key=\"frame\" x=\"15\" y=\"143.5\" width=\"379\" height=\"40\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"40\" id=\"ZOW-Uw-xeq\"/>\n                                </constraints>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"15\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"F9w-Jg-web\" firstAttribute=\"top\" secondItem=\"sFu-U5-FOw\" secondAttribute=\"bottom\" constant=\"20\" id=\"0EM-4G-1yc\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"JTN-6f-1lJ\" secondAttribute=\"trailing\" constant=\"-171\" id=\"1sI-oo-pTX\"/>\n                            <constraint firstItem=\"LYb-f1-3hA\" firstAttribute=\"top\" secondItem=\"JTN-6f-1lJ\" secondAttribute=\"bottom\" constant=\"258\" id=\"2e4-ES-O9I\"/>\n                            <constraint firstItem=\"SXC-Hf-vOK\" firstAttribute=\"top\" secondItem=\"F9w-Jg-web\" secondAttribute=\"bottom\" constant=\"15\" id=\"421-z5-RcX\"/>\n                            <constraint firstItem=\"JTN-6f-1lJ\" firstAttribute=\"leading\" secondItem=\"ivb-ef-6De\" secondAttribute=\"leading\" constant=\"15\" id=\"KEM-h7-RNd\"/>\n                            <constraint firstItem=\"SXC-Hf-vOK\" firstAttribute=\"leading\" secondItem=\"F9w-Jg-web\" secondAttribute=\"leading\" id=\"Klf-tS-ngM\"/>\n                            <constraint firstItem=\"SXC-Hf-vOK\" firstAttribute=\"trailing\" secondItem=\"KIC-La-rLY\" secondAttribute=\"trailing\" id=\"OdQ-t5-Z6j\"/>\n                            <constraint firstItem=\"KIC-La-rLY\" firstAttribute=\"leading\" secondItem=\"kjT-Hq-Ead\" secondAttribute=\"trailing\" constant=\"8\" id=\"Uwe-Mx-Wpz\"/>\n                            <constraint firstItem=\"kjT-Hq-Ead\" firstAttribute=\"centerY\" secondItem=\"KIC-La-rLY\" secondAttribute=\"centerY\" id=\"cNQ-KV-a3R\"/>\n                            <constraint firstItem=\"JTN-6f-1lJ\" firstAttribute=\"top\" secondItem=\"kjT-Hq-Ead\" secondAttribute=\"bottom\" constant=\"10\" id=\"fJS-Zk-Ljn\"/>\n                            <constraint firstItem=\"F9w-Jg-web\" firstAttribute=\"centerY\" secondItem=\"kjT-Hq-Ead\" secondAttribute=\"centerY\" id=\"jRG-Xp-dGz\"/>\n                            <constraint firstItem=\"kjT-Hq-Ead\" firstAttribute=\"leading\" secondItem=\"F9w-Jg-web\" secondAttribute=\"trailing\" constant=\"8\" id=\"lWf-B4-uz1\"/>\n                            <constraint firstItem=\"F9w-Jg-web\" firstAttribute=\"leading\" secondItem=\"ivb-ef-6De\" secondAttribute=\"leading\" constant=\"15\" id=\"oK5-JY-Ro7\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"KIC-La-rLY\" secondAttribute=\"trailing\" constant=\"20\" id=\"vhY-qu-o8i\"/>\n                            <constraint firstItem=\"JTN-6f-1lJ\" firstAttribute=\"top\" secondItem=\"SXC-Hf-vOK\" secondAttribute=\"bottom\" constant=\"10\" id=\"y1h-XY-0uz\"/>\n                        </constraints>\n                        <variation key=\"default\">\n                            <mask key=\"constraints\">\n                                <exclude reference=\"fJS-Zk-Ljn\"/>\n                            </mask>\n                        </variation>\n                    </view>\n                    <connections>\n                        <outlet property=\"eventsLogView\" destination=\"JTN-6f-1lJ\" id=\"eXg-R5-rpd\"/>\n                        <outlet property=\"fetchButton\" destination=\"KIC-La-rLY\" id=\"S1M-Lf-EEE\"/>\n                        <outlet property=\"urlKeyField\" destination=\"kjT-Hq-Ead\" id=\"omJ-vD-Zdf\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"pNL-J2-bXJ\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1937.68115942029\" y=\"-1229.4642857142856\"/>\n        </scene>\n        <!--Conditioned Cache Sample View Controller-->\n        <scene sceneID=\"qbP-jl-WCV\">\n            <objects>\n                <viewController id=\"jL4-x1-bK7\" customClass=\"ConditionedCacheSampleViewController\" customModule=\"ExampleSample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"m5L-QG-E7K\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"6Po-Dl-eFr\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"xcp-dG-9Br\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"URL\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mNi-2a-ONJ\">\n                                <rect key=\"frame\" x=\"15\" y=\"108\" width=\"32\" height=\"20.5\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <textView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" showsHorizontalScrollIndicator=\"NO\" editable=\"NO\" selectable=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4dg-ol-JaI\">\n                                <rect key=\"frame\" x=\"15\" y=\"194\" width=\"384\" height=\"682\"/>\n                                <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\" autocapitalizationType=\"sentences\"/>\n                                <dataDetectorType key=\"dataDetectorTypes\" link=\"YES\"/>\n                            </textView>\n                            <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"249\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" borderStyle=\"roundedRect\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"43C-sZ-jD3\">\n                                <rect key=\"frame\" x=\"55\" y=\"101.5\" width=\"309\" height=\"34\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\"/>\n                                <connections>\n                                    <outlet property=\"delegate\" destination=\"jL4-x1-bK7\" id=\"rxC-UV-1gm\"/>\n                                </connections>\n                            </textField>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" enabled=\"NO\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mfV-26-GLw\">\n                                <rect key=\"frame\" x=\"374\" y=\"103.5\" width=\"30\" height=\"30\"/>\n                                <state key=\"normal\" title=\"GET\">\n                                    <color key=\"titleShadowColor\" red=\"0.5\" green=\"0.5\" blue=\"0.5\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                </state>\n                                <connections>\n                                    <action selector=\"fetchButtonTapped:\" destination=\"jL4-x1-bK7\" eventType=\"touchUpInside\" id=\"3EV-nF-FQZ\"/>\n                                </connections>\n                            </button>\n                            <switch opaque=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" horizontalCompressionResistancePriority=\"751\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"DbW-M6-I2a\">\n                                <rect key=\"frame\" x=\"15\" y=\"143.5\" width=\"51\" height=\"31\"/>\n                                <connections>\n                                    <action selector=\"killSwitchValueChanged:\" destination=\"jL4-x1-bK7\" eventType=\"valueChanged\" id=\"C8L-gM-qc0\"/>\n                                </connections>\n                            </switch>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Enable this switch to disable the cache. The cache also fails if the URL key scheme is not &quot;http&quot; \" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"10\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Zxw-HE-Jea\">\n                                <rect key=\"frame\" x=\"74\" y=\"139\" width=\"325\" height=\"40\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"40\" id=\"w9v-kG-hSs\"/>\n                                </constraints>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"4dg-ol-JaI\" firstAttribute=\"top\" secondItem=\"43C-sZ-jD3\" secondAttribute=\"bottom\" constant=\"10\" id=\"0AI-lh-2LV\"/>\n                            <constraint firstItem=\"Zxw-HE-Jea\" firstAttribute=\"leading\" secondItem=\"DbW-M6-I2a\" secondAttribute=\"trailing\" constant=\"10\" id=\"0cB-jg-PEW\"/>\n                            <constraint firstItem=\"mfV-26-GLw\" firstAttribute=\"leading\" secondItem=\"43C-sZ-jD3\" secondAttribute=\"trailing\" constant=\"10\" id=\"7p4-Zy-IPA\"/>\n                            <constraint firstItem=\"mNi-2a-ONJ\" firstAttribute=\"leading\" secondItem=\"DbW-M6-I2a\" secondAttribute=\"leading\" id=\"8CY-QX-Sgp\"/>\n                            <constraint firstItem=\"4dg-ol-JaI\" firstAttribute=\"top\" secondItem=\"Zxw-HE-Jea\" secondAttribute=\"bottom\" constant=\"15\" id=\"Adb-Df-dCw\"/>\n                            <constraint firstItem=\"mNi-2a-ONJ\" firstAttribute=\"leading\" secondItem=\"xcp-dG-9Br\" secondAttribute=\"leading\" constant=\"15\" id=\"Cn7-i5-UTr\"/>\n                            <constraint firstItem=\"43C-sZ-jD3\" firstAttribute=\"centerY\" secondItem=\"mNi-2a-ONJ\" secondAttribute=\"centerY\" id=\"Luy-qQ-Diz\"/>\n                            <constraint firstItem=\"mNi-2a-ONJ\" firstAttribute=\"top\" secondItem=\"m5L-QG-E7K\" secondAttribute=\"bottom\" constant=\"20\" id=\"MLH-rH-Hw5\"/>\n                            <constraint firstItem=\"4dg-ol-JaI\" firstAttribute=\"leading\" secondItem=\"xcp-dG-9Br\" secondAttribute=\"leading\" constant=\"15\" id=\"RkZ-uf-OOU\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"4dg-ol-JaI\" secondAttribute=\"trailing\" constant=\"15\" id=\"dWp-EI-HSw\"/>\n                            <constraint firstItem=\"43C-sZ-jD3\" firstAttribute=\"leading\" secondItem=\"mNi-2a-ONJ\" secondAttribute=\"trailing\" constant=\"8\" id=\"goL-y6-TP2\"/>\n                            <constraint firstItem=\"DbW-M6-I2a\" firstAttribute=\"top\" secondItem=\"mNi-2a-ONJ\" secondAttribute=\"bottom\" constant=\"15\" id=\"ksX-ck-20P\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"4dg-ol-JaI\" secondAttribute=\"bottom\" constant=\"20\" id=\"t0m-bz-X6t\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"Zxw-HE-Jea\" secondAttribute=\"trailing\" constant=\"15\" id=\"tKJ-yB-6vY\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"mfV-26-GLw\" secondAttribute=\"trailing\" constant=\"10\" id=\"uHV-W7-1zk\"/>\n                            <constraint firstItem=\"43C-sZ-jD3\" firstAttribute=\"centerY\" secondItem=\"mfV-26-GLw\" secondAttribute=\"centerY\" id=\"w7s-Ta-Q1F\"/>\n                            <constraint firstItem=\"DbW-M6-I2a\" firstAttribute=\"centerY\" secondItem=\"Zxw-HE-Jea\" secondAttribute=\"centerY\" id=\"yCy-NT-Ixf\"/>\n                        </constraints>\n                        <variation key=\"default\">\n                            <mask key=\"constraints\">\n                                <exclude reference=\"0AI-lh-2LV\"/>\n                            </mask>\n                        </variation>\n                    </view>\n                    <connections>\n                        <outlet property=\"eventsLogView\" destination=\"4dg-ol-JaI\" id=\"b73-QM-te6\"/>\n                        <outlet property=\"fetchButton\" destination=\"mfV-26-GLw\" id=\"tCu-V0-LVZ\"/>\n                        <outlet property=\"urlKeyField\" destination=\"43C-sZ-jD3\" id=\"NTM-6k-HBp\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"GIj-v9-HSh\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1938\" y=\"-507\"/>\n        </scene>\n        <!--User Defaults Cache Sample View Controller-->\n        <scene sceneID=\"k0N-Lz-7nd\">\n            <objects>\n                <viewController id=\"pIu-kR-eaS\" customClass=\"UserDefaultsCacheSampleViewController\" customModule=\"ExampleSample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"ZHG-sj-dxE\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"MgK-zE-rJV\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"dfj-Ka-bB6\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"URL\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"E5E-9k-tLl\">\n                                <rect key=\"frame\" x=\"15\" y=\"108\" width=\"32\" height=\"20.5\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"249\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" borderStyle=\"roundedRect\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"dgf-HS-hD9\">\n                                <rect key=\"frame\" x=\"55\" y=\"101.5\" width=\"263\" height=\"34\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\"/>\n                                <connections>\n                                    <outlet property=\"delegate\" destination=\"pIu-kR-eaS\" id=\"UJw-At-hPO\"/>\n                                </connections>\n                            </textField>\n                            <textView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" showsHorizontalScrollIndicator=\"NO\" editable=\"NO\" selectable=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"im6-U7-wHu\">\n                                <rect key=\"frame\" x=\"15\" y=\"145.5\" width=\"384\" height=\"696.5\"/>\n                                <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\" autocapitalizationType=\"sentences\"/>\n                                <dataDetectorType key=\"dataDetectorTypes\" link=\"YES\"/>\n                            </textView>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"HrB-Nl-Pdz\">\n                                <rect key=\"frame\" x=\"368\" y=\"103.5\" width=\"36\" height=\"30\"/>\n                                <state key=\"normal\" title=\"Clear\"/>\n                                <connections>\n                                    <action selector=\"clearCache:\" destination=\"pIu-kR-eaS\" eventType=\"touchUpInside\" id=\"C3m-Lz-TBr\"/>\n                                </connections>\n                            </button>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" enabled=\"NO\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"mW5-NF-G9b\">\n                                <rect key=\"frame\" x=\"328\" y=\"103.5\" width=\"30\" height=\"30\"/>\n                                <state key=\"normal\" title=\"GET\">\n                                    <color key=\"titleShadowColor\" red=\"0.5\" green=\"0.5\" blue=\"0.5\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                </state>\n                                <connections>\n                                    <action selector=\"fetchButtonTapped:\" destination=\"pIu-kR-eaS\" eventType=\"touchUpInside\" id=\"0xg-br-4sN\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"mW5-NF-G9b\" firstAttribute=\"leading\" secondItem=\"dgf-HS-hD9\" secondAttribute=\"trailing\" constant=\"10\" id=\"CEh-7K-ZoI\"/>\n                            <constraint firstItem=\"im6-U7-wHu\" firstAttribute=\"top\" secondItem=\"dgf-HS-hD9\" secondAttribute=\"bottom\" constant=\"10\" id=\"CWb-Bz-KF3\"/>\n                            <constraint firstItem=\"dgf-HS-hD9\" firstAttribute=\"leading\" secondItem=\"E5E-9k-tLl\" secondAttribute=\"trailing\" constant=\"8\" id=\"Lcz-CJ-Y7G\"/>\n                            <constraint firstItem=\"MgK-zE-rJV\" firstAttribute=\"top\" secondItem=\"im6-U7-wHu\" secondAttribute=\"bottom\" constant=\"20\" id=\"Rbv-O5-ZQJ\"/>\n                            <constraint firstItem=\"HrB-Nl-Pdz\" firstAttribute=\"leading\" secondItem=\"mW5-NF-G9b\" secondAttribute=\"trailing\" constant=\"10\" id=\"Vrs-Fw-tfS\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"mW5-NF-G9b\" secondAttribute=\"trailing\" constant=\"10\" id=\"YCz-DE-cEp\"/>\n                            <constraint firstItem=\"E5E-9k-tLl\" firstAttribute=\"centerY\" secondItem=\"dgf-HS-hD9\" secondAttribute=\"centerY\" id=\"eYt-0f-Hq7\"/>\n                            <constraint firstItem=\"dgf-HS-hD9\" firstAttribute=\"centerY\" secondItem=\"mW5-NF-G9b\" secondAttribute=\"centerY\" id=\"eaw-da-4F3\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"HrB-Nl-Pdz\" secondAttribute=\"trailing\" constant=\"10\" id=\"fMp-Cl-umR\"/>\n                            <constraint firstItem=\"im6-U7-wHu\" firstAttribute=\"leading\" secondItem=\"dfj-Ka-bB6\" secondAttribute=\"leading\" constant=\"15\" id=\"h7b-ej-SVD\"/>\n                            <constraint firstItem=\"E5E-9k-tLl\" firstAttribute=\"leading\" secondItem=\"dfj-Ka-bB6\" secondAttribute=\"leading\" constant=\"15\" id=\"jkr-rA-bi6\"/>\n                            <constraint firstItem=\"E5E-9k-tLl\" firstAttribute=\"top\" secondItem=\"ZHG-sj-dxE\" secondAttribute=\"bottom\" constant=\"20\" id=\"jrg-my-xEt\"/>\n                            <constraint firstItem=\"HrB-Nl-Pdz\" firstAttribute=\"top\" secondItem=\"mW5-NF-G9b\" secondAttribute=\"top\" id=\"uda-tM-hyk\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"im6-U7-wHu\" secondAttribute=\"trailing\" constant=\"15\" id=\"zMI-RD-7Jg\"/>\n                        </constraints>\n                        <variation key=\"default\">\n                            <mask key=\"constraints\">\n                                <exclude reference=\"YCz-DE-cEp\"/>\n                            </mask>\n                        </variation>\n                    </view>\n                    <connections>\n                        <outlet property=\"eventsLogView\" destination=\"im6-U7-wHu\" id=\"wxh-2Q-kyx\"/>\n                        <outlet property=\"fetchButton\" destination=\"mW5-NF-G9b\" id=\"YLS-tY-Oyr\"/>\n                        <outlet property=\"urlKeyField\" destination=\"dgf-HS-hD9\" id=\"MLu-jB-asM\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"0gK-iK-6sw\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2568\" y=\"-107\"/>\n        </scene>\n        <!--Data Cache Sample View Controller-->\n        <scene sceneID=\"khO-4W-3aW\">\n            <objects>\n                <viewController id=\"7LF-i8-XhB\" customClass=\"DataCacheSampleViewController\" customModule=\"ExampleSample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"CQG-Tc-TjI\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"OoJ-GG-gGi\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"13V-wh-oYq\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"URL\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"NwM-fB-p72\">\n                                <rect key=\"frame\" x=\"15\" y=\"108\" width=\"32\" height=\"20.5\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"249\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" borderStyle=\"roundedRect\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"JYB-EG-jLU\">\n                                <rect key=\"frame\" x=\"55\" y=\"101.5\" width=\"309\" height=\"34\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\"/>\n                                <connections>\n                                    <outlet property=\"delegate\" destination=\"7LF-i8-XhB\" id=\"5E9-o3-s1Q\"/>\n                                </connections>\n                            </textField>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" enabled=\"NO\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"aIa-1Z-xFc\">\n                                <rect key=\"frame\" x=\"374\" y=\"103.5\" width=\"30\" height=\"30\"/>\n                                <state key=\"normal\" title=\"GET\">\n                                    <color key=\"titleShadowColor\" red=\"0.5\" green=\"0.5\" blue=\"0.5\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                </state>\n                                <connections>\n                                    <action selector=\"fetchButtonTapped:\" destination=\"7LF-i8-XhB\" eventType=\"touchUpInside\" id=\"nDr-R8-SMg\"/>\n                                </connections>\n                            </button>\n                            <textView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" showsHorizontalScrollIndicator=\"NO\" editable=\"NO\" selectable=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"jfn-eV-aaj\">\n                                <rect key=\"frame\" x=\"15\" y=\"145.5\" width=\"384\" height=\"696.5\"/>\n                                <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\" autocapitalizationType=\"sentences\"/>\n                                <dataDetectorType key=\"dataDetectorTypes\" link=\"YES\"/>\n                            </textView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"aIa-1Z-xFc\" secondAttribute=\"trailing\" constant=\"10\" id=\"4zh-6Q-Z2z\"/>\n                            <constraint firstItem=\"jfn-eV-aaj\" firstAttribute=\"top\" secondItem=\"JYB-EG-jLU\" secondAttribute=\"bottom\" constant=\"10\" id=\"57I-4V-sHu\"/>\n                            <constraint firstItem=\"JYB-EG-jLU\" firstAttribute=\"leading\" secondItem=\"NwM-fB-p72\" secondAttribute=\"trailing\" constant=\"8\" id=\"5Xy-j2-hcg\"/>\n                            <constraint firstItem=\"OoJ-GG-gGi\" firstAttribute=\"top\" secondItem=\"jfn-eV-aaj\" secondAttribute=\"bottom\" constant=\"20\" id=\"6uh-sA-KpZ\"/>\n                            <constraint firstItem=\"jfn-eV-aaj\" firstAttribute=\"leading\" secondItem=\"13V-wh-oYq\" secondAttribute=\"leading\" constant=\"15\" id=\"7IM-Ay-XZB\"/>\n                            <constraint firstItem=\"NwM-fB-p72\" firstAttribute=\"top\" secondItem=\"CQG-Tc-TjI\" secondAttribute=\"bottom\" constant=\"20\" id=\"KtE-Yp-6l5\"/>\n                            <constraint firstItem=\"JYB-EG-jLU\" firstAttribute=\"centerY\" secondItem=\"aIa-1Z-xFc\" secondAttribute=\"centerY\" id=\"LVv-Ek-S7D\"/>\n                            <constraint firstItem=\"NwM-fB-p72\" firstAttribute=\"leading\" secondItem=\"13V-wh-oYq\" secondAttribute=\"leading\" constant=\"15\" id=\"Ox1-hP-cZ5\"/>\n                            <constraint firstItem=\"NwM-fB-p72\" firstAttribute=\"centerY\" secondItem=\"JYB-EG-jLU\" secondAttribute=\"centerY\" id=\"baJ-Mi-fDw\"/>\n                            <constraint firstItem=\"aIa-1Z-xFc\" firstAttribute=\"leading\" secondItem=\"JYB-EG-jLU\" secondAttribute=\"trailing\" constant=\"10\" id=\"dXI-G5-gZc\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"jfn-eV-aaj\" secondAttribute=\"trailing\" constant=\"15\" id=\"wRy-Ha-sch\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"eventsLogView\" destination=\"jfn-eV-aaj\" id=\"Anz-Bo-OXQ\"/>\n                        <outlet property=\"fetchButton\" destination=\"aIa-1Z-xFc\" id=\"4gY-02-GnF\"/>\n                        <outlet property=\"urlKeyField\" destination=\"JYB-EG-jLU\" id=\"k5S-AE-h6A\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"ca0-Fg-jxp\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"2568\" y=\"542\"/>\n        </scene>\n        <!--Memory Warning Sample View Controller-->\n        <scene sceneID=\"hma-DI-OkF\">\n            <objects>\n                <viewController id=\"cPe-S0-2ZW\" customClass=\"MemoryWarningSampleViewController\" customModule=\"ExampleSample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"lGA-6z-QuD\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"odO-Gz-ACa\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"wfX-xx-MEv\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <textView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" showsHorizontalScrollIndicator=\"NO\" editable=\"NO\" selectable=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"sad-b1-Sf1\">\n                                <rect key=\"frame\" x=\"15\" y=\"219\" width=\"384\" height=\"623\"/>\n                                <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\" autocapitalizationType=\"sentences\"/>\n                                <dataDetectorType key=\"dataDetectorTypes\" link=\"YES\"/>\n                            </textView>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"URL\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ZeE-lX-MYe\">\n                                <rect key=\"frame\" x=\"15\" y=\"103\" width=\"32\" height=\"20.5\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"249\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" borderStyle=\"roundedRect\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"UcN-2z-7j8\">\n                                <rect key=\"frame\" x=\"55\" y=\"96.5\" width=\"304\" height=\"34\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\"/>\n                                <connections>\n                                    <outlet property=\"delegate\" destination=\"cPe-S0-2ZW\" id=\"vOp-Kn-4b0\"/>\n                                </connections>\n                            </textField>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" enabled=\"NO\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"aKd-Xf-aTr\">\n                                <rect key=\"frame\" x=\"369\" y=\"98.5\" width=\"30\" height=\"30\"/>\n                                <state key=\"normal\" title=\"GET\">\n                                    <color key=\"titleShadowColor\" red=\"0.5\" green=\"0.5\" blue=\"0.5\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                </state>\n                                <connections>\n                                    <action selector=\"fetchButtonTapped:\" destination=\"cPe-S0-2ZW\" eventType=\"touchUpInside\" id=\"2LI-gz-Ndz\"/>\n                                </connections>\n                            </button>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Listen to memory warnings\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"A6H-F9-JmE\">\n                                <rect key=\"frame\" x=\"15\" y=\"143.5\" width=\"205.5\" height=\"20.5\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <switch opaque=\"NO\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"750\" verticalHuggingPriority=\"750\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"kHb-dy-ALY\">\n                                <rect key=\"frame\" x=\"230.5\" y=\"138.5\" width=\"51\" height=\"31\"/>\n                                <connections>\n                                    <action selector=\"memoryWarningSwitchValueChanged:\" destination=\"cPe-S0-2ZW\" eventType=\"valueChanged\" id=\"40y-r3-z1D\"/>\n                                </connections>\n                            </switch>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"LSb-vc-hw5\">\n                                <rect key=\"frame\" x=\"15\" y=\"174\" width=\"178\" height=\"30\"/>\n                                <state key=\"normal\" title=\"Simulate memory warning\">\n                                    <color key=\"titleShadowColor\" red=\"0.5\" green=\"0.5\" blue=\"0.5\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                </state>\n                                <connections>\n                                    <action selector=\"simulateMemoryWarning:\" destination=\"cPe-S0-2ZW\" eventType=\"touchUpInside\" id=\"36R-6L-W7c\"/>\n                                </connections>\n                            </button>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"sad-b1-Sf1\" firstAttribute=\"top\" secondItem=\"LSb-vc-hw5\" secondAttribute=\"bottom\" constant=\"15\" id=\"1KA-SL-nxb\"/>\n                            <constraint firstItem=\"odO-Gz-ACa\" firstAttribute=\"top\" secondItem=\"sad-b1-Sf1\" secondAttribute=\"bottom\" constant=\"20\" id=\"75R-bY-2bh\"/>\n                            <constraint firstItem=\"ZeE-lX-MYe\" firstAttribute=\"leading\" secondItem=\"wfX-xx-MEv\" secondAttribute=\"leading\" constant=\"15\" id=\"98s-yv-TMK\"/>\n                            <constraint firstItem=\"kHb-dy-ALY\" firstAttribute=\"leading\" secondItem=\"A6H-F9-JmE\" secondAttribute=\"trailing\" constant=\"10\" id=\"DP9-Hs-9SP\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"aKd-Xf-aTr\" secondAttribute=\"trailing\" constant=\"15\" id=\"HaO-p6-dar\"/>\n                            <constraint firstItem=\"LSb-vc-hw5\" firstAttribute=\"top\" secondItem=\"A6H-F9-JmE\" secondAttribute=\"bottom\" constant=\"10\" id=\"Jro-9I-jxl\"/>\n                            <constraint firstItem=\"UcN-2z-7j8\" firstAttribute=\"centerY\" secondItem=\"aKd-Xf-aTr\" secondAttribute=\"centerY\" id=\"Qd5-eU-WaN\"/>\n                            <constraint firstItem=\"UcN-2z-7j8\" firstAttribute=\"leading\" secondItem=\"ZeE-lX-MYe\" secondAttribute=\"trailing\" constant=\"8\" id=\"aOp-mr-EF5\"/>\n                            <constraint firstItem=\"ZeE-lX-MYe\" firstAttribute=\"top\" secondItem=\"lGA-6z-QuD\" secondAttribute=\"bottom\" constant=\"15\" id=\"cgO-By-MJg\"/>\n                            <constraint firstItem=\"A6H-F9-JmE\" firstAttribute=\"leading\" secondItem=\"LSb-vc-hw5\" secondAttribute=\"leading\" id=\"eKa-kC-z64\"/>\n                            <constraint firstAttribute=\"trailing\" relation=\"greaterThanOrEqual\" secondItem=\"LSb-vc-hw5\" secondAttribute=\"trailing\" constant=\"20\" symbolic=\"YES\" id=\"hiq-Mc-uom\"/>\n                            <constraint firstItem=\"ZeE-lX-MYe\" firstAttribute=\"centerY\" secondItem=\"UcN-2z-7j8\" secondAttribute=\"centerY\" id=\"iLe-ba-FKz\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"sad-b1-Sf1\" secondAttribute=\"trailing\" constant=\"15\" id=\"kdC-7e-N73\"/>\n                            <constraint firstItem=\"sad-b1-Sf1\" firstAttribute=\"leading\" secondItem=\"wfX-xx-MEv\" secondAttribute=\"leading\" constant=\"15\" id=\"nUp-ab-dyE\"/>\n                            <constraint firstItem=\"aKd-Xf-aTr\" firstAttribute=\"leading\" secondItem=\"UcN-2z-7j8\" secondAttribute=\"trailing\" constant=\"10\" id=\"xd5-Xo-icA\"/>\n                            <constraint firstItem=\"A6H-F9-JmE\" firstAttribute=\"centerY\" secondItem=\"kHb-dy-ALY\" secondAttribute=\"centerY\" id=\"y73-se-6u5\"/>\n                            <constraint firstItem=\"A6H-F9-JmE\" firstAttribute=\"leading\" secondItem=\"ZeE-lX-MYe\" secondAttribute=\"leading\" id=\"zAB-qK-IKu\"/>\n                            <constraint firstItem=\"A6H-F9-JmE\" firstAttribute=\"top\" secondItem=\"ZeE-lX-MYe\" secondAttribute=\"bottom\" constant=\"20\" id=\"zvC-DE-mwT\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"eventsLogView\" destination=\"sad-b1-Sf1\" id=\"Ghy-FJ-gwc\"/>\n                        <outlet property=\"fetchButton\" destination=\"aKd-Xf-aTr\" id=\"Xrn-vK-1Fr\"/>\n                        <outlet property=\"urlKeyField\" destination=\"UcN-2z-7j8\" id=\"A4D-vD-O79\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"vs5-mw-GDF\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1938\" y=\"1061\"/>\n        </scene>\n        <!--Complex Cache Sample View Controller-->\n        <scene sceneID=\"aj4-RD-vTS\">\n            <objects>\n                <viewController id=\"gIf-ro-V0s\" customClass=\"ComplexCacheSampleViewController\" customModule=\"ExampleSample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"X4q-4j-FS4\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"RdR-FT-xDV\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"2N0-8r-Hbq\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Name\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"yIm-5Y-B6a\">\n                                <rect key=\"frame\" x=\"10\" y=\"98\" width=\"59\" height=\"20.5\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Identifier\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"s3E-lA-2v8\">\n                                <rect key=\"frame\" x=\"10\" y=\"138.5\" width=\"68\" height=\"20.5\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"URL\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"pcF-5E-GOH\">\n                                <rect key=\"frame\" x=\"10\" y=\"179\" width=\"32\" height=\"20.5\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"249\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" borderStyle=\"roundedRect\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"BBY-oO-Ku8\">\n                                <rect key=\"frame\" x=\"119\" y=\"91.5\" width=\"230\" height=\"34\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\"/>\n                            </textField>\n                            <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"249\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" borderStyle=\"roundedRect\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"hEr-bX-yV4\">\n                                <rect key=\"frame\" x=\"119\" y=\"132\" width=\"60\" height=\"34\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"width\" constant=\"60\" id=\"owT-N0-gY7\"/>\n                                </constraints>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\" keyboardType=\"numberPad\"/>\n                            </textField>\n                            <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"249\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" borderStyle=\"roundedRect\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Hge-tE-qbS\">\n                                <rect key=\"frame\" x=\"119\" y=\"172.5\" width=\"230\" height=\"34\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\" keyboardType=\"URL\"/>\n                            </textField>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"hXi-Q3-Wks\">\n                                <rect key=\"frame\" x=\"369\" y=\"98\" width=\"30\" height=\"30\"/>\n                                <state key=\"normal\" title=\"GET\">\n                                    <color key=\"titleShadowColor\" red=\"0.5\" green=\"0.5\" blue=\"0.5\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                </state>\n                                <connections>\n                                    <action selector=\"fetchButtonTapped:\" destination=\"gIf-ro-V0s\" eventType=\"touchUpInside\" id=\"HcG-wy-QJR\"/>\n                                </connections>\n                            </button>\n                            <textView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" showsHorizontalScrollIndicator=\"NO\" editable=\"NO\" selectable=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ntU-3t-idC\">\n                                <rect key=\"frame\" x=\"10\" y=\"226.5\" width=\"389\" height=\"615.5\"/>\n                                <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\" autocapitalizationType=\"sentences\"/>\n                            </textView>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"Custom cache will fail with negative identifiers\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"8\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"4Q0-op-ZWe\">\n                                <rect key=\"frame\" x=\"194\" y=\"129\" width=\"205\" height=\"40\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"40\" id=\"6G0-1a-ncq\"/>\n                                </constraints>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"12\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"ntU-3t-idC\" firstAttribute=\"leading\" secondItem=\"pcF-5E-GOH\" secondAttribute=\"leading\" id=\"0ro-vN-cbA\"/>\n                            <constraint firstItem=\"pcF-5E-GOH\" firstAttribute=\"centerY\" secondItem=\"Hge-tE-qbS\" secondAttribute=\"centerY\" id=\"29G-U8-Y4c\"/>\n                            <constraint firstItem=\"s3E-lA-2v8\" firstAttribute=\"leading\" secondItem=\"yIm-5Y-B6a\" secondAttribute=\"leading\" id=\"581-hk-IC7\"/>\n                            <constraint firstItem=\"hEr-bX-yV4\" firstAttribute=\"leading\" relation=\"greaterThanOrEqual\" secondItem=\"s3E-lA-2v8\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"6ve-xd-fDa\"/>\n                            <constraint firstItem=\"BBY-oO-Ku8\" firstAttribute=\"leading\" secondItem=\"hEr-bX-yV4\" secondAttribute=\"leading\" id=\"84t-UY-SgW\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"hXi-Q3-Wks\" secondAttribute=\"trailing\" constant=\"15\" id=\"BfY-2Q-iXY\"/>\n                            <constraint firstItem=\"BBY-oO-Ku8\" firstAttribute=\"leading\" secondItem=\"yIm-5Y-B6a\" secondAttribute=\"trailing\" constant=\"50\" id=\"BxA-zX-SpM\"/>\n                            <constraint firstItem=\"ntU-3t-idC\" firstAttribute=\"trailing\" secondItem=\"hXi-Q3-Wks\" secondAttribute=\"trailing\" id=\"DM2-Ga-n8l\"/>\n                            <constraint firstItem=\"RdR-FT-xDV\" firstAttribute=\"top\" secondItem=\"ntU-3t-idC\" secondAttribute=\"bottom\" constant=\"20\" id=\"FuM-3w-VjC\"/>\n                            <constraint firstItem=\"Hge-tE-qbS\" firstAttribute=\"leading\" relation=\"greaterThanOrEqual\" secondItem=\"pcF-5E-GOH\" secondAttribute=\"trailing\" constant=\"8\" symbolic=\"YES\" id=\"Heb-CF-OTb\"/>\n                            <constraint firstItem=\"s3E-lA-2v8\" firstAttribute=\"leading\" secondItem=\"pcF-5E-GOH\" secondAttribute=\"leading\" id=\"KpI-dB-vqZ\"/>\n                            <constraint firstItem=\"yIm-5Y-B6a\" firstAttribute=\"leading\" secondItem=\"2N0-8r-Hbq\" secondAttribute=\"leading\" constant=\"10\" id=\"P3f-IJ-4M1\"/>\n                            <constraint firstItem=\"s3E-lA-2v8\" firstAttribute=\"centerY\" secondItem=\"hEr-bX-yV4\" secondAttribute=\"centerY\" id=\"SNs-TF-TxF\"/>\n                            <constraint firstItem=\"4Q0-op-ZWe\" firstAttribute=\"centerY\" secondItem=\"hEr-bX-yV4\" secondAttribute=\"centerY\" id=\"V2o-Nv-GeY\"/>\n                            <constraint firstItem=\"yIm-5Y-B6a\" firstAttribute=\"centerY\" secondItem=\"BBY-oO-Ku8\" secondAttribute=\"centerY\" id=\"VbB-ya-NBZ\"/>\n                            <constraint firstItem=\"s3E-lA-2v8\" firstAttribute=\"top\" secondItem=\"yIm-5Y-B6a\" secondAttribute=\"bottom\" constant=\"20\" id=\"XgW-Ti-DPT\"/>\n                            <constraint firstItem=\"pcF-5E-GOH\" firstAttribute=\"top\" secondItem=\"s3E-lA-2v8\" secondAttribute=\"bottom\" constant=\"20\" id=\"Y0K-1E-xLj\"/>\n                            <constraint firstItem=\"4Q0-op-ZWe\" firstAttribute=\"leading\" secondItem=\"hEr-bX-yV4\" secondAttribute=\"trailing\" constant=\"15\" id=\"bUc-sm-yco\"/>\n                            <constraint firstItem=\"hEr-bX-yV4\" firstAttribute=\"leading\" secondItem=\"Hge-tE-qbS\" secondAttribute=\"leading\" id=\"geD-ja-fNs\"/>\n                            <constraint firstItem=\"hXi-Q3-Wks\" firstAttribute=\"top\" secondItem=\"X4q-4j-FS4\" secondAttribute=\"bottom\" constant=\"10\" id=\"jfd-VA-9jR\"/>\n                            <constraint firstItem=\"hXi-Q3-Wks\" firstAttribute=\"leading\" secondItem=\"BBY-oO-Ku8\" secondAttribute=\"trailing\" constant=\"20\" id=\"kfW-3F-ebn\"/>\n                            <constraint firstItem=\"BBY-oO-Ku8\" firstAttribute=\"trailing\" secondItem=\"Hge-tE-qbS\" secondAttribute=\"trailing\" id=\"nRU-vP-5BN\"/>\n                            <constraint firstItem=\"ntU-3t-idC\" firstAttribute=\"top\" secondItem=\"Hge-tE-qbS\" secondAttribute=\"bottom\" constant=\"20\" id=\"nh8-Uf-utc\"/>\n                            <constraint firstItem=\"yIm-5Y-B6a\" firstAttribute=\"top\" secondItem=\"X4q-4j-FS4\" secondAttribute=\"bottom\" constant=\"10\" id=\"rGV-TT-Jvg\"/>\n                            <constraint firstItem=\"4Q0-op-ZWe\" firstAttribute=\"trailing\" secondItem=\"hXi-Q3-Wks\" secondAttribute=\"trailing\" id=\"ygw-BB-3af\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"eventsLogView\" destination=\"ntU-3t-idC\" id=\"Gz8-QE-9ek\"/>\n                        <outlet property=\"fetchButton\" destination=\"hXi-Q3-Wks\" id=\"raH-bf-pev\"/>\n                        <outlet property=\"identifierField\" destination=\"hEr-bX-yV4\" id=\"buq-yK-NOy\"/>\n                        <outlet property=\"nameField\" destination=\"BBY-oO-Ku8\" id=\"SJL-u6-39R\"/>\n                        <outlet property=\"urlField\" destination=\"Hge-tE-qbS\" id=\"MpF-m2-Zbu\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"lah-mn-lYd\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1938\" y=\"1800\"/>\n        </scene>\n        <!--Switch Cache Sample View Controller-->\n        <scene sceneID=\"eC7-Oe-5iE\">\n            <objects>\n                <viewController id=\"iWa-HA-Zrq\" customClass=\"SwitchCacheSampleViewController\" customModule=\"ExampleSample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"i7b-44-0OL\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"9QQ-Fm-S11\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"H2D-Fe-zKy\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"URL\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"HTh-Zb-vvl\">\n                                <rect key=\"frame\" x=\"15\" y=\"20\" width=\"32\" height=\"206\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" enabled=\"NO\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"Ppu-Sq-ZGW\">\n                                <rect key=\"frame\" x=\"369\" y=\"108\" width=\"30\" height=\"30\"/>\n                                <state key=\"normal\" title=\"GET\">\n                                    <color key=\"titleShadowColor\" red=\"0.5\" green=\"0.5\" blue=\"0.5\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                </state>\n                                <connections>\n                                    <action selector=\"fetchButtonTapped:\" destination=\"iWa-HA-Zrq\" eventType=\"touchUpInside\" id=\"xqX-uX-riP\"/>\n                                </connections>\n                            </button>\n                            <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"249\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" borderStyle=\"roundedRect\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"sOl-gY-O3N\">\n                                <rect key=\"frame\" x=\"55\" y=\"106\" width=\"304\" height=\"34\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\"/>\n                                <connections>\n                                    <outlet property=\"delegate\" destination=\"iWa-HA-Zrq\" id=\"ubi-Lj-sL7\"/>\n                                </connections>\n                            </textField>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" lineBreakMode=\"tailTruncation\" numberOfLines=\"0\" baselineAdjustment=\"alignBaselines\" minimumFontSize=\"10\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"as8-gf-0lg\">\n                                <rect key=\"frame\" x=\"15\" y=\"241\" width=\"384\" height=\"70\"/>\n                                <constraints>\n                                    <constraint firstAttribute=\"height\" constant=\"70\" id=\"bPK-9q-Htv\"/>\n                                </constraints>\n                                <string key=\"text\">This cache will only fetch from memory if the key doesn't start with \"http:\". Otherwise it will fetch from a normal data cache (NSURL -&gt; NSData). On memory there are 2 values already preset, with keys \"test\" and \"carlos\"</string>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"15\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <textView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" showsHorizontalScrollIndicator=\"NO\" editable=\"NO\" selectable=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"iXw-VA-7uJ\">\n                                <rect key=\"frame\" x=\"15\" y=\"321\" width=\"384\" height=\"555\"/>\n                                <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\" autocapitalizationType=\"sentences\"/>\n                                <dataDetectorType key=\"dataDetectorTypes\" link=\"YES\"/>\n                            </textView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"iXw-VA-7uJ\" secondAttribute=\"trailing\" constant=\"15\" id=\"0hu-3q-fU3\"/>\n                            <constraint firstItem=\"Ppu-Sq-ZGW\" firstAttribute=\"leading\" secondItem=\"sOl-gY-O3N\" secondAttribute=\"trailing\" constant=\"10\" id=\"2r5-JQ-aDH\"/>\n                            <constraint firstItem=\"sOl-gY-O3N\" firstAttribute=\"centerY\" secondItem=\"Ppu-Sq-ZGW\" secondAttribute=\"centerY\" id=\"4f0-ib-TEA\"/>\n                            <constraint firstAttribute=\"bottom\" secondItem=\"iXw-VA-7uJ\" secondAttribute=\"bottom\" constant=\"20\" id=\"9ao-vm-eam\"/>\n                            <constraint firstItem=\"as8-gf-0lg\" firstAttribute=\"top\" secondItem=\"HTh-Zb-vvl\" secondAttribute=\"bottom\" constant=\"15\" id=\"CQs-2P-dRR\"/>\n                            <constraint firstItem=\"HTh-Zb-vvl\" firstAttribute=\"centerY\" secondItem=\"sOl-gY-O3N\" secondAttribute=\"centerY\" id=\"Cvz-gG-jjP\"/>\n                            <constraint firstItem=\"HTh-Zb-vvl\" firstAttribute=\"leading\" secondItem=\"H2D-Fe-zKy\" secondAttribute=\"leading\" constant=\"15\" id=\"RUM-Yw-A5q\"/>\n                            <constraint firstItem=\"iXw-VA-7uJ\" firstAttribute=\"leading\" secondItem=\"H2D-Fe-zKy\" secondAttribute=\"leading\" constant=\"15\" id=\"UlS-5i-VeH\"/>\n                            <constraint firstItem=\"as8-gf-0lg\" firstAttribute=\"leading\" secondItem=\"HTh-Zb-vvl\" secondAttribute=\"leading\" id=\"V53-VA-eRl\"/>\n                            <constraint firstItem=\"as8-gf-0lg\" firstAttribute=\"trailing\" secondItem=\"Ppu-Sq-ZGW\" secondAttribute=\"trailing\" id=\"XW1-QS-Y1n\"/>\n                            <constraint firstItem=\"Ppu-Sq-ZGW\" firstAttribute=\"top\" secondItem=\"i7b-44-0OL\" secondAttribute=\"bottom\" constant=\"20\" id=\"blc-GL-5JX\"/>\n                            <constraint firstItem=\"iXw-VA-7uJ\" firstAttribute=\"top\" secondItem=\"as8-gf-0lg\" secondAttribute=\"bottom\" constant=\"10\" id=\"c0X-C8-M0P\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"Ppu-Sq-ZGW\" secondAttribute=\"trailing\" constant=\"15\" id=\"mGR-u3-5js\"/>\n                            <constraint firstItem=\"HTh-Zb-vvl\" firstAttribute=\"top\" secondItem=\"H2D-Fe-zKy\" secondAttribute=\"top\" constant=\"20\" id=\"oCq-FT-Fdv\"/>\n                            <constraint firstItem=\"sOl-gY-O3N\" firstAttribute=\"leading\" secondItem=\"HTh-Zb-vvl\" secondAttribute=\"trailing\" constant=\"8\" id=\"ujj-Xz-kF3\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"eventsLogView\" destination=\"iXw-VA-7uJ\" id=\"Thu-dD-8Hl\"/>\n                        <outlet property=\"fetchButton\" destination=\"Ppu-Sq-ZGW\" id=\"0bs-1N-mvg\"/>\n                        <outlet property=\"urlKeyField\" destination=\"sOl-gY-O3N\" id=\"FjS-1p-z9h\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"OfR-on-4hE\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1943\" y=\"3261\"/>\n        </scene>\n        <!--Navigation Controller-->\n        <scene sceneID=\"UhF-5b-PDi\">\n            <objects>\n                <navigationController automaticallyAdjustsScrollViewInsets=\"NO\" id=\"VM7-XC-H0K\" sceneMemberID=\"viewController\">\n                    <toolbarItems/>\n                    <navigationBar key=\"navigationBar\" contentMode=\"scaleToFill\" id=\"E4K-vE-LWf\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"44\" width=\"414\" height=\"44\"/>\n                        <autoresizingMask key=\"autoresizingMask\"/>\n                    </navigationBar>\n                    <nil name=\"viewControllers\"/>\n                    <connections>\n                        <segue destination=\"BYZ-38-t0r\" kind=\"relationship\" relationship=\"rootViewController\" id=\"4Wy-H5-NaV\"/>\n                    </connections>\n                </navigationController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"M0Z-pI-LqS\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"215\" y=\"325\"/>\n        </scene>\n        <!--Cache Sample View Controller-->\n        <scene sceneID=\"NXV-C1-zpJ\">\n            <objects>\n                <viewController id=\"cc7-Is-Czm\" customClass=\"JSONCacheSampleViewController\" customModule=\"ExampleSample\" customModuleProvider=\"target\" sceneMemberID=\"viewController\">\n                    <layoutGuides>\n                        <viewControllerLayoutGuide type=\"top\" id=\"mci-fL-yAf\"/>\n                        <viewControllerLayoutGuide type=\"bottom\" id=\"Yn3-SI-WfC\"/>\n                    </layoutGuides>\n                    <view key=\"view\" contentMode=\"scaleToFill\" id=\"9ls-YL-m4d\">\n                        <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"414\" height=\"896\"/>\n                        <autoresizingMask key=\"autoresizingMask\" widthSizable=\"YES\" heightSizable=\"YES\"/>\n                        <subviews>\n                            <label opaque=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"left\" horizontalHuggingPriority=\"251\" verticalHuggingPriority=\"251\" text=\"URL\" lineBreakMode=\"tailTruncation\" baselineAdjustment=\"alignBaselines\" adjustsFontSizeToFit=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"8WF-2i-3DR\">\n                                <rect key=\"frame\" x=\"15\" y=\"108\" width=\"32\" height=\"20.5\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"17\"/>\n                                <color key=\"textColor\" red=\"0.0\" green=\"0.0\" blue=\"0.0\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <nil key=\"highlightedColor\"/>\n                            </label>\n                            <textField opaque=\"NO\" clipsSubviews=\"YES\" contentMode=\"scaleToFill\" horizontalHuggingPriority=\"249\" contentHorizontalAlignment=\"left\" contentVerticalAlignment=\"center\" borderStyle=\"roundedRect\" minimumFontSize=\"17\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"GQ8-1e-o6f\">\n                                <rect key=\"frame\" x=\"55\" y=\"101.5\" width=\"309\" height=\"34\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\"/>\n                                <connections>\n                                    <outlet property=\"delegate\" destination=\"cc7-Is-Czm\" id=\"Bgk-gK-bFG\"/>\n                                </connections>\n                            </textField>\n                            <button opaque=\"NO\" contentMode=\"scaleToFill\" enabled=\"NO\" contentHorizontalAlignment=\"center\" contentVerticalAlignment=\"center\" buttonType=\"system\" lineBreakMode=\"middleTruncation\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"cjQ-Nq-DaI\">\n                                <rect key=\"frame\" x=\"374\" y=\"103.5\" width=\"30\" height=\"30\"/>\n                                <state key=\"normal\" title=\"GET\">\n                                    <color key=\"titleShadowColor\" red=\"0.5\" green=\"0.5\" blue=\"0.5\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                </state>\n                                <connections>\n                                    <action selector=\"fetchButtonTapped:\" destination=\"cc7-Is-Czm\" eventType=\"touchUpInside\" id=\"Cre-nS-cKU\"/>\n                                </connections>\n                            </button>\n                            <textView clipsSubviews=\"YES\" multipleTouchEnabled=\"YES\" contentMode=\"scaleToFill\" showsHorizontalScrollIndicator=\"NO\" editable=\"NO\" selectable=\"NO\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"ix9-vz-94e\">\n                                <rect key=\"frame\" x=\"15\" y=\"145.5\" width=\"384\" height=\"696.5\"/>\n                                <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                                <fontDescription key=\"fontDescription\" type=\"system\" pointSize=\"14\"/>\n                                <textInputTraits key=\"textInputTraits\" autocapitalizationType=\"sentences\"/>\n                                <dataDetectorType key=\"dataDetectorTypes\" link=\"YES\"/>\n                            </textView>\n                        </subviews>\n                        <color key=\"backgroundColor\" red=\"1\" green=\"1\" blue=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n                        <constraints>\n                            <constraint firstItem=\"GQ8-1e-o6f\" firstAttribute=\"centerY\" secondItem=\"cjQ-Nq-DaI\" secondAttribute=\"centerY\" id=\"C3a-Kj-bbI\"/>\n                            <constraint firstItem=\"8WF-2i-3DR\" firstAttribute=\"leading\" secondItem=\"9ls-YL-m4d\" secondAttribute=\"leading\" constant=\"15\" id=\"Jrs-cF-WGo\"/>\n                            <constraint firstItem=\"cjQ-Nq-DaI\" firstAttribute=\"leading\" secondItem=\"GQ8-1e-o6f\" secondAttribute=\"trailing\" constant=\"10\" id=\"Ret-eI-utE\"/>\n                            <constraint firstItem=\"ix9-vz-94e\" firstAttribute=\"leading\" secondItem=\"9ls-YL-m4d\" secondAttribute=\"leading\" constant=\"15\" id=\"Sn8-Da-GJ7\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"ix9-vz-94e\" secondAttribute=\"trailing\" constant=\"15\" id=\"U2j-lq-qdi\"/>\n                            <constraint firstAttribute=\"trailing\" secondItem=\"cjQ-Nq-DaI\" secondAttribute=\"trailing\" constant=\"10\" id=\"aRj-Ql-lWF\"/>\n                            <constraint firstItem=\"GQ8-1e-o6f\" firstAttribute=\"leading\" secondItem=\"8WF-2i-3DR\" secondAttribute=\"trailing\" constant=\"8\" id=\"f6o-gD-FOh\"/>\n                            <constraint firstItem=\"ix9-vz-94e\" firstAttribute=\"top\" secondItem=\"GQ8-1e-o6f\" secondAttribute=\"bottom\" constant=\"10\" id=\"hos-7K-3Hv\"/>\n                            <constraint firstItem=\"8WF-2i-3DR\" firstAttribute=\"centerY\" secondItem=\"GQ8-1e-o6f\" secondAttribute=\"centerY\" id=\"j6f-Bf-DEb\"/>\n                            <constraint firstItem=\"8WF-2i-3DR\" firstAttribute=\"top\" secondItem=\"mci-fL-yAf\" secondAttribute=\"bottom\" constant=\"20\" id=\"jUV-c2-mJh\"/>\n                            <constraint firstItem=\"Yn3-SI-WfC\" firstAttribute=\"top\" secondItem=\"ix9-vz-94e\" secondAttribute=\"bottom\" constant=\"20\" id=\"kln-uN-1zd\"/>\n                        </constraints>\n                    </view>\n                    <connections>\n                        <outlet property=\"eventsLogView\" destination=\"ix9-vz-94e\" id=\"ezK-SC-9NC\"/>\n                        <outlet property=\"fetchButton\" destination=\"cjQ-Nq-DaI\" id=\"JQX-3V-rmL\"/>\n                        <outlet property=\"urlKeyField\" destination=\"GQ8-1e-o6f\" id=\"uRd-P3-Zvu\"/>\n                    </connections>\n                </viewController>\n                <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"NVd-nQ-2uX\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n            </objects>\n            <point key=\"canvasLocation\" x=\"1198\" y=\"-389\"/>\n        </scene>\n    </scenes>\n    <resources>\n        <systemColor name=\"systemBackgroundColor\">\n            <color white=\"1\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"genericGamma22GrayColorSpace\"/>\n        </systemColor>\n    </resources>\n</document>\n"
  },
  {
    "path": "Example/Example/BaseCacheViewController.swift",
    "content": "import Carlos\nimport Foundation\nimport UIKit\n\nclass BaseCacheViewController: UIViewController {\n  @IBOutlet var urlKeyField: UITextField?\n  @IBOutlet var fetchButton: UIButton!\n  @IBOutlet var eventsLogView: UITextView!\n\n  override func viewDidLoad() {\n    super.viewDidLoad()\n\n    title = titleForScreen()\n\n    setupCache()\n\n    Logger.output = { message, _ in\n      self.eventsLogView.text = \"\\(self.eventsLogView.text!)\\(message)\\n\"\n    }\n  }\n\n  func setupCache() {}\n\n  func fetchRequested() {}\n\n  func titleForScreen() -> String {\n    \"Carlos Sample\"\n  }\n\n  @IBAction func fetchButtonTapped(_: AnyObject) {\n    fetchRequested()\n\n    urlKeyField?.resignFirstResponder()\n  }\n}\n\nextension BaseCacheViewController: UITextFieldDelegate {\n  func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {\n    if let text = textField.text {\n      let newText = (text as NSString).replacingCharacters(in: range, with: string)\n      let textIsURL = URL(string: newText) != nil\n      fetchButton.isEnabled = textIsURL\n    }\n\n    return true\n  }\n}\n"
  },
  {
    "path": "Example/Example/ComplexCacheSampleViewController.swift",
    "content": "import Foundation\nimport UIKit\n\nimport Carlos\nimport Combine\n\nstruct ModelDomain {\n  let name: String\n  let identifier: Int\n  let URL: Foundation.URL\n}\n\nextension ModelDomain: StringConvertible {\n  func toString() -> String {\n    \"\\(identifier)\"\n  }\n}\n\nenum IgnoreError: Error {\n  case ignore\n}\n\nclass CustomCacheLevel: Fetcher {\n  typealias KeyType = Int\n  typealias OutputType = String\n\n  func get(_ key: KeyType) -> AnyPublisher<OutputType, Error> {\n    if key > 0 {\n      Logger.log(\"Fetched \\(key) on the custom cache\", .info)\n      return Just(\"\\(key)\")\n        .setFailureType(to: Error.self)\n        .eraseToAnyPublisher()\n    }\n\n    Logger.log(\"Failed fetching \\(key) on the custom cache\", .info)\n    return Fail(error: IgnoreError.ignore).eraseToAnyPublisher()\n  }\n}\n\nclass ComplexCacheSampleViewController: BaseCacheViewController {\n  @IBOutlet var nameField: UITextField!\n  @IBOutlet var identifierField: UITextField!\n  @IBOutlet var urlField: UITextField!\n\n  private var cache: BasicCache<ModelDomain, NSData>!\n\n  private var cancellables = Set<AnyCancellable>()\n\n  override func titleForScreen() -> String {\n    \"Complex cache\"\n  }\n\n  override func setupCache() {\n    super.setupCache()\n\n    let modelDomainToString = OneWayTransformationBox<ModelDomain, String>(transform: {\n      Just($0.name).setFailureType(to: Error.self).eraseToAnyPublisher()\n    })\n\n    let modelDomainToInt = OneWayTransformationBox<ModelDomain, Int>(transform: {\n      Just($0.identifier).setFailureType(to: Error.self).eraseToAnyPublisher()\n    })\n\n    let stringToData = StringTransformer().invert()\n    let uppercaseTransformer = OneWayTransformationBox<String, String>(transform: {\n      Just($0.uppercased()).setFailureType(to: Error.self).eraseToAnyPublisher()\n    })\n\n    let memoryAndDisk = MemoryCacheLevel()\n      .compose(DiskCacheLevel<String, NSData>())\n      .transformKeys(modelDomainToString)\n    let customCache = CustomCacheLevel()\n      .postProcess(uppercaseTransformer)\n      .transformKeys(modelDomainToInt)\n      .transformValues(stringToData)\n\n    cache = memoryAndDisk\n      .compose(customCache)\n      .compose(\n        BasicFetcher(getClosure: { (key: ModelDomain) in\n          Logger.log(\"Fetched \\(key.name) on the fetcher closure\", .info)\n\n          return Just((\"Last level was hit!\".data(using: .utf8, allowLossyConversion: false) as NSData?)!)\n            .setFailureType(to: Error.self)\n            .eraseToAnyPublisher()\n        })\n      )\n  }\n\n  override func fetchRequested() {\n    super.fetchRequested()\n\n    let key = ModelDomain(name: nameField.text ?? \"\", identifier: Int(identifierField.text ?? \"\") ?? 0, URL: URL(string: urlField.text ?? \"\")!)\n\n    cache.get(key)\n      .subscribe(on: DispatchQueue(label: \"carlose test queue\", qos: .userInitiated))\n      .sink(receiveCompletion: { _ in }) { data in\n        print(\"Is Main Thread:\", Thread.isMainThread)\n        print(data)\n      }.store(in: &cancellables)\n\n    for field in [nameField, identifierField, urlField] {\n      field?.resignFirstResponder()\n    }\n  }\n}\n"
  },
  {
    "path": "Example/Example/ConditionedCacheSampleViewController.swift",
    "content": "import Foundation\nimport UIKit\n\nimport Carlos\nimport Combine\n\nenum ConditionError: Error {\n  case globalKillSwitch\n  case urlScheme\n\n  func toString() -> String {\n    switch self {\n    case .globalKillSwitch:\n      return \"Global kill switch is on\"\n    case .urlScheme:\n      return \"URL Scheme is not HTTP\"\n    }\n  }\n}\n\nfinal class ConditionedCacheSampleViewController: BaseCacheViewController {\n  private var cache: BasicCache<URL, NSData>!\n  private var globalKillSwitch = false\n\n  private var cancellables = Set<AnyCancellable>()\n\n  override func fetchRequested() {\n    super.fetchRequested()\n\n    cache.get(URL(string: urlKeyField?.text ?? \"\")!)\n      .receive(on: DispatchQueue.main)\n      .sink(receiveCompletion: { completion in\n        if case let .failure(error) = completion {\n          self.eventsLogView.text = \"\\(self.eventsLogView.text!)Failed because of condition\\n\"\n          print(error)\n        }\n      }, receiveValue: { _ in })\n      .store(in: &cancellables)\n  }\n\n  override func titleForScreen() -> String {\n    \"Conditioned cache\"\n  }\n\n  @IBAction func killSwitchValueChanged(_ sender: UISwitch) {\n    globalKillSwitch = sender.isOn\n  }\n\n  override func setupCache() {\n    super.setupCache()\n\n    cache = simpleCache().conditioned { key -> AnyPublisher<Bool, Error> in\n      if self.globalKillSwitch {\n        return Fail(error: ConditionError.globalKillSwitch).eraseToAnyPublisher()\n      } else if key.scheme != \"http\" {\n        return Fail(error: ConditionError.urlScheme).eraseToAnyPublisher()\n      }\n\n      return Just(true).setFailureType(to: Error.self).eraseToAnyPublisher()\n    }\n  }\n}\n"
  },
  {
    "path": "Example/Example/DataCacheSampleViewController.swift",
    "content": "import Carlos\nimport Combine\nimport Foundation\nimport UIKit\n\nclass DataCacheSampleViewController: BaseCacheViewController {\n  fileprivate var cache: BasicCache<URL, NSData>!\n\n  private var cancellable: AnyCancellable?\n\n  override func fetchRequested() {\n    super.fetchRequested()\n\n    cancellable = cache.get(URL(string: urlKeyField?.text ?? \"\")!)\n      .sink(receiveCompletion: { _ in }, receiveValue: { _ in })\n  }\n\n  override func titleForScreen() -> String {\n    \"Data cache\"\n  }\n\n  override func setupCache() {\n    super.setupCache()\n\n    cache = CacheProvider.dataCache()\n  }\n}\n"
  },
  {
    "path": "Example/Example/DelayedNetworkFetcher.swift",
    "content": "import Foundation\n\nimport Carlos\nimport Combine\n\nfinal class DelayedNetworkFetcher: NetworkFetcher {\n  override func get(_ key: KeyType) -> AnyPublisher<OutputType, Error> {\n    super.get(key)\n      .delay(for: 2, scheduler: DispatchQueue.global())\n      .eraseToAnyPublisher()\n  }\n}\n"
  },
  {
    "path": "Example/Example/ExampleCell.swift",
    "content": "import Foundation\nimport UIKit\n\nclass ExampleCell: UITableViewCell {\n  static let Identifier = \"ExampleCell\"\n\n  func configureWithExample(_ example: Example) {\n    textLabel?.text = example.name\n    detailTextLabel?.text = example.shortDescription\n  }\n}\n"
  },
  {
    "path": "Example/Example/ExamplesListViewController.swift",
    "content": "import Foundation\nimport UIKit\n\nstruct ExamplesListSection {\n  let name: String\n  let samples: [Example]\n}\n\nstruct Example {\n  let name: String\n  let shortDescription: String\n  let segueIdentifier: String\n}\n\nclass ExamplesListViewController: UIViewController {\n  fileprivate let sections = [\n    ExamplesListSection(name: \"Simple\", samples: [\n      Example(name: \"Image cache\", shortDescription: \"Out-of-the-box image cache\", segueIdentifier: \"imageCache\"),\n      Example(name: \"Data cache\", shortDescription: \"Out-of-the-box data cache\", segueIdentifier: \"dataCache\"),\n      Example(name: \"JSON cache\", shortDescription: \"Out-of-the-box JSON cache\", segueIdentifier: \"jsonCache\"),\n      Example(name: \"User defaults cache\", shortDescription: \"Out-of-the-box NSUserDefaults cache\", segueIdentifier: \"userDefaultsCache\"),\n      Example(name: \"Memory warnings\", shortDescription: \"Simple stack with memory warnings listeners\", segueIdentifier: \"memoryWarning\")\n    ]),\n    ExamplesListSection(name: \"Advanced\", samples: [\n      Example(name: \"Complex cache\", shortDescription: \"Custom stack with key and value transformations\", segueIdentifier: \"complexCache\"),\n      Example(name: \"Conditioned cache\", shortDescription: \"Simple stack with conditioned levels\", segueIdentifier: \"conditionedCache\"),\n      Example(name: \"Pooled cache\", shortDescription: \"Simple stack with requests pooling\", segueIdentifier: \"pooledCache\"),\n      Example(name: \"Switched cache\", shortDescription: \"2 Simple switched lanes\", segueIdentifier: \"switchedCache\")\n    ])\n  ]\n\n  override func viewDidLoad() {\n    super.viewDidLoad()\n\n    title = \"Carlos Samples\"\n  }\n}\n\nextension ExamplesListViewController: UITableViewDataSource {\n  func numberOfSections(in _: UITableView) -> Int {\n    sections.count\n  }\n\n  func tableView(_: UITableView, numberOfRowsInSection section: Int) -> Int {\n    sections[section].samples.count\n  }\n\n  func tableView(_: UITableView, titleForHeaderInSection section: Int) -> String? {\n    sections[section].name\n  }\n\n  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {\n    let cell = tableView.dequeueReusableCell(withIdentifier: ExampleCell.Identifier, for: indexPath) as! ExampleCell\n\n    cell.configureWithExample(sections[(indexPath as NSIndexPath).section].samples[(indexPath as NSIndexPath).row])\n\n    return cell\n  }\n}\n\nextension ExamplesListViewController: UITableViewDelegate {\n  func tableView(_: UITableView, didSelectRowAt indexPath: IndexPath) {\n    let example = sections[(indexPath as NSIndexPath).section].samples[(indexPath as NSIndexPath).row]\n\n    performSegue(withIdentifier: example.segueIdentifier, sender: self)\n  }\n}\n"
  },
  {
    "path": "Example/Example/ImageCacheSampleViewController.swift",
    "content": "import Foundation\nimport UIKit\n\nimport Carlos\nimport Combine\n\nfinal class ImageCacheSampleViewController: BaseCacheViewController {\n  private var cache: BasicCache<URL, UIImage>!\n  private var cancellables = Set<AnyCancellable>()\n\n  @IBOutlet var imageView: UIImageView?\n\n  override func fetchRequested() {\n    super.fetchRequested()\n\n    cache.get(URL(string: urlKeyField?.text ?? \"\")!)\n      .receive(on: DispatchQueue.main)\n      .print()\n      .sink(receiveCompletion: { completion in\n        switch completion {\n        case .failure:\n          self.imageView?.image = self.imageWithColor(.darkGray, size: self.imageView?.frame.size ?? .zero)\n        default:\n          break\n        }\n        print(completion)\n      }, receiveValue: { image in\n        self.imageView?.image = image\n      })\n      .store(in: &cancellables)\n  }\n\n  private func imageWithColor(_ color: UIColor, size: CGSize) -> UIImage {\n    let rect = CGRect(origin: CGPoint.zero, size: size)\n    UIGraphicsBeginImageContextWithOptions(size, false, 0)\n    color.setFill()\n    UIRectFill(rect)\n    let image = UIGraphicsGetImageFromCurrentImageContext()\n    UIGraphicsEndImageContext()\n    return image!\n  }\n\n  override func titleForScreen() -> String {\n    \"Image cache\"\n  }\n\n  override func setupCache() {\n    super.setupCache()\n\n    cache = CacheProvider.imageCache()\n  }\n}\n"
  },
  {
    "path": "Example/Example/Images.xcassets/AppIcon.appiconset/Contents.json",
    "content": "{\n  \"images\" : [\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"iphone\",\n      \"size\" : \"60x60\",\n      \"scale\" : \"3x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"20x20\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"29x29\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"40x40\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"1x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"76x76\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ipad\",\n      \"size\" : \"83.5x83.5\",\n      \"scale\" : \"2x\"\n    },\n    {\n      \"idiom\" : \"ios-marketing\",\n      \"size\" : \"1024x1024\",\n      \"scale\" : \"1x\"\n    }\n  ],\n  \"info\" : {\n    \"version\" : 1,\n    \"author\" : \"xcode\"\n  }\n}"
  },
  {
    "path": "Example/Example/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>APPL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>LSRequiresIPhoneOS</key>\n\t<true/>\n\t<key>NSAppTransportSecurity</key>\n\t<dict>\n\t\t<key>NSAllowsArbitraryLoads</key>\n\t\t<true/>\n\t</dict>\n\t<key>UILaunchStoryboardName</key>\n\t<string>Main</string>\n\t<key>UIMainStoryboardFile</key>\n\t<string>Main</string>\n\t<key>UIRequiredDeviceCapabilities</key>\n\t<array>\n\t\t<string>armv7</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n\t<key>UISupportedInterfaceOrientations~ipad</key>\n\t<array>\n\t\t<string>UIInterfaceOrientationPortrait</string>\n\t\t<string>UIInterfaceOrientationPortraitUpsideDown</string>\n\t\t<string>UIInterfaceOrientationLandscapeLeft</string>\n\t\t<string>UIInterfaceOrientationLandscapeRight</string>\n\t</array>\n</dict>\n</plist>\n"
  },
  {
    "path": "Example/Example/JSONCacheSampleViewController.swift",
    "content": "import Foundation\nimport UIKit\n\nimport Carlos\nimport Combine\n\nprivate var myContext = 0\n\nfinal class JSONCacheSampleViewController: BaseCacheViewController {\n  private var cache: BasicCache<URL, AnyObject>!\n  private var cancellables = Set<AnyCancellable>()\n\n  override func fetchRequested() {\n    super.fetchRequested()\n\n    cache.get(URL(string: urlKeyField?.text ?? \"\")!)\n      .receive(on: DispatchQueue.main)\n      .sink(receiveCompletion: { _ in }, receiveValue: { JSON in\n        self.eventsLogView.text = \"\\(self.eventsLogView.text!)\\nJSON Dictionary result: \\(JSON as? NSDictionary)\\n\"\n      })\n      .store(in: &cancellables)\n\n    let progress = Progress.current()\n    progress?.addObserver(self, forKeyPath: \"fractionCompleted\", options: .initial, context: &myContext)\n  }\n\n  override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey: Any]?, context: UnsafeMutableRawPointer?) {\n    if context == &myContext {\n      if let newValue = change?[NSKeyValueChangeKey.newKey] {\n        print(\"Progress changed: \\(newValue)\")\n      }\n    } else {\n      super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)\n    }\n  }\n\n  override func titleForScreen() -> String {\n    \"JSON cache\"\n  }\n\n  override func setupCache() {\n    super.setupCache()\n\n    cache = CacheProvider.JSONCache()\n  }\n}\n"
  },
  {
    "path": "Example/Example/MemoryWarningSampleViewController.swift",
    "content": "import Carlos\nimport Combine\nimport Foundation\nimport UIKit\n\nclass MemoryWarningSampleViewController: BaseCacheViewController {\n  private var cache: BasicCache<URL, NSData>!\n  private var token: NSObjectProtocol?\n\n  var cancellable: AnyCancellable?\n\n  override func fetchRequested() {\n    super.fetchRequested()\n\n    cancellable = cache.get(URL(string: urlKeyField?.text ?? \"\")!)\n      .sink(receiveCompletion: { _ in }, receiveValue: { _ in })\n  }\n\n  override func titleForScreen() -> String {\n    \"Memory warnings\"\n  }\n\n  override func setupCache() {\n    super.setupCache()\n\n    cache = simpleCache()\n  }\n\n  @IBAction func memoryWarningSwitchValueChanged(_ sender: UISwitch) {\n    if sender.isOn, token == nil {\n      token = cache.listenToMemoryWarnings()\n    } else if let token = token, !sender.isOn {\n      unsubscribeToMemoryWarnings(token)\n      self.token = nil\n    }\n  }\n\n  @IBAction func simulateMemoryWarning(_: AnyObject) {\n    NotificationCenter.default.post(name: UIApplication.didReceiveMemoryWarningNotification, object: nil)\n  }\n}\n"
  },
  {
    "path": "Example/Example/PooledCacheSampleViewController.swift",
    "content": "import Foundation\nimport UIKit\n\nimport Carlos\nimport Combine\n\nfinal class PooledCacheSampleViewController: BaseCacheViewController {\n  private var cache: PoolCache<BasicCache<URL, NSData>>!\n  private var cancellables = Set<AnyCancellable>()\n\n  override func fetchRequested() {\n    super.fetchRequested()\n    let timestamp = Date().timeIntervalSince1970\n    eventsLogView.text = \"\\(eventsLogView.text!)Request timestamp: \\(timestamp)\\n\"\n    cache.get(URL(string: urlKeyField?.text ?? \"\")!)\n      .receive(on: DispatchQueue.main)\n      .sink(receiveCompletion: { _ in }, receiveValue: { _ in\n        self.eventsLogView.text = \"\\(self.eventsLogView.text!)Request with timestamp \\(timestamp) succeeded\\n\"\n      }).store(in: &cancellables)\n  }\n\n  override func titleForScreen() -> String {\n    \"Pooled cache\"\n  }\n\n  override func setupCache() {\n    super.setupCache()\n\n    cache = delayedNetworkCache().pooled()\n  }\n}\n"
  },
  {
    "path": "Example/Example/SwitchCacheSampleViewController.swift",
    "content": "import Foundation\nimport UIKit\n\nimport Carlos\nimport Combine\n\nfinal class SwitchCacheSampleViewController: BaseCacheViewController {\n  private var cache: BasicCache<URL, NSData>!\n\n  private var cancellables = Set<AnyCancellable>()\n\n  override func fetchRequested() {\n    super.fetchRequested()\n\n    cache.get(URL(string: urlKeyField?.text ?? \"\")!)\n      .sink(receiveCompletion: { _ in }, receiveValue: { _ in })\n      .store(in: &cancellables)\n  }\n\n  override func titleForScreen() -> String {\n    \"Switched caches\"\n  }\n\n  override func setupCache() {\n    super.setupCache()\n\n    let lane1 = MemoryCacheLevel<URL, NSData>()\n    lane1.set((\"Yes, this is hitting the memory cache now\".data(using: .utf8, allowLossyConversion: false) as NSData?)!, forKey: URL(string: \"test\")!)\n      .sink(receiveCompletion: { _ in }, receiveValue: { _ in })\n      .store(in: &cancellables)\n    lane1.set((\"Carlos lets you create quite complex cache infrastructures\".data(using: .utf8, allowLossyConversion: false) as NSData?)!, forKey: URL(string: \"carlos\")!)\n      .sink(receiveCompletion: { _ in }, receiveValue: { _ in })\n      .store(in: &cancellables)\n\n    let lane2 = CacheProvider.dataCache()\n\n    cache = switchLevels(cacheA: lane1, cacheB: lane2, switchClosure: { key in\n      if key.scheme == \"http\" {\n        return .cacheB\n      } else {\n        return .cacheA\n      }\n    })\n  }\n}\n"
  },
  {
    "path": "Example/Example/UserDefaultsCacheSampleViewController.swift",
    "content": "import Foundation\nimport UIKit\n\nimport Carlos\nimport Combine\n\nfinal class UserDefaultsCacheSampleViewController: BaseCacheViewController {\n  private var cache: NSUserDefaultsCacheLevel<String, NSData>!\n  private var cancellables = Set<AnyCancellable>()\n\n  override func fetchRequested() {\n    super.fetchRequested()\n\n    cache.get(urlKeyField?.text ?? \"\")\n      .sink(receiveCompletion: { _ in }, receiveValue: { _ in })\n      .store(in: &cancellables)\n  }\n\n  override func titleForScreen() -> String {\n    \"User defaults cache\"\n  }\n\n  @IBAction func clearCache(_: AnyObject) {\n    cache.clear()\n  }\n\n  override func setupCache() {\n    super.setupCache()\n\n    cache = NSUserDefaultsCacheLevel<String, NSData>()\n\n    let values = [\n      \"test\": \"value\".data(using: String.Encoding.utf8)!,\n      \"key\": \"another value\".data(using: String.Encoding.utf8)!\n    ]\n\n    for (key, value) in values {\n      cache.set(value as NSData, forKey: key)\n        .sink(receiveCompletion: { _ in }, receiveValue: { _ in })\n        .store(in: &cancellables)\n    }\n\n    let prepopulatingMessage = values.reduce(\"\") { accumulator, value in\n      \"\\(accumulator)\\n\\(value.0): \\(value.1)\"\n    }\n\n    eventsLogView.text = \"\\(eventsLogView.text!)Prepopulating the cache:\\n\\(prepopulatingMessage)\\n\"\n  }\n}\n"
  },
  {
    "path": "Example/Example.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 52;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t5208636F1B64268000F740C7 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520863661B64268000F740C7 /* AppDelegate.swift */; };\n\t\t520863701B64268000F740C7 /* BaseCacheViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520863671B64268000F740C7 /* BaseCacheViewController.swift */; };\n\t\t520863711B64268000F740C7 /* ComplexCacheSampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520863681B64268000F740C7 /* ComplexCacheSampleViewController.swift */; };\n\t\t520863721B64268000F740C7 /* ConditionedCacheSampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520863691B64268000F740C7 /* ConditionedCacheSampleViewController.swift */; };\n\t\t520863731B64268000F740C7 /* ExampleCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5208636A1B64268000F740C7 /* ExampleCell.swift */; };\n\t\t520863741B64268000F740C7 /* ExamplesListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5208636B1B64268000F740C7 /* ExamplesListViewController.swift */; };\n\t\t520863751B64268000F740C7 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5208636C1B64268000F740C7 /* Images.xcassets */; };\n\t\t520863761B64268000F740C7 /* MemoryWarningSampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5208636D1B64268000F740C7 /* MemoryWarningSampleViewController.swift */; };\n\t\t520863771B64268000F740C7 /* DataCacheSampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5208636E1B64268000F740C7 /* DataCacheSampleViewController.swift */; };\n\t\t5208637F1B64268E00F740C7 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5208637C1B64268E00F740C7 /* Main.storyboard */; };\n\t\t520863811B642D4A00F740C7 /* PooledCacheSampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520863801B642D4A00F740C7 /* PooledCacheSampleViewController.swift */; };\n\t\t520863851B64314400F740C7 /* DelayedNetworkFetcher.swift in Sources */ = {isa = PBXBuildFile; fileRef = 520863841B64314400F740C7 /* DelayedNetworkFetcher.swift */; };\n\t\t5216CD0F1BC04B43005B729F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5216CD0E1BC04B43005B729F /* AppDelegate.swift */; };\n\t\t5216CD111BC04B43005B729F /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5216CD101BC04B43005B729F /* ViewController.swift */; };\n\t\t5216CD141BC04B43005B729F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5216CD121BC04B43005B729F /* Main.storyboard */; };\n\t\t5216CD161BC04B43005B729F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5216CD151BC04B43005B729F /* Assets.xcassets */; };\n\t\t522A4E6B1B7BDACB00646D52 /* ImageCacheSampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 522A4E6A1B7BDACB00646D52 /* ImageCacheSampleViewController.swift */; };\n\t\t5235BAD51BE16B010049CFA6 /* UserDefaultsCacheSampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5235BAD41BE16B010049CFA6 /* UserDefaultsCacheSampleViewController.swift */; };\n\t\t523BBF891BC07C410040DA1B /* JSONCacheSampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 523BBF881BC07C410040DA1B /* JSONCacheSampleViewController.swift */; };\n\t\t528FAD481B7B0DCB0020A70E /* SwitchCacheSampleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 528FAD471B7B0DCB0020A70E /* SwitchCacheSampleViewController.swift */; };\n\t\t52CF0A8E1B91F5EE0061022D /* CountryRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52CF0A8D1B91F5EE0061022D /* CountryRow.swift */; };\n\t\t52CF0AD11B920DC20061022D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52CF0AD01B920DC20061022D /* AppDelegate.swift */; };\n\t\t52CF0AD31B920DC20061022D /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 52CF0AD21B920DC20061022D /* ViewController.swift */; };\n\t\t52CF0AD51B920DC20061022D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 52CF0AD41B920DC20061022D /* Assets.xcassets */; };\n\t\t52CF0AD81B920DC20061022D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 52CF0AD61B920DC20061022D /* Main.storyboard */; };\n\t\tAD64D97E1B8DE69200C783D3 /* Interface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = AD64D97C1B8DE69200C783D3 /* Interface.storyboard */; };\n\t\tAD64D9801B8DE69200C783D3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AD64D97F1B8DE69200C783D3 /* Assets.xcassets */; };\n\t\tAD64D9871B8DE69200C783D3 /* ExampleWatchSample Extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = AD64D9861B8DE69200C783D3 /* ExampleWatchSample Extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };\n\t\tAD64D98C1B8DE69200C783D3 /* InterfaceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD64D98B1B8DE69200C783D3 /* InterfaceController.swift */; };\n\t\tAD64D98E1B8DE69200C783D3 /* ExtensionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD64D98D1B8DE69200C783D3 /* ExtensionDelegate.swift */; };\n\t\tAD64D9901B8DE69200C783D3 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = AD64D98F1B8DE69200C783D3 /* Assets.xcassets */; };\n\t\tAD64D9941B8DE69200C783D3 /* ExampleWatchSample.app in Embed Watch Content */ = {isa = PBXBuildFile; fileRef = AD64D97A1B8DE69200C783D3 /* ExampleWatchSample.app */; };\n\t\tCC6E521924EC192700DF1D80 /* Carlos in Frameworks */ = {isa = PBXBuildFile; productRef = CC6E521824EC192700DF1D80 /* Carlos */; };\n\t\tCC6E521B24EC192F00DF1D80 /* Carlos in Frameworks */ = {isa = PBXBuildFile; productRef = CC6E521A24EC192F00DF1D80 /* Carlos */; };\n\t\tCC6E521D24EC193500DF1D80 /* Carlos in Frameworks */ = {isa = PBXBuildFile; productRef = CC6E521C24EC193500DF1D80 /* Carlos */; };\n\t\tCC6E521F24EC194E00DF1D80 /* Carlos in Frameworks */ = {isa = PBXBuildFile; productRef = CC6E521E24EC194E00DF1D80 /* Carlos */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\tAD64D9881B8DE69200C783D3 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = AD695CD71B46CD65004E998D /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = AD64D9851B8DE69200C783D3;\n\t\t\tremoteInfo = \"CarlosWatchSample Extension\";\n\t\t};\n\t\tAD64D9921B8DE69200C783D3 /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = AD695CD71B46CD65004E998D /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = AD64D9791B8DE69200C783D3;\n\t\t\tremoteInfo = CarlosWatchSample;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\tAD64D9981B8DE69200C783D3 /* Embed App Extensions */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"\";\n\t\t\tdstSubfolderSpec = 13;\n\t\t\tfiles = (\n\t\t\t\tAD64D9871B8DE69200C783D3 /* ExampleWatchSample Extension.appex in Embed App Extensions */,\n\t\t\t);\n\t\t\tname = \"Embed App Extensions\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tADBC8F4C1B8DE4AB0080EF0A /* Embed Watch Content */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"$(CONTENTS_FOLDER_PATH)/Watch\";\n\t\t\tdstSubfolderSpec = 16;\n\t\t\tfiles = (\n\t\t\t\tAD64D9941B8DE69200C783D3 /* ExampleWatchSample.app in Embed Watch Content */,\n\t\t\t);\n\t\t\tname = \"Embed Watch Content\";\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t520863661B64268000F740C7 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t520863671B64268000F740C7 /* BaseCacheViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseCacheViewController.swift; sourceTree = \"<group>\"; };\n\t\t520863681B64268000F740C7 /* ComplexCacheSampleViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ComplexCacheSampleViewController.swift; sourceTree = \"<group>\"; };\n\t\t520863691B64268000F740C7 /* ConditionedCacheSampleViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConditionedCacheSampleViewController.swift; sourceTree = \"<group>\"; };\n\t\t5208636A1B64268000F740C7 /* ExampleCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExampleCell.swift; sourceTree = \"<group>\"; };\n\t\t5208636B1B64268000F740C7 /* ExamplesListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExamplesListViewController.swift; sourceTree = \"<group>\"; };\n\t\t5208636C1B64268000F740C7 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = \"<group>\"; };\n\t\t5208636D1B64268000F740C7 /* MemoryWarningSampleViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MemoryWarningSampleViewController.swift; sourceTree = \"<group>\"; };\n\t\t5208636E1B64268000F740C7 /* DataCacheSampleViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataCacheSampleViewController.swift; sourceTree = \"<group>\"; };\n\t\t520863781B64268700F740C7 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t5208637D1B64268E00F740C7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t520863801B642D4A00F740C7 /* PooledCacheSampleViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PooledCacheSampleViewController.swift; sourceTree = \"<group>\"; };\n\t\t520863841B64314400F740C7 /* DelayedNetworkFetcher.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DelayedNetworkFetcher.swift; sourceTree = \"<group>\"; };\n\t\t5216CD0C1BC04B43005B729F /* ExampleTvSample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ExampleTvSample.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t5216CD0E1BC04B43005B729F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t5216CD101BC04B43005B729F /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\t5216CD131BC04B43005B729F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t5216CD151BC04B43005B729F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t5216CD171BC04B43005B729F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t522A4E6A1B7BDACB00646D52 /* ImageCacheSampleViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImageCacheSampleViewController.swift; sourceTree = \"<group>\"; };\n\t\t5235BAD41BE16B010049CFA6 /* UserDefaultsCacheSampleViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserDefaultsCacheSampleViewController.swift; sourceTree = \"<group>\"; };\n\t\t523BBF881BC07C410040DA1B /* JSONCacheSampleViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSONCacheSampleViewController.swift; sourceTree = \"<group>\"; };\n\t\t528FAD471B7B0DCB0020A70E /* SwitchCacheSampleViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwitchCacheSampleViewController.swift; sourceTree = \"<group>\"; };\n\t\t52CF0A8D1B91F5EE0061022D /* CountryRow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CountryRow.swift; sourceTree = \"<group>\"; };\n\t\t52CF0ACE1B920DC20061022D /* ExampleMacSample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ExampleMacSample.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t52CF0AD01B920DC20061022D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = \"<group>\"; };\n\t\t52CF0AD21B920DC20061022D /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = \"<group>\"; };\n\t\t52CF0AD41B920DC20061022D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\t52CF0AD71B920DC20061022D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = \"<group>\"; };\n\t\t52CF0AD91B920DC20061022D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tAD64D97A1B8DE69200C783D3 /* ExampleWatchSample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ExampleWatchSample.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tAD64D97D1B8DE69200C783D3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Interface.storyboard; sourceTree = \"<group>\"; };\n\t\tAD64D97F1B8DE69200C783D3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\tAD64D9811B8DE69200C783D3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tAD64D9861B8DE69200C783D3 /* ExampleWatchSample Extension.appex */ = {isa = PBXFileReference; explicitFileType = \"wrapper.app-extension\"; includeInIndex = 0; path = \"ExampleWatchSample Extension.appex\"; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tAD64D98B1B8DE69200C783D3 /* InterfaceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InterfaceController.swift; sourceTree = \"<group>\"; };\n\t\tAD64D98D1B8DE69200C783D3 /* ExtensionDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionDelegate.swift; sourceTree = \"<group>\"; };\n\t\tAD64D98F1B8DE69200C783D3 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = \"<group>\"; };\n\t\tAD64D9911B8DE69200C783D3 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\tAD695CDF1B46CD65004E998D /* ExampleSample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ExampleSample.app; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tCCC88FA724ADDB60008C4060 /* Carlos.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Carlos.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tCCC88FAA24ADDB78008C4060 /* Carlos.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Carlos.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tCCC88FAD24ADDB7F008C4060 /* Carlos.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Carlos.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tCCC88FB124ADDB83008C4060 /* Carlos.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Carlos.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t5216CD091BC04B43005B729F /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCC6E521D24EC193500DF1D80 /* Carlos in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t52CF0ACB1B920DC20061022D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCC6E521B24EC192F00DF1D80 /* Carlos in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tAD64D9831B8DE69200C783D3 /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCC6E521F24EC194E00DF1D80 /* Carlos in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tAD695CDC1B46CD65004E998D /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tCC6E521924EC192700DF1D80 /* Carlos in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t2677A0397774353D4B14F63F /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tCCC88FB124ADDB83008C4060 /* Carlos.framework */,\n\t\t\t\tCCC88FAD24ADDB7F008C4060 /* Carlos.framework */,\n\t\t\t\tCCC88FAA24ADDB78008C4060 /* Carlos.framework */,\n\t\t\t\tCCC88FA724ADDB60008C4060 /* Carlos.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5216CD0D1BC04B43005B729F /* CarlosTvSample */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t5216CD0E1BC04B43005B729F /* AppDelegate.swift */,\n\t\t\t\t5216CD101BC04B43005B729F /* ViewController.swift */,\n\t\t\t\t5216CD121BC04B43005B729F /* Main.storyboard */,\n\t\t\t\t5216CD151BC04B43005B729F /* Assets.xcassets */,\n\t\t\t\t5216CD171BC04B43005B729F /* Info.plist */,\n\t\t\t);\n\t\t\tpath = CarlosTvSample;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t52CF0ACF1B920DC20061022D /* CarlosMacSample */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t52CF0AD01B920DC20061022D /* AppDelegate.swift */,\n\t\t\t\t52CF0AD21B920DC20061022D /* ViewController.swift */,\n\t\t\t\t52CF0AD41B920DC20061022D /* Assets.xcassets */,\n\t\t\t\t52CF0AD61B920DC20061022D /* Main.storyboard */,\n\t\t\t\t52CF0AD91B920DC20061022D /* Info.plist */,\n\t\t\t);\n\t\t\tpath = CarlosMacSample;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAD64D97B1B8DE69200C783D3 /* CarlosWatchSample */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAD64D97C1B8DE69200C783D3 /* Interface.storyboard */,\n\t\t\t\tAD64D97F1B8DE69200C783D3 /* Assets.xcassets */,\n\t\t\t\tAD64D9811B8DE69200C783D3 /* Info.plist */,\n\t\t\t);\n\t\t\tpath = CarlosWatchSample;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAD64D98A1B8DE69200C783D3 /* CarlosWatchSample Extension */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAD64D98B1B8DE69200C783D3 /* InterfaceController.swift */,\n\t\t\t\tAD64D98D1B8DE69200C783D3 /* ExtensionDelegate.swift */,\n\t\t\t\tAD64D98F1B8DE69200C783D3 /* Assets.xcassets */,\n\t\t\t\tAD64D9911B8DE69200C783D3 /* Info.plist */,\n\t\t\t\t52CF0A8D1B91F5EE0061022D /* CountryRow.swift */,\n\t\t\t);\n\t\t\tpath = \"CarlosWatchSample Extension\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAD695CD61B46CD65004E998D = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAD695CE11B46CD65004E998D /* Example */,\n\t\t\t\tAD64D97B1B8DE69200C783D3 /* CarlosWatchSample */,\n\t\t\t\tAD64D98A1B8DE69200C783D3 /* CarlosWatchSample Extension */,\n\t\t\t\t52CF0ACF1B920DC20061022D /* CarlosMacSample */,\n\t\t\t\t5216CD0D1BC04B43005B729F /* CarlosTvSample */,\n\t\t\t\tAD695CE01B46CD65004E998D /* Products */,\n\t\t\t\t2677A0397774353D4B14F63F /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAD695CE01B46CD65004E998D /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAD695CDF1B46CD65004E998D /* ExampleSample.app */,\n\t\t\t\tAD64D97A1B8DE69200C783D3 /* ExampleWatchSample.app */,\n\t\t\t\tAD64D9861B8DE69200C783D3 /* ExampleWatchSample Extension.appex */,\n\t\t\t\t52CF0ACE1B920DC20061022D /* ExampleMacSample.app */,\n\t\t\t\t5216CD0C1BC04B43005B729F /* ExampleTvSample.app */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAD695CE11B46CD65004E998D /* Example */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tAD695CE21B46CD65004E998D /* Supporting Files */,\n\t\t\t\t5208636C1B64268000F740C7 /* Images.xcassets */,\n\t\t\t\t5208637C1B64268E00F740C7 /* Main.storyboard */,\n\t\t\t\t520863661B64268000F740C7 /* AppDelegate.swift */,\n\t\t\t\t520863671B64268000F740C7 /* BaseCacheViewController.swift */,\n\t\t\t\t520863681B64268000F740C7 /* ComplexCacheSampleViewController.swift */,\n\t\t\t\t520863691B64268000F740C7 /* ConditionedCacheSampleViewController.swift */,\n\t\t\t\t5208636A1B64268000F740C7 /* ExampleCell.swift */,\n\t\t\t\t5208636B1B64268000F740C7 /* ExamplesListViewController.swift */,\n\t\t\t\t5208636D1B64268000F740C7 /* MemoryWarningSampleViewController.swift */,\n\t\t\t\t5208636E1B64268000F740C7 /* DataCacheSampleViewController.swift */,\n\t\t\t\t520863801B642D4A00F740C7 /* PooledCacheSampleViewController.swift */,\n\t\t\t\t520863841B64314400F740C7 /* DelayedNetworkFetcher.swift */,\n\t\t\t\t528FAD471B7B0DCB0020A70E /* SwitchCacheSampleViewController.swift */,\n\t\t\t\t522A4E6A1B7BDACB00646D52 /* ImageCacheSampleViewController.swift */,\n\t\t\t\t523BBF881BC07C410040DA1B /* JSONCacheSampleViewController.swift */,\n\t\t\t\t5235BAD41BE16B010049CFA6 /* UserDefaultsCacheSampleViewController.swift */,\n\t\t\t);\n\t\t\tpath = Example;\n\t\t\tsourceTree = SOURCE_ROOT;\n\t\t};\n\t\tAD695CE21B46CD65004E998D /* Supporting Files */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t520863781B64268700F740C7 /* Info.plist */,\n\t\t\t);\n\t\t\tname = \"Supporting Files\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t5216CD0B1BC04B43005B729F /* ExampleTvSample */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 5216CD241BC04B43005B729F /* Build configuration list for PBXNativeTarget \"ExampleTvSample\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t5216CD081BC04B43005B729F /* Sources */,\n\t\t\t\t5216CD091BC04B43005B729F /* Frameworks */,\n\t\t\t\t5216CD0A1BC04B43005B729F /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = ExampleTvSample;\n\t\t\tpackageProductDependencies = (\n\t\t\t\tCC6E521C24EC193500DF1D80 /* Carlos */,\n\t\t\t);\n\t\t\tproductName = CarlosTvSample;\n\t\t\tproductReference = 5216CD0C1BC04B43005B729F /* ExampleTvSample.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\t52CF0ACD1B920DC20061022D /* ExampleMacSample */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 52CF0ADA1B920DC20061022D /* Build configuration list for PBXNativeTarget \"ExampleMacSample\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t52CF0ACA1B920DC20061022D /* Sources */,\n\t\t\t\t52CF0ACB1B920DC20061022D /* Frameworks */,\n\t\t\t\t52CF0ACC1B920DC20061022D /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = ExampleMacSample;\n\t\t\tpackageProductDependencies = (\n\t\t\t\tCC6E521A24EC192F00DF1D80 /* Carlos */,\n\t\t\t);\n\t\t\tproductName = CarlosMacSample;\n\t\t\tproductReference = 52CF0ACE1B920DC20061022D /* ExampleMacSample.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n\t\tAD64D9791B8DE69200C783D3 /* ExampleWatchSample */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = AD64D9991B8DE69200C783D3 /* Build configuration list for PBXNativeTarget \"ExampleWatchSample\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tAD64D9781B8DE69200C783D3 /* Resources */,\n\t\t\t\tAD64D9981B8DE69200C783D3 /* Embed App Extensions */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tAD64D9891B8DE69200C783D3 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = ExampleWatchSample;\n\t\t\tproductName = CarlosWatchSample;\n\t\t\tproductReference = AD64D97A1B8DE69200C783D3 /* ExampleWatchSample.app */;\n\t\t\tproductType = \"com.apple.product-type.application.watchapp2\";\n\t\t};\n\t\tAD64D9851B8DE69200C783D3 /* ExampleWatchSample Extension */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = AD64D9951B8DE69200C783D3 /* Build configuration list for PBXNativeTarget \"ExampleWatchSample Extension\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tAD64D9821B8DE69200C783D3 /* Sources */,\n\t\t\t\tAD64D9831B8DE69200C783D3 /* Frameworks */,\n\t\t\t\tAD64D9841B8DE69200C783D3 /* Resources */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = \"ExampleWatchSample Extension\";\n\t\t\tpackageProductDependencies = (\n\t\t\t\tCC6E521E24EC194E00DF1D80 /* Carlos */,\n\t\t\t);\n\t\t\tproductName = \"CarlosWatchSample Extension\";\n\t\t\tproductReference = AD64D9861B8DE69200C783D3 /* ExampleWatchSample Extension.appex */;\n\t\t\tproductType = \"com.apple.product-type.watchkit2-extension\";\n\t\t};\n\t\tAD695CDE1B46CD65004E998D /* ExampleSample */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = AD695CFE1B46CD65004E998D /* Build configuration list for PBXNativeTarget \"ExampleSample\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tAD695CDB1B46CD65004E998D /* Sources */,\n\t\t\t\tAD695CDC1B46CD65004E998D /* Frameworks */,\n\t\t\t\tAD695CDD1B46CD65004E998D /* Resources */,\n\t\t\t\tADBC8F4C1B8DE4AB0080EF0A /* Embed Watch Content */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\tAD64D9931B8DE69200C783D3 /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = ExampleSample;\n\t\t\tpackageProductDependencies = (\n\t\t\t\tCC6E521824EC192700DF1D80 /* Carlos */,\n\t\t\t);\n\t\t\tproductName = CarlosSample;\n\t\t\tproductReference = AD695CDF1B46CD65004E998D /* ExampleSample.app */;\n\t\t\tproductType = \"com.apple.product-type.application\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\tAD695CD71B46CD65004E998D /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftMigration = 0700;\n\t\t\t\tLastSwiftUpdateCheck = 0730;\n\t\t\t\tLastUpgradeCheck = 1200;\n\t\t\t\tORGANIZATIONNAME = WeltN24;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t5216CD0B1BC04B43005B729F = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.1;\n\t\t\t\t\t\tLastSwiftMigration = 0800;\n\t\t\t\t\t};\n\t\t\t\t\t52CF0ACD1B920DC20061022D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.0;\n\t\t\t\t\t\tLastSwiftMigration = 1150;\n\t\t\t\t\t};\n\t\t\t\t\tAD64D9791B8DE69200C783D3 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.0;\n\t\t\t\t\t\tLastSwiftMigration = 0920;\n\t\t\t\t\t};\n\t\t\t\t\tAD64D9851B8DE69200C783D3 = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 7.0;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t};\n\t\t\t\t\tAD695CDE1B46CD65004E998D = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 6.3.2;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = AD695CDA1B46CD65004E998D /* Build configuration list for PBXProject \"Example\" */;\n\t\t\tcompatibilityVersion = \"Xcode 3.2\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = AD695CD61B46CD65004E998D;\n\t\t\tproductRefGroup = AD695CE01B46CD65004E998D /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\tAD695CDE1B46CD65004E998D /* ExampleSample */,\n\t\t\t\tAD64D9791B8DE69200C783D3 /* ExampleWatchSample */,\n\t\t\t\tAD64D9851B8DE69200C783D3 /* ExampleWatchSample Extension */,\n\t\t\t\t52CF0ACD1B920DC20061022D /* ExampleMacSample */,\n\t\t\t\t5216CD0B1BC04B43005B729F /* ExampleTvSample */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t5216CD0A1BC04B43005B729F /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t5216CD161BC04B43005B729F /* Assets.xcassets in Resources */,\n\t\t\t\t5216CD141BC04B43005B729F /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t52CF0ACC1B920DC20061022D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t52CF0AD51B920DC20061022D /* Assets.xcassets in Resources */,\n\t\t\t\t52CF0AD81B920DC20061022D /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tAD64D9781B8DE69200C783D3 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tAD64D9801B8DE69200C783D3 /* Assets.xcassets in Resources */,\n\t\t\t\tAD64D97E1B8DE69200C783D3 /* Interface.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tAD64D9841B8DE69200C783D3 /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\tAD64D9901B8DE69200C783D3 /* Assets.xcassets in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tAD695CDD1B46CD65004E998D /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t520863751B64268000F740C7 /* Images.xcassets in Resources */,\n\t\t\t\t5208637F1B64268E00F740C7 /* Main.storyboard in Resources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t5216CD081BC04B43005B729F /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t5216CD111BC04B43005B729F /* ViewController.swift in Sources */,\n\t\t\t\t5216CD0F1BC04B43005B729F /* AppDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t52CF0ACA1B920DC20061022D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t52CF0AD31B920DC20061022D /* ViewController.swift in Sources */,\n\t\t\t\t52CF0AD11B920DC20061022D /* AppDelegate.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tAD64D9821B8DE69200C783D3 /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t52CF0A8E1B91F5EE0061022D /* CountryRow.swift in Sources */,\n\t\t\t\tAD64D98E1B8DE69200C783D3 /* ExtensionDelegate.swift in Sources */,\n\t\t\t\tAD64D98C1B8DE69200C783D3 /* InterfaceController.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\tAD695CDB1B46CD65004E998D /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t520863731B64268000F740C7 /* ExampleCell.swift in Sources */,\n\t\t\t\t5235BAD51BE16B010049CFA6 /* UserDefaultsCacheSampleViewController.swift in Sources */,\n\t\t\t\t520863701B64268000F740C7 /* BaseCacheViewController.swift in Sources */,\n\t\t\t\t520863851B64314400F740C7 /* DelayedNetworkFetcher.swift in Sources */,\n\t\t\t\t528FAD481B7B0DCB0020A70E /* SwitchCacheSampleViewController.swift in Sources */,\n\t\t\t\t522A4E6B1B7BDACB00646D52 /* ImageCacheSampleViewController.swift in Sources */,\n\t\t\t\t5208636F1B64268000F740C7 /* AppDelegate.swift in Sources */,\n\t\t\t\t520863721B64268000F740C7 /* ConditionedCacheSampleViewController.swift in Sources */,\n\t\t\t\t520863741B64268000F740C7 /* ExamplesListViewController.swift in Sources */,\n\t\t\t\t520863711B64268000F740C7 /* ComplexCacheSampleViewController.swift in Sources */,\n\t\t\t\t520863811B642D4A00F740C7 /* PooledCacheSampleViewController.swift in Sources */,\n\t\t\t\t520863761B64268000F740C7 /* MemoryWarningSampleViewController.swift in Sources */,\n\t\t\t\t520863771B64268000F740C7 /* DataCacheSampleViewController.swift in Sources */,\n\t\t\t\t523BBF891BC07C410040DA1B /* JSONCacheSampleViewController.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\tAD64D9891B8DE69200C783D3 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = AD64D9851B8DE69200C783D3 /* ExampleWatchSample Extension */;\n\t\t\ttargetProxy = AD64D9881B8DE69200C783D3 /* PBXContainerItemProxy */;\n\t\t};\n\t\tAD64D9931B8DE69200C783D3 /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = AD64D9791B8DE69200C783D3 /* ExampleWatchSample */;\n\t\t\ttargetProxy = AD64D9921B8DE69200C783D3 /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin PBXVariantGroup section */\n\t\t5208637C1B64268E00F740C7 /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t5208637D1B64268E00F740C7 /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t5216CD121BC04B43005B729F /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t5216CD131BC04B43005B729F /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t52CF0AD61B920DC20061022D /* Main.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\t52CF0AD71B920DC20061022D /* Base */,\n\t\t\t);\n\t\t\tname = Main.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\tAD64D97C1B8DE69200C783D3 /* Interface.storyboard */ = {\n\t\t\tisa = PBXVariantGroup;\n\t\t\tchildren = (\n\t\t\t\tAD64D97D1B8DE69200C783D3 /* Base */,\n\t\t\t);\n\t\t\tname = Interface.storyboard;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXVariantGroup section */\n\n/* Begin XCBuildConfiguration section */\n\t\t5216CD181BC04B43005B729F /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"App Icon & Top Shelf Image\";\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = CarlosTvSample/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.axelspringer.CarlosTvSample;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t5216CD191BC04B43005B729F /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = \"App Icon & Top Shelf Image\";\n\t\t\t\tASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = CarlosTvSample/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.axelspringer.CarlosTvSample;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = appletvos;\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t52CF0ADB1B920DC20061022D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = CarlosMacSample/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.15;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.axelspringer.CarlosMacSample;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t52CF0ADC1B920DC20061022D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCODE_SIGN_IDENTITY = \"-\";\n\t\t\t\tCOMBINE_HIDPI_IMAGES = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = CarlosMacSample/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/../Frameworks\",\n\t\t\t\t);\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.15;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.axelspringer.CarlosMacSample;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = macosx;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tAD64D9961B8DE69200C783D3 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = \"CarlosWatchSample Extension/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@executable_path/../../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.axelspringer.CarlosSample.watchkitapp.watchkitextension;\n\t\t\t\tPRODUCT_NAME = \"${TARGET_NAME}\";\n\t\t\t\tSDKROOT = watchos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSUPPORTED_PLATFORMS = \"watchsimulator watchos\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tAD64D9971B8DE69200C783D3 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = \"CarlosWatchSample Extension/Info.plist\";\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@executable_path/../../Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.axelspringer.CarlosSample.watchkitapp.watchkitextension;\n\t\t\t\tPRODUCT_NAME = \"${TARGET_NAME}\";\n\t\t\t\tSDKROOT = watchos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSUPPORTED_PLATFORMS = \"watchsimulator watchos\";\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tAD64D99A1B8DE69200C783D3 /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\";\n\t\t\t\tIBSC_MODULE = CarlosWatchSample_Extension;\n\t\t\t\tINFOPLIST_FILE = CarlosWatchSample/Info.plist;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.axelspringer.CarlosSample.watchkitapp;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = watchos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSUPPORTED_PLATFORMS = \"watchsimulator watchos\";\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tAD64D99B1B8DE69200C783D3 /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"\";\n\t\t\t\tIBSC_MODULE = CarlosWatchSample_Extension;\n\t\t\t\tINFOPLIST_FILE = CarlosWatchSample/Info.plist;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.axelspringer.CarlosSample.watchkitapp;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = watchos;\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSUPPORTED_PLATFORMS = \"watchsimulator watchos\";\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 6.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tAD695CFC1B46CD65004E998D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_SYMBOLS_PRIVATE_EXTERN = NO;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.15;\n\t\t\t\tMARKETING_VERSION = 0.10.0;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.axelspringer.carlos;\n\t\t\t\tPRODUCT_NAME = Carlos;\n\t\t\t\tSUPPORTED_PLATFORMS = \"iphonesimulator iphoneos appletvos macosx watchos watchsimulator appletvsimulator\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 3.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tAD695CFD1B46CD65004E998D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++0x\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tCURRENT_PROJECT_VERSION = 1;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu99;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tMACOSX_DEPLOYMENT_TARGET = 10.15;\n\t\t\t\tMARKETING_VERSION = 0.10.0;\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.axelspringer.carlos;\n\t\t\t\tPRODUCT_NAME = Carlos;\n\t\t\t\tSUPPORTED_PLATFORMS = \"iphonesimulator iphoneos appletvos macosx watchos watchsimulator appletvsimulator\";\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTVOS_DEPLOYMENT_TARGET = 12.0;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t\tWATCHOS_DEPLOYMENT_TARGET = 3.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\tAD695CFF1B46CD65004E998D /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = Example/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tOTHER_SWIFT_FLAGS = \"\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.axelspringer.CarlosSample;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = \"iphonesimulator iphoneos\";\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\tAD695D001B46CD65004E998D /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tFRAMEWORK_SEARCH_PATHS = \"$(inherited)\";\n\t\t\t\tINFOPLIST_FILE = Example/Info.plist;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 13.0;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tOTHER_SWIFT_FLAGS = \"\";\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = de.axelspringer.CarlosSample;\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSUPPORTED_PLATFORMS = \"iphonesimulator iphoneos\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t5216CD241BC04B43005B729F /* Build configuration list for PBXNativeTarget \"ExampleTvSample\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t5216CD181BC04B43005B729F /* Debug */,\n\t\t\t\t5216CD191BC04B43005B729F /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t52CF0ADA1B920DC20061022D /* Build configuration list for PBXNativeTarget \"ExampleMacSample\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t52CF0ADB1B920DC20061022D /* Debug */,\n\t\t\t\t52CF0ADC1B920DC20061022D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tAD64D9951B8DE69200C783D3 /* Build configuration list for PBXNativeTarget \"ExampleWatchSample Extension\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tAD64D9961B8DE69200C783D3 /* Debug */,\n\t\t\t\tAD64D9971B8DE69200C783D3 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tAD64D9991B8DE69200C783D3 /* Build configuration list for PBXNativeTarget \"ExampleWatchSample\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tAD64D99A1B8DE69200C783D3 /* Debug */,\n\t\t\t\tAD64D99B1B8DE69200C783D3 /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tAD695CDA1B46CD65004E998D /* Build configuration list for PBXProject \"Example\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tAD695CFC1B46CD65004E998D /* Debug */,\n\t\t\t\tAD695CFD1B46CD65004E998D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\tAD695CFE1B46CD65004E998D /* Build configuration list for PBXNativeTarget \"ExampleSample\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\tAD695CFF1B46CD65004E998D /* Debug */,\n\t\t\t\tAD695D001B46CD65004E998D /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\n/* Begin XCSwiftPackageProductDependency section */\n\t\tCC6E521824EC192700DF1D80 /* Carlos */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Carlos;\n\t\t};\n\t\tCC6E521A24EC192F00DF1D80 /* Carlos */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Carlos;\n\t\t};\n\t\tCC6E521C24EC193500DF1D80 /* Carlos */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Carlos;\n\t\t};\n\t\tCC6E521E24EC194E00DF1D80 /* Carlos */ = {\n\t\t\tisa = XCSwiftPackageProductDependency;\n\t\t\tproductName = Carlos;\n\t\t};\n/* End XCSwiftPackageProductDependency section */\n\t};\n\trootObject = AD695CD71B46CD65004E998D /* Project object */;\n}\n"
  },
  {
    "path": "Example/Example.xcodeproj/project.xcworkspace/contents.xcworkspacedata",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Workspace\n   version = \"1.0\">\n   <FileRef\n      location = \"self:/Users/ilisovyi/Development/Carlos/Example/Example.xcodeproj\">\n   </FileRef>\n</Workspace>\n"
  },
  {
    "path": "Example/Example.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>IDEDidComputeMac32BitWarning</key>\n\t<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "Gemfile",
    "content": "source 'https://rubygems.org'\n\ngem 'fastlane', '~> 2.140'\ngem 'rake'"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2020 SPRING AS Digital News Media GmbH\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "MIGRATING.md",
    "content": "## Migrating from 0.8 to 0.9\n\n### Swift 3 support\n\nPlease make sure to convert all usages of `Carlos` APIs to the Swift 3 counterparts. In most cases there won't be a big syntactic difference.\n\n### Deprecated functions\n\nAll deprecated functions have been removed. This were of 2 types:\n\n- Global functions\n- Functions taking fetch closures or transformation closures\n\nFor the first type, just use the corresponding protocol extension function.\n\nFor the second type, please use `BasicFetcher` instead of fetch closures, and explicit `OneWayTransformationBox` instances instead of transformation closures.\n\n### Custom operators\n\nAll custom operators have been removed. Please use the corresponding protocol extension functions instead. This may require some reordering of the objects.\n\n## Migrating from 0.7 to 0.8\n\n### `Promise` now has only an empty `init`. \n\nIf you used one of the convenience `init` (with `value:`, with `error:` or with `value:error:`), they now moved to `Future`.\n\n```swift\n// Before\nlet future = Promise(value: 10).future\n\n// Now\nlet future = Future(10)\n```\n\n```swift\n// Before\nlet future = Promise(error: MyError.SomeError).future\n\n// Now\nlet future = Future(MyError.SomeError)\n```\n\n```swift\n// Before\nlet future = Promise(value: someOptionalInt, error: MyError.InvalidConversion).future\n\n// Now\nlet future = Future(value: someOptionalInt, error: MyError.InvalidConversion)\n```\n\n## Migrating from 0.6 to 0.7\n\n##### - Please note that with `Carlos` 0.7 the `Future` and `Promise`s code has been moved to a new framework. \n\n- If you use `CocoaPods` or `Carthage`, you will just have to add a `import PiedPiper` line everywhere you make use of Carlos' `Future`s. \n- If you did a submodule integration, please add `PiedPiper` as `Embeded binary` to your target.\n- If you did a manual integration, please make sure that all the files missing from your target are re-added from the `Futures` folder.\n\n##### - Check all your usages of `onCompletion` and replace the tuple `(value, error)` with the value `result`. Code will look like the following:\n\n*Before*\n```swift\nfuture.onCompletion { (value, error) in\n  if let value = value {\n    //handle success case\n  } else if let error = error {\n  \t//handle error case\n  } else {\n    //handle cancelation case\n  }\n}\n```\n\n*Now*\n```swift\nfuture.onCompletion { result in\n  switch result {\n  case .Success(let value):\n     //handle success case\n  case .Error(let error):\n    //handle error case\n  case .Cancelled:\n    //handle cancelation case\n  }\n}\n```\n\n##### - Check all your usages of closures in the API. Methods taking closures instead of `Fetcher`, `CacheLevel` or `OneWayTransformer` values have been deprecated.\n\n## Migrating from 0.4 to 0.5\n\n##### - Rename all your usages of `CacheRequest` to `Future`\n##### - If you created come custom `CacheLevel` or `Fetcher`, you should internally use `Promise` instead of `Future` so that you can control when the request can `fail` or `succeed`. `Future` is in fact a read-only version of `Promise`\n\n*Before*\n```swift\nclass MyCustomLevel: Fetcher {\n  typealias KeyType = String\n  typealias OutputType = String\n\n  func get(key: String) -> CacheRequest<String> {\n    let request = CacheRequest<String>()\n   \n    //Do stuff...\n    request.succeed(\"Yay!\")\n\n    return request\n  }\n}\n```\n\n*Now*\n```swift\nclass MyCustomLevel: Fetcher {\n  typealias KeyType = String\n  typealias OutputType = String\n\n  func get(key: String) -> Future<String> {\n    let request = Promise<String>()\n   \n    //Do stuff...\n    request.succeed(\"Yay!\")\n\n    return request.future\n  }\n}\n```\n\n##### - If you created some custom `OneWayTransformer` or `TwoWayTransformer`, you should return `Future` now. This means that you have to wrap simple return values into `Future` instances\n\n*Before*\n```swift\nlet transformer = OneWayTransformationBox<String, String>(transform: { $0.uppercaseString })\n```\n\n*Now*\n```swift\nlet transformer = OneWayTransformationBox<String, String>(transform: { Promise(value: $0.uppercaseString).future })\n```\n\n##### - If you used the `conditioned` API, the same async changes apply\n\n*Before*\n```swift\nlet conditionedCache = myCache.conditioned { key in \n  //whatever\n  return true\n}\n```\n\n*Now*\n```swift\nlet conditionedCache = myCache.conditioned { key in\n  return Promise(value: true).future\n}\n```\n\n##### - If you use global functions, please consider using protocol extensions instead. Global functions are now **deprecated** and will be discontinued in `Carlos 1.0`\n\nFor example:\n\n*Before*\n```swift\nlet cache = compose(firstLevel, secondLevel)\n```\n\n*Now*\n```swift\nlet cache = firstLevel.compose(secondLevel)\n```"
  },
  {
    "path": "Package.resolved",
    "content": "{\n  \"object\": {\n    \"pins\": [\n      {\n        \"package\": \"CwlCatchException\",\n        \"repositoryURL\": \"https://github.com/mattgallagher/CwlCatchException.git\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"35f9e770f54ce62dd8526470f14c6e137cef3eea\",\n          \"version\": \"2.1.1\"\n        }\n      },\n      {\n        \"package\": \"CwlPreconditionTesting\",\n        \"repositoryURL\": \"https://github.com/mattgallagher/CwlPreconditionTesting.git\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"c21f7bab5ca8eee0a9998bbd17ca1d0eb45d4688\",\n          \"version\": \"2.1.0\"\n        }\n      },\n      {\n        \"package\": \"Nimble\",\n        \"repositoryURL\": \"https://github.com/Quick/Nimble.git\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"c93f16c25af5770f0d3e6af27c9634640946b068\",\n          \"version\": \"9.2.1\"\n        }\n      },\n      {\n        \"package\": \"Quick\",\n        \"repositoryURL\": \"https://github.com/Quick/Quick.git\",\n        \"state\": {\n          \"branch\": null,\n          \"revision\": \"bd86ca0141e3cfb333546de5a11ede63f0c4a0e6\",\n          \"version\": \"4.0.0\"\n        }\n      }\n    ]\n  },\n  \"version\": 1\n}\n"
  },
  {
    "path": "Package.swift",
    "content": "// swift-tools-version:5.2\n\nimport PackageDescription\n\nlet package = Package(\n  name: \"Carlos\",\n  platforms: [\n    .iOS(.v13),\n    .macOS(.v10_15),\n    .tvOS(.v13),\n    .watchOS(.v6)\n  ],\n  products: [\n    .library(\n      name: \"Carlos\",\n      targets: [\"Carlos\"]\n    )\n  ],\n  dependencies: [\n    .package(url: \"https://github.com/Quick/Quick.git\", .upToNextMajor(from: \"4.0.0\")),\n    .package(url: \"https://github.com/Quick/Nimble.git\", .upToNextMajor(from: \"9.2.0\"))\n  ],\n  targets: [\n    .target(\n      name: \"Carlos\",\n      dependencies: []\n    ),\n    .testTarget(\n      name: \"CarlosTests\",\n      dependencies: [\n        \"Carlos\",\n        \"Quick\",\n        \"Nimble\"\n      ]\n    )\n  ],\n  swiftLanguageVersions: [.v5]\n)\n"
  },
  {
    "path": "README.md",
    "content": "# Carlos\r\n\r\n[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\r\n\r\n> A simple but flexible cache, written in Swift for `iOS 13+` and `WatchOS 6` apps.\r\n\r\n# Breaking Changes\r\nCarlos 1.0.0 has been migrated from PiedPiper dependency to Combine hence the minimum supported platforms versions are equal to the Combine's minimum supported platforms versions. See the releases page for more information. \r\n\r\n# Contents of this Readme\r\n\r\n- [Carlos](#carlos)\r\n- [Breaking Changes](#breaking-changes)\r\n- [Contents of this Readme](#contents-of-this-readme)\r\n  - [What is Carlos?](#what-is-carlos)\r\n  - [Installation](#installation)\r\n    - [Swift Package Manager (Preferred)](#swift-package-manager-preferred)\r\n    - [CocoaPods](#cocoapods)\r\n    - [Carthage](#carthage)\r\n  - [Requirements](#requirements)\r\n  - [Usage](#usage)\r\n    - [Usage examples](#usage-examples)\r\n    - [Creating requests](#creating-requests)\r\n    - [Key transformations](#key-transformations)\r\n    - [Value transformations](#value-transformations)\r\n    - [Post-processing output](#post-processing-output)\r\n    - [Conditioned output post-processing](#conditioned-output-post-processing)\r\n    - [Conditioned value transformation](#conditioned-value-transformation)\r\n    - [Composing transformers](#composing-transformers)\r\n    - [Pooling requests](#pooling-requests)\r\n    - [Batching get requests](#batching-get-requests)\r\n    - [Conditioning caches](#conditioning-caches)\r\n    - [Multiple cache lanes](#multiple-cache-lanes)\r\n    - [Listening to memory warnings](#listening-to-memory-warnings)\r\n    - [Normalization](#normalization)\r\n    - [Creating custom levels](#creating-custom-levels)\r\n    - [Creating custom fetchers](#creating-custom-fetchers)\r\n    - [Built-in levels](#built-in-levels)\r\n    - [Logging](#logging)\r\n  - [Tests](#tests)\r\n  - [Future development](#future-development)\r\n  - [Apps using Carlos](#apps-using-carlos)\r\n  - [Authors](#authors)\r\n    - [Contributors:](#contributors)\r\n  - [License](#license)\r\n  - [Acknowledgements](#acknowledgements)\r\n\r\n## What is Carlos?\r\n\r\n`Carlos` is a small set of classes and functions to **realize custom, flexible and powerful cache layers** in your application.\r\n\r\nWith a Functional Programming vocabulary, Carlos makes for a monoidal cache system. You can check the best explanation of how that is realized [here](https://bkase.github.io/slides/composable-caching-swift/) or in [this video](https://www.youtube.com/watch?v=8uqXuEZLyUU), thanks to [@bkase](https://github.com/bkase) for the slides.\r\n\r\nBy default, **`Carlos` ships with an in-memory cache, a disk cache, a simple network fetcher and a `NSUserDefaults` cache** (the disk cache is inspired by [HanekeSwift](https://github.com/Haneke/HanekeSwift)).\r\n\r\nWith `Carlos` you can:\r\n\r\n- **[create levels and fetchers](#creating-custom-levels)** depending on your needs\r\n- [combine levels](#usage-examples)\r\n- Cancel pending requests\r\n- [transform the key](#key-transformations) each level will get, [or the values](#value-transformations) each level will output (this means you're free to implement every level independing on how it will be used later on). Some common value transformers are already provided with `Carlos`\r\n- Apply [post-processing steps](#post-processing-output) to a cache level, for example sanitizing the output or resizing images\r\n- [Post-processing steps](#conditioned-output-post-processing) and [value transformations](#conditioned-value-transformation) can also be applied conditionally on the key used to fetch the value\r\n- [react to memory pressure events](#listening-to-memory-warnings) in your app\r\n- **automatically populate upper levels when one of the lower levels fetches a value** for a key, so the next time the first level will already have it cached\r\n- enable or disable specific levels of your composed cache depending on [boolean conditions](#conditioning-caches)\r\n- easily [**pool requests**](#pooling-requests) so you don't have to care whether 5 requests with the same key have to be executed by an expensive cache level before even only 1 of them is done. `Carlos` can take care of that for you\r\n- [batch get requests](#batching-get-requests) to only get notified when all of them are done\r\n- setup [multiple lanes](#multiple-cache-lanes) for complex scenarios where, depending on certain keys or conditions, different caches should be used\r\n- have a type-safe complex cache that won't even compile if the code doesn't satisfy the type requirements\r\n\r\n## Installation\r\n\r\n### Swift Package Manager (Preferred)\r\nAdd `Carlos` to your project through the Xcode or add the following line to your package dependencies: \r\n```swift\r\n.package(\"https://github.com/spring-media/Carlos\", from: \"1.0.0\")\r\n```\r\n\r\n### CocoaPods\r\n`Carlos` is available through [CocoaPods](http://cocoapods.org). To install\r\nit, simply add the following line to your Podfile:\r\n\r\n```\r\npod \"Carlos\", :git => \"https://github.com/spring-media/Carlos\"\r\n```\r\n\r\n### Carthage\r\n`Carthage` is also supported.\r\n\r\n## Requirements\r\n- iOS 13.0+\r\n- WatchOS 6+\r\n- Xcode 12+\r\n\r\n## Usage\r\nTo run the example project, clone the repo.\r\n\r\n### Usage examples\r\n```swift\r\nlet cache = MemoryCacheLevel<String, NSData>().compose(DiskCacheLevel())\r\n```\r\n\r\nThis line will generate a cache that takes `String` keys and returns `NSData` values.\r\nSetting a value for a given key on this cache will set it for both the levels.\r\nGetting a value for a given key on this cache will first try getting it on the memory level, and if it cannot find one, will ask the disk level.\r\nIn case both levels don't have a value, the request will fail.\r\nIn case the disk level can fetch a value, this will also be set on the memory level so that the next fetch will be faster.\r\n\r\n`Carlos` comes with a `CacheProvider` class so that standard caches are easily accessible.\r\n\r\n- `CacheProvider.dataCache()` to create a cache that takes `URL` keys and returns `NSData` values\r\n- `CacheProvider.imageCache()` to create a cache that takes `URL` keys and returns `UIImage` values\r\n- `CacheProvider.JSONCache()` to create a cache that takes `URL` keys and returns `AnyObject` values (that should be then safely casted to arrays or dictionaries depending on your application)\r\n\r\nThe above methods always create new instances (so calling `CacheProvider.imageCache()` twice doesn't return the same instance, even though the disk level will be effectively shared because it will use the same folder on disk, but this is a side-effect and should not be relied upon) and you should take care of retaining the result in your application layer.\r\nIf you want to always get the same instance, you can use the following accessors instead:\r\n\r\n- `CacheProvider.sharedDataCache` to retrieve a shared instance of a data cache\r\n- `CacheProvider.sharedImageCache` to retrieve a shared instance of an image cache\r\n- `CacheProvider.sharedJSONCache` to retrieve a shared instance of a JSON cache\r\n\r\n### Creating requests\r\n\r\nTo fetch a value from a cache, use the `get` method.\r\n\r\n```swift\r\ncache.get(\"key\")\r\n  .sink( \r\n    receiveCompletion: { completion in \r\n      if case let .failure(error) = completion {\r\n        print(\"An error occurred :( \\(error)\")\r\n      }\r\n    },\r\n    receiveValue: { value in \r\n      print(\"I found \\(value)!\")\r\n    }\r\n  )\r\n```\r\n\r\nA request can also be canceled with the `cancel()` method, and you can be notified of this event by calling `onCancel` on a given request:\r\n\r\n```swift\r\nlet cancellable = cache.get(key)\r\n                    .handleEvents(receiveCancel: { \r\n                      print(\"Looks like somebody canceled this request!\")\r\n                    })\r\n                    .sink(...)\r\n[... somewhere else]\r\ncancellable.cancel()\r\n```\r\n\r\nThis cache is not very useful, though. It will never *actively* fetch values, just store them for later use. Let's try to make it more interesting:\r\n\r\n```swift\r\nlet cache = MemoryCacheLevel()\r\n              .compose(DiskCacheLevel())\r\n              .compose(NetworkFetcher())\r\n```\r\n\r\nThis will create a cache level that takes `URL` keys and stores `NSData` values (the type is inferred from the `NetworkFetcher` hard-requirement of `URL` keys and `NSData` values, while `MemoryCacheLevel` and `DiskCacheLevel` are much more flexible as described later).\r\n\r\n### Key transformations\r\n\r\nKey transformations are meant to make it possible to plug cache levels in whatever cache you're building.\r\n\r\nLet's see how they work:\r\n\r\n```swift    \r\n// Define your custom ErrorType values\r\nenum URLTransformationError: Error {\r\n    case invalidURLString\r\n}\r\n\r\nlet transformedCache = NetworkFetcher().transformKeys(\r\n  OneWayTransformationBox(\r\n    transform: {\r\n      Future { promise in \r\n        let url = URL(string: $0) {\r\n          promise(.success(url))\r\n        } else {\r\n          promise(.failure(URLTransformationError.invalidURLString))\r\n        }\r\n      }\r\n    }\r\n  )\r\n)\r\n```\r\n\r\nWith the line above, we're saying that all the keys coming into the NetworkFetcher level have to be transformed to `URL` values first. We can now plug this cache into a previously defined cache level that takes `String` keys:\r\n\r\n```swift\r\nlet cache = MemoryCacheLevel<String, NSData>().compose(transformedCache)\r\n```\r\n\r\nIf this doesn't look very safe (one could always pass string garbage as a key and it won't magically translate to a `URL`, thus causing the `NetworkFetcher` to silently fail), we can still use a domain specific structure as a key, assuming it contains both `String` and `URL` values:\r\n\r\n```swift\r\nstruct Image {\r\n  let identifier: String\r\n  let URL: Foundation.URL\r\n}\r\n\r\nlet imageToString = OneWayTransformationBox(transform: { (image: Image) -> AnyPublisher<String, String> in\r\n    Just(image.identifier).eraseToAnyPublisher()\r\n})\r\n\r\nlet imageToURL = OneWayTransformationBox(transform: { (image: Image) -> AnyPublisher<URL> in\r\n    Just(image.URL).eraseToAnyPublisher()\r\n})\r\n\r\nlet memoryLevel = MemoryCacheLevel<String, NSData>().transformKeys(imageToString)\r\nlet diskLevel = DiskCacheLevel<String, NSData>().transformKeys(imageToString)\r\nlet networkLevel = NetworkFetcher().transformKeys(imageToURL)\r\n\r\nlet cache = memoryLevel.compose(diskLevel).compose(networkLevel)\r\n```\r\n\r\nNow we can perform safe requests like this:\r\n\r\n```swift\r\nlet image = Image(identifier: \"550e8400-e29b-41d4-a716-446655440000\", URL: URL(string: \"http://goo.gl/KcGz8T\")!)\r\n\r\ncache.get(image).sink {\r\n  print(\"Found \\(value)!\")\r\n}\r\n```\r\n\r\nSince `Carlos 0.5` you can also apply conditions to `OneWayTransformers` used for key transformations. Just call the `conditioned` function on the transformer and pass your condition. The condition can also be asynchronous and has to return a `AnyPublisher<Bool, Error>`, having the chance to return a specific error for the failure of the transformation.\r\n\r\n```swift\r\nlet transformer = OneWayTransformationBox<String, URL>(transform: { key in\r\n  Future { promise in \r\n    if let value = URL(string: key) {\r\n      promise(.success(value))\r\n    } else {\r\n      promise(.failure(MyError.stringIsNotURL))\r\n    }\r\n  }.eraseToAnyPublisher()\r\n}).conditioned { key in\r\n  Just(key)\r\n    .filter { $0.rangeOfString(\"http\") != nil }\r\n    .eraseToAnyPublisher()\r\n}\r\n\r\nlet cache = CacheProvider.imageCache().transformKeys(transformer)\r\n```\r\n\r\nThat's not all, though.\r\n\r\nWhat if our disk cache only stores `Data`, but we want our memory cache to conveniently store `UIImage` instances instead?\r\n\r\n### Value transformations\r\n\r\nValue transformers let you have a cache that (let's say) stores `Data` and mutate it to a cache that stores `UIImage` values. Let's see how:\r\n\r\n```swift\r\nlet dataTransformer = TwoWayTransformationBox(transform: { (image: UIImage) -> AnyPublisher<Data, Error> in\r\n    Just(UIImagePNGRepresentation(image)).eraseToAnyPublisher()\r\n}, inverseTransform: { (data: Data) -> AnyPublisher<UIImage, Error> in\r\n    Just(UIImage(data: data)!).eraseToAnyPublisher()\r\n})\r\n\r\nlet memoryLevel = MemoryCacheLevel<String, UIImage>().transformKeys(imageToString).transformValues(dataTransformer)\r\n```\r\n\r\nThis memory level can now replace the one we had before, with the difference that it will internally store `UIImage` values!\r\n\r\nKeep in mind that, as with key transformations, if your transformation closure fails (either the forward transformation or the inverse transformation), the cache level will be skipped, as if the fetch would fail. Same considerations apply for `set` calls.\r\n\r\n`Carlos` comes with some value transformers out of the box, for example:\r\n\r\n- `JSONTransformer` to serialize `NSData` instances into JSON\r\n- `ImageTransformer` to serialize `NSData` instances into `UIImage` values (not available on the Mac OS X framework)\r\n- `StringTransformer` to serialize `NSData` instances into `String` values with a given encoding\r\n- Extensions for some Cocoa classes (`DateFormatter`, `NumberFormatter`, `MKDistanceFormatter`) so that you can use customized instances depending on your needs.\r\n\r\nAs of `Carlos 0.4`, it's possible to transform values coming out of `Fetcher` instances with just a `OneWayTransformer` (as opposed to the required `TwoWayTransformer` for normal `CacheLevel` instancess. This is because the `Fetcher` protocol doesn't require `set`).\r\nThis means you can easily chain `Fetcher`s that get a JSON from the internet and transform their output to a model object (for example a `struct`) into a complex cache pipeline without having to create a dummy inverse transformation just to satisfy the requirements of the `TwoWayTransformer` protocol.\r\n\r\nAs of `Carlos 0.5`, all transformers natively support asynchronous computation, so you can have expensive transformations in your custom transformers without blocking other operations. In fact, the `ImageTransformer` that comes out of the box processes image transformations on a background queue.\r\n\r\nAs of `Carlos 0.5` you can also apply conditions to `TwoWayTransformers` used for value transformations. Just call the `conditioned` function on the transformer and pass your conditions (one for the forward transformation, one for the inverse transformation). The conditions can also be asynchronous and have to return a `AnyPublisher<Bool, Error>`, having the chance to return a specific error for the failure of the transformation.\r\n\r\n```swift\r\nlet transformer = JSONTransformer().conditioned({ input in\r\n  Just(myCondition).eraseToAnyPublisher()\r\n}, inverseCondition: { input in\r\n  Just(myCondition)eraseToAnyPublisher()\r\n})\r\n\r\nlet cache = CacheProvider.dataCache().transformValues(transformer)\r\n```\r\n\r\n### Post-processing output\r\n\r\nIn some cases your cache level could return the right value, but in a sub-optimal format. For example, you would like to sanitize the output you're getting from the Cache as a whole, independently of the exact layer that returned it.\r\n\r\nFor these cases, the `postProcess` function introduced with `Carlos 0.4` could come helpful.\r\nThe function is available as a protocol extension of the `CacheLevel` protocol.\r\n\r\nThe `postProcess` function takes a `CacheLevel` and a `OneWayTransformer` with `TypeIn == TypeOut` as parameters and outputs a decorated `BasicCache` with the post-processing step embedded in.\r\n\r\n```swift\r\n// Let's create a simple \"to uppercase\" transformer\r\nlet transformer = OneWayTransformationBox<NSString, String>(transform: { Just($0.uppercased() as String).eraseToAnyPublisher() })\r\n\r\n// Our memory cache\r\nlet memoryCache = MemoryCacheLevel<String, NSString>()\r\n\r\n// Our decorated cache\r\nlet transformedCache = memoryCache.postProcess(transformer)\r\n\r\n// Lowercase value set on the memory layer\r\nmemoryCache.set(\"test String\", forKey: \"key\")\r\n\r\n// We get the lowercase value from the undecorated memory layer\r\nmemoryCache.get(\"key\").sink { value in\r\n  let x = value\r\n}\r\n\r\n// We get the uppercase value from the decorated cache, though\r\ntransformedCache.get(\"key\").sink { value in\r\n  let x = value\r\n}\r\n```\r\n\r\nSince `Carlos 0.5` you can also apply conditions to `OneWayTransformers` used for post processing transformations. Just call the `conditioned` function on the transformer and pass your condition. The condition can also be asynchronous and has to return a `AnyPublisher<Bool, Error>`, having the chance to return a specific error for the failure of the transformation. Keep in mind that the condition will actually take the output of the cache as the input, not the key used to fetch this value! If you want to apply conditions based on the key, use `conditionedPostProcess` instead, but keep in mind this doesn't support using `OneWayTransformer` instances yet.\r\n\r\n```swift\r\nlet processer = OneWayTransformationBox<NSData, NSData>(transform: { value in\r\n      Future { promise in \r\n        if let value = String(data: value as Data, encoding: .utf8)?.uppercased().data(using: .utf8) as NSData? {\r\n          promise(.success(value))\r\n        } else {\r\n          promise(.failure(FetchError.conditionNotSatisfied))\r\n        }\r\n      }\r\n    }).conditioned { value in\r\n      Just(value.length < 1000).eraseToAnyPublisher()\r\n    }\r\n\r\nlet cache = CacheProvider.dataCache().postProcess(processer)\r\n```\r\n\r\n### Conditioned output post-processing\r\n\r\nExtending the case for simple [output post-processing](#post-processing-output), you can also apply conditional transformations based on the key used to fetch the value.\r\n\r\nFor these cases, the `conditionedPostProcess` function introduced with `Carlos 0.6` could come helpful.\r\nThe function is available as a protocol extension of the `CacheLevel` protocol.\r\n\r\nThe `conditionedPostProcess` function takes a `CacheLevel` and a conditioned transformer conforming to `ConditionedOneWayTransformer` as parameters and outputs a decorated `CacheLevel` with the conditional post-processing step embedded in.\r\n\r\n```swift\r\n\r\n// Our memory cache\r\nlet memoryCache = MemoryCacheLevel<String, NSString>()\r\n\r\n// Our decorated cache\r\nlet transformedCache = memoryCache.conditionedPostProcess(ConditionedOneWayTransformationBox(conditionalTransformClosure: { (key, value) in\r\n\tif key == \"some sentinel value\" {\r\n\t    return Just(value.uppercased()).eraseToAnyPublisher()\r\n\t} else {\r\n\t    return Just(value).eraseToAnyPublisher()\r\n\t}\r\n})\r\n\r\n// Lowercase value set on the memory layer\r\nmemoryCache.set(\"test String\", forKey: \"some sentinel value\")\r\n\r\n// We get the lowercase value from the undecorated memory layer\r\nmemoryCache.get(\"some sentinel value\").sink { value in\r\n  let x = value\r\n}\r\n\r\n// We get the uppercase value from the decorated cache, though\r\ntransformedCache.get(\"some sentinel value\").sink { value in\r\n  let x = value\r\n}\r\n```\r\n\r\n### Conditioned value transformation\r\n\r\nExtending the case for simple [value transformation](#value-transformations), you can also apply conditional transformations based on the key used to fetch or set the value.\r\n\r\nFor these cases, the `conditionedValueTransformation` function introduced with `Carlos 0.6` could come helpful.\r\nThe function is available as a protocol extension of the `CacheLevel` protocol.\r\n\r\nThe `conditionedValueTransformation` function takes a `CacheLevel` and a conditioned transformer conforming to `ConditionedTwoWayTransformer` as parameters and outputs a decorated `CacheLevel` with a modified `OutputType` (equal to the transformer's `TypeOut`, as in the normal value transformation case) with the conditional value transformation step embedded in.\r\n\r\n```swift\r\n\r\n// Our memory cache\r\nlet memoryCache = MemoryCacheLevel<String, NSString>()\r\n\r\n// Our decorated cache\r\nlet transformedCache = memoryCache.conditionedValueTransformation(ConditionedTwoWayTransformationBox(conditionalTransformClosure: { (key, value) in\r\n\tif key == \"some sentinel value\" {\r\n\t    return Just(1).eraseToAnyPublisher()\r\n\t} else {\r\n\t    return Just(0).eraseToAnyPublisher()\r\n\t}\r\n}, conditionalInverseTransformClosure: { (key, value) in\r\n    if key > 0 {\r\n\t    return Just(\"Positive\").eraseToAnyPublisher()\r\n\t} else {\r\n\t\treturn Just(\"Null or negative\").eraseToAnyPublisher()\r\n\t}\r\n})\r\n\r\n// Value set on the memory layer\r\nmemoryCache.set(\"test String\", forKey: \"some sentinel value\")\r\n\r\n// We get the same value from the undecorated memory layer\r\nmemoryCache.get(\"some sentinel value\").sink { value in\r\n  let x = value\r\n}\r\n\r\n// We get 1 from the decorated cache, though\r\ntransformedCache.get(\"some sentinel value\").sink { value in\r\n  let x = value\r\n}\r\n\r\n// We set \"Positive\" on the decorated cache\r\ntransformedCache.set(5, forKey: \"test\")\r\n```\r\n\r\n### Composing transformers\r\n\r\nAs of `Carlos 0.4`, it's possible to compose multiple `OneWayTransformer` objects.\r\nThis way, one can create several transformer modules to build a small library and then combine them as more convenient depending on the application.\r\n\r\nYou can compose the transformers in the same way you do with normal `CacheLevel`s: with the `compose` protocol extension:\r\n\r\n```swift\r\nlet firstTransformer = ImageTransformer() // NSData -> UIImage\r\nlet secondTransformer = ImageTransformer().invert() // Trivial UIImage -> NSData\r\n\r\nlet identityTransformer = firstTransformer.compose(secondTransformer)\r\n```\r\n\r\nThe same approach can be applied to `TwoWayTransformer` objects (that by the way are already `OneWayTransformer` as well).\r\n\r\nMany transformer modules will be provided by default with `Carlos`.\r\n\r\n### Pooling requests\r\n\r\nWhen you have a working cache, but some of your levels are expensive (say a Network fetcher or a database fetcher), **you may want to pool requests in a way that multiple requests for the same key, coming together before one of them completes, are grouped so that when one completes all of the other complete as well without having to actually perform the expensive operation multiple times**.\r\n\r\nThis functionality comes with `Carlos`.\r\n\r\n```swift\r\nlet cache = (memoryLevel.compose(diskLevel).compose(networkLevel)).pooled()\r\n```\r\n\r\nKeep in mind that the key must conform to the `Hashable` protocol for the `pooled` function to work:\r\n\r\n\r\n```swift\r\nextension Image: Hashable {\r\n  var hashValue: Int {\r\n    return identifier.hashValue\r\n  }\r\n}\r\n\r\nextension Image: Equatable {}\r\n\r\nfunc ==(lhs: Image, rhs: Image) -> Bool {\r\n  return lhs.identifier == rhs.identifier && lhs.URL == rhs.URL\r\n}\r\n```\r\n\r\nNow we can execute multiple fetches for the same `Image` value and be sure that only one network request will be started.\r\n\r\n### Batching get requests\r\n\r\nSince `Carlos 0.7` you can pass a list of keys to your `CacheLevel` through `batchGetSome`.\r\nThis returns a `AnyPublisher` that succeeds when all the requests for the specified keys *complete*, not necessarily succeeding. You will only get the successful values in the success callback, though.\r\n\r\nSince `Carlos 0.9` you can transform your `CacheLevel` into one that takes a list of keys through `allBatch`.\r\nCalling `get` on such a `CacheLevel` returns a `AnyPublisher` that succeeds only when the requests for **all** of the specified keys succeed, and fails **as soon as one** of the requests for the specified keys fails.\r\nIf you cancel the `AnyPublisher` returned by this `CacheLevel`, all of the pending requests are canceled, too.\r\n\r\nAn example of the usage:\r\n\r\n```swift\r\nlet cache = MemoryCacheLevel<String, Int>()\r\n\r\nfor iter in 0..<99 {\r\n  cache.set(iter, forKey: \"key_\\(iter)\")\r\n}\r\n\r\nlet keysToBatch = (0..<100).map { \"key_\\($0)\" }\r\n\r\ncache.batchGetSome(keysToBatch).sink(\r\n    receiveCompletion: { completion in \r\n        print(\"Failed because \\($0)\")\r\n    },\r\n    receiveValue: { values in \r\n        print(\"Got \\(values.count) values in total\")\r\n    }\r\n)\r\n```\r\n\r\nIn this case the `allBatch().get` call would fail because there are only 99 keys set and the last request will make the whole batch fail, with a `valueNotInCache` error. The `batchGetSome().get` will succeed instead, printing `Got 99 values in total`.\r\n\r\nSince `allBatch` returns a new `CacheLevel` instance, it can be composed or transformed just like any other cache:\r\n\r\nIn this case `cache` is a cache that takes a sequence of `String` keys and returns a `AnyPublisher` of a list of `Int` values, but is limited to 3 concurrent requests (see the next paragraph for more information on limiting concurrent requests).\r\n\r\n### Conditioning caches\r\n\r\nSometimes we may have levels that should only be queried under some conditions. Let's say we have a `DatabaseLevel` that should only be triggered when users enable a given setting in the app that actually starts storing data in the database. We may want to avoid accessing the database if the setting is disabled in the first place.\r\n\r\n```swift\r\nlet conditionedCache = cache.conditioned { key in\r\n  Just(appSettingIsEnabled).eraseToAnyPublisher()\r\n}\r\n```\r\n\r\nThe closure gets the key the cache was asked to fetch and has to return a `AnyPublisher<Bool, Error>` object indicating whether the request can proceed or should skip the level, with the possibility to fail with a specific `Error` to communicate the error to the caller.\r\n\r\nAt runtime, if the variable `appSettingIsEnabled` is `false`, the `get` request will skip the level (or fail if this was the only or last level in the cache). If `true`, the `get` request will be executed.\r\n\r\n### Multiple cache lanes\r\n\r\nIf you have a complex scenario where, depending on the key or some other external condition, either one or another cache should be used, then the `switchLevels` function could turn useful.\r\n\r\nUsage:\r\n\r\n```swift\r\nlet lane1 = MemoryCacheLevel<URL, NSData>() // The two lanes have to be equivalent (same key type, same value type).\r\nlet lane2 = CacheProvider.dataCache() // Keep in mind that you can always use key transformation or value transformations if two lanes don't match by default\r\n\r\nlet switched = switchLevels(lane1, lane2) { key in\r\n  if key.scheme == \"http\" {\r\n  \treturn .cacheA\r\n  } else {\r\n   \treturn .cacheB // The example is just meant to show how to return different lanes\r\n  }\r\n}\r\n```\r\n\r\nNow depending on the scheme of the key URL, either the first lane or the second will be used.\r\n\r\n### Listening to memory warnings\r\n\r\nIf we store big objects in memory in our cache levels, we may want to be notified of memory warning events. This is where the `listenToMemoryWarnings` and `unsubscribeToMemoryWarnings` functions come handy:\r\n\r\n```swift\r\nlet token = cache.listenToMemoryWarnings()\r\n```\r\n\r\nand later\r\n\r\n```swift\r\nunsubscribeToMemoryWarnings(token)\r\n```\r\n\r\nWith the first call, the cache level and all its composing levels will get a call to `onMemoryWarning` when a memory warning comes.\r\n\r\nWith the second call, the behavior will stop.\r\n\r\nKeep in mind that this functionality is not yet supported by the WatchOS 2 framework `CarlosWatch.framework`.\r\n\r\n### Normalization\r\n\r\nIn case you need to store the result of multiple `Carlos` composition calls in a property, it may be troublesome to set the type of the property to `BasicCache` as some calls return different types (e.g. `PoolCache`). In this case, you can `normalize` the cache level before assigning it to the property and it will be converted to a `BasicCache` value.\r\n\r\n```swift\r\nimport Carlos\r\n\r\nclass CacheManager {\r\n  let cache: BasicCache<URL, NSData>\r\n\r\n  init(injectedCache: BasicCache<URL, NSData>) {\r\n\tself.cache = injectedCache\r\n  }\r\n}\r\n\r\n[...]\r\n\r\nlet manager = CacheManager(injectedCache: CacheProvider.dataCache().pooled()) // This won't compile\r\n\r\nlet manager = CacheManager(injectedCache: CacheProvider.dataCache().pooled().normalize()) // This will\r\n```\r\n\r\nAs a tip, always use `normalize` if you need to assign the result of multiple composition calls to a property. The call is a no-op if the value is already a `BasicCache`, so there will be no performance loss in that case.\r\n\r\n### Creating custom levels\r\n\r\nCreating custom levels is easy and encouraged (after all, there are multiple cache libraries already available if you only need memory, disk and network functionalities!).\r\n\r\nLet's see how to do it:\r\n\r\n```swift\r\nclass MyLevel: CacheLevel {\r\n  typealias KeyType = Int\r\n  typealias OutputType = Float\r\n\r\n  func get(_ key: KeyType) -> AnyPublisher<OutputType, Error> {\r\n    Future {\r\n      // Perform the fetch and either succeed or fail\r\n    }.eraseToAnyPublisher()\r\n  }\r\n\r\n  func set(_ value: OutputType, forKey key: KeyType) -> AnyPublisher<Void, Error> {  \r\n    Future {\r\n      // Store the value (db, memory, file, etc) and call this on completion:\r\n    }.eraseToAnyPublisher()\r\n  }\r\n\r\n  func clear() {\r\n    // Clear the stored values\r\n  }\r\n\r\n  func onMemoryWarning() {\r\n    // A memory warning event came. React appropriately\r\n  }\r\n}\r\n```\r\n\r\nThe above class conforms to the `CacheLevel` protocol.\r\nFirst thing we need is to declare what key types we accept and what output types we return. In this example case, we have `Int` keys and `Float` output values.\r\n\r\nThe required methods to implement are 4: `get`, `set`, `clear` and `onMemoryWarning`.\r\nThis sample cache can now be pipelined to a list of other caches, transforming its keys or values if needed as we saw in the earlier paragraphs.\r\n\r\n### Creating custom fetchers\r\n\r\nWith `Carlos 0.4`, the `Fetcher` protocol was introduced to make it easier for users of the library to create custom fetchers that can be used as read-only levels in the cache. An example of a \"`Fetcher` in disguise\" that has always been included in `Carlos` is `NetworkFetcher`: you can only use it to read from the network, not to write (`set`, `clear` and `onMemoryWarning` were **no-ops**).\r\n\r\nThis is how easy it is now to implement your custom fetcher:\r\n\r\n```swift\r\nclass CustomFetcher: Fetcher {\r\n  typealias KeyType = String\r\n  typealias OutputType = String\r\n\r\n  func get(_ key: KeyType) -> Anypublisher<OutputType, Error> {\r\n    return Just(\"Found an hardcoded value :)\").eraseToAnyPublisher()\r\n  }\r\n}\r\n```\r\n\r\nYou still need to declare what `KeyType` and `OutputType` your `CacheLevel` deals with, of course, but then you're only required to implement `get`. Less boilerplate for you!\r\n\r\n### Built-in levels\r\n\r\n`Carlos` comes with 3 cache levels out of the box:\r\n\r\n- `MemoryCacheLevel`\r\n- `DiskCacheLevel`\r\n- `NetworkFetcher`\r\n- Since the `0.5` release, a `UserDefaultsCacheLevel`\r\n\r\n**MemoryCacheLevel** is a volatile cache that internally stores its values in an `NSCache` instance. The capacity can be specified through the initializer, and it supports clearing under memory pressure (if the level is [subscribed to memory warning notifications](#listening-to-memory-warnings)).\r\nIt accepts keys of any given type that conforms to the `StringConvertible` protocol and can store values of any given type that conforms to the `ExpensiveObject` protocol. `Data`, `NSData`, `String`, `NSString` `UIImage`, `URL` already conform to the latter protocol out of the box, while `String`, `NSString` and `URL` conform to the `StringConvertible` protocol.\r\nThis cache level is thread-safe.\r\n\r\n**DiskCacheLevel** is a persistent cache that asynchronously stores its values on disk. The capacity can be specified through the initializer, so that the disk size will never get too big.\r\nIt accepts keys of any given type that conforms to the `StringConvertible` protocol and can store values of any given type that conforms to the `NSCoding` protocol.\r\nThis cache level is thread-safe, and currently the only `CacheLevel` that can fail when calling `set`, with a `DiskCacheLevelError.diskArchiveWriteFailed` error.\r\n\r\n**NetworkFetcher** is a cache level that asynchronously fetches values over the network.\r\nIt accepts `URL` keys and returns `NSData` values.\r\nThis cache level is thread-safe.\r\n\r\n**NSUserDefaultsCacheLevel** is a persistent cache that stores its values on a `UserDefaults` persistent domain with a specific name.\r\nIt accepts keys of any given type that conforms to the `StringConvertible` protocol and can store values of any given type that conforms to the `NSCoding` protocol.\r\nIt has an internal soft cache used to avoid hitting the persistent storage too often, and can be cleared without affecting other values saved on the `standardUserDefaults` or on other persistent domains.\r\nThis cache level is thread-safe.\r\n\r\n### Logging\r\n\r\nWhen we decided how to handle logging in Carlos, we went for the most flexible approach that didn't require us to code a complete logging framework, that is the ability to plug-in your own logging library.\r\nIf you want the output of Carlos to only be printed if exceeding a given level, if you want to completely silent it for release builds, or if you want to route it to a file, or whatever else: just assign your logging handling closure to `Carlos.Logger.output`:\r\n\r\n```swift\r\nCarlos.Logger.output = { message, level in\r\n   myLibrary.log(message) //Plug here your logging library\r\n}\r\n```\r\n\r\n## Tests\r\n\r\n`Carlos` is thouroughly tested so that the features it's designed to provide are safe for refactoring and as much as possible bug-free.\r\n\r\nWe use [Quick](https://github.com/Quick/Quick) and [Nimble](https://github.com/Quick/Nimble) instead of `XCTest` in order to have a good BDD test layout.\r\n\r\nAs of today, there are around **1000 tests** for `Carlos` (see the folder `Tests`), and overall the tests codebase is *double the size* of the production codebase.\r\n\r\n## Future development\r\n\r\n`Carlos` is under development and [here](https://github.com/WeltN24/Carlos/issues) you can see all the open issues. They are assigned to milestones so that you can have an idea of when a given feature will be shipped.\r\n\r\nIf you want to contribute to this repo, please:\r\n\r\n- Create an issue explaining your problem and your solution\r\n- Clone the repo on your local machine\r\n- Create a branch with the issue number and a short abstract of the feature name\r\n- Implement your solution\r\n- Write tests (untested features won't be merged)\r\n- When all the tests are written and green, create a pull request, with a short description of the approach taken\r\n\r\n## Apps using Carlos\r\n\r\n- [Die Welt Edition](https://itunes.apple.com/de/app/welt-edition-digitale-zeitung/id372746348?mt=8)\r\n- [Welt news](https://itunes.apple.com/de/app/welt-news-aktuelle-nachrichten/id340021100?mt=8)\r\n\r\nUsing Carlos? Please let us know through a Pull request, we'll be happy to mention your app!\r\n\r\n## Authors\r\n\r\n`Carlos` was made in-house by WeltN24\r\n\r\n### Contributors:\r\n\r\nVittorio Monaco, [vittorio.monaco@weltn24.de](mailto:vittorio.monaco@weltn24.de), [@vittoriom](https://github.com/vittoriom) on Github, [@Vittorio_Monaco](https://twitter.com/Vittorio_Monaco) on Twitter\r\n\r\nEsad Hajdarevic, @esad\r\n\r\n## License\r\n\r\n`Carlos` is available under the MIT license. See the LICENSE file for more info.\r\n\r\n## Acknowledgements\r\n\r\n`Carlos` internally uses:\r\n\r\nThe **DiskCacheLevel** class is inspired by [Haneke](https://github.com/Haneke/HanekeSwift). The source code has been heavily modified, but adapting the original file has proven valuable for `Carlos` development.\r\n"
  },
  {
    "path": "Sources/Carlos/CacheLevels/BatchAllCache.swift",
    "content": "import Combine\n\n/// A reified batchGetAll\npublic final class BatchAllCache<KeySeq: Sequence, Cache: CacheLevel>: CacheLevel where KeySeq.Iterator.Element == Cache.KeyType {\n  /// A sequence of keys for the wrapped cache\n  public typealias KeyType = KeySeq\n  /// An array of output elements\n  public typealias OutputType = [Cache.OutputType]\n\n  private let cache: Cache\n\n  public init(cache: Cache) {\n    self.cache = cache\n  }\n\n  /**\n    Dispatch each key in the sequence in parallel\n    Merge the results -- if any key fails, it all fails\n   */\n  public func get(_ key: KeyType) -> AnyPublisher<OutputType, Error> {\n    let all = key.map(cache.get)\n\n    return all.publisher\n      .setFailureType(to: Error.self)\n      .flatMap { $0 }\n      .collect(all.count)\n      .eraseToAnyPublisher()\n  }\n\n  /**\n   Zip the keys with the values and set them all\n   */\n  public func set(_ value: OutputType, forKey key: KeyType) -> AnyPublisher<Void, Error> {\n    let initial = Just(())\n      .setFailureType(to: Error.self)\n      .eraseToAnyPublisher()\n    return zip(value, key)\n      .map(cache.set)\n      .reduce(initial) { previous, current in\n        previous.flatMap { current }\n          .eraseToAnyPublisher()\n      }\n  }\n\n  public func remove(_ key: KeyType) -> AnyPublisher<Void, Error> {\n    let all = key.map(cache.remove)\n    return all.publisher\n      .setFailureType(to: Error.self)\n      .collect(all.count)\n      .map { _ in () }\n      .eraseToAnyPublisher()\n  }\n\n  public func clear() {\n    cache.clear()\n  }\n\n  public func onMemoryWarning() {\n    cache.onMemoryWarning()\n  }\n}\n\nextension CacheLevel {\n  /**\n   Wrap a <K, V> cache into a <Sequence<K>, [V]> cache where\n   each k in Sequence<K> is dispatched in parallel and if any K fails,\n   it all fails\n   */\n  public func allBatch<KeySeq: Sequence>() -> BatchAllCache<KeySeq, Self> {\n    BatchAllCache(cache: self)\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/CacheLevels/Composed.swift",
    "content": "import Combine\nimport Foundation\n\nextension CacheLevel {\n  /**\n   Composes two cache levels\n\n   - parameter cache: The second cache level\n\n   - returns: A new cache level that is the result of the composition of the two cache levels\n   */\n  public func compose<A: CacheLevel>(_ cache: A) -> BasicCache<A.KeyType, A.OutputType> where A.KeyType == KeyType, A.OutputType == OutputType {\n    BasicCache(\n      getClosure: { key in\n        self.get(key)\n          .catch { _ -> AnyPublisher<OutputType, Error> in\n            Logger.log(\"Composed| error on getting value for key \\(key) on cache \\(String(describing: self)).\", .info)\n\n            return cache.get(key)\n              .flatMap { [weak self] value -> AnyPublisher<(OutputType, Void), Error> in\n                guard let self = self else {\n                  return Empty(completeImmediately: true).eraseToAnyPublisher()\n                }\n\n                let get = Just(value).setFailureType(to: Error.self)\n                let set = self.set(value, forKey: key)\n                return Publishers.Zip(get, set)\n                  .eraseToAnyPublisher()\n              }\n              .map(\\.0)\n              .eraseToAnyPublisher()\n          }.eraseToAnyPublisher()\n      },\n      setClosure: { value, key in\n        Publishers.Zip(\n          self.set(value, forKey: key),\n          cache.set(value, forKey: key)\n        )\n        .map { _ in () }\n        .eraseToAnyPublisher()\n      },\n      removeClosure: { key in\n        Publishers.Zip(self.remove(key), cache.remove(key))\n          .map { _ in () }\n          .eraseToAnyPublisher()\n      },\n      clearClosure: {\n        self.clear()\n        cache.clear()\n      },\n      memoryClosure: {\n        self.onMemoryWarning()\n        cache.onMemoryWarning()\n      }\n    )\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/CacheLevels/Conditioned.swift",
    "content": "import Combine\nimport Foundation\n\nextension CacheLevel {\n  /**\n   Wraps the CacheLevel with a boolean condition on the key that controls when a get call should fail unconditionally\n\n   - parameter condition: The condition closure that takes a key and returns true if the key can be fetched, or false if the request should fail unconditionally. The closure can also pass a specific error in case it wants to explicitly communicate why it failed. The condition can be asynchronous and has to return a Future<Bool>\n\n   - returns: A new BasicCache that will check for the condition before every get is dispatched to the decorated cache level\n\n   The condition doesn't apply to the set, clear, onMemoryWarning calls\n   */\n  public func conditioned(_ condition: @escaping (KeyType) -> AnyPublisher<Bool, Error>) -> BasicCache<KeyType, OutputType> {\n    BasicCache(\n      getClosure: conditionedClosure(get, condition: condition),\n      setClosure: set,\n      removeClosure: remove,\n      clearClosure: clear,\n      memoryClosure: onMemoryWarning\n    )\n  }\n}\n\nprivate func conditionedClosure<A, B>(_ closure: @escaping (A) -> AnyPublisher<B, Error>, condition: @escaping (A) -> AnyPublisher<Bool, Error>) -> ((A) -> AnyPublisher<B, Error>) {\n  return { input in\n    condition(input).flatMap { (passesCondition: Bool) -> AnyPublisher<B, Error> in\n      if passesCondition {\n        return closure(input)\n      } else {\n        return Fail(error: FetchError.conditionNotSatisfied).eraseToAnyPublisher()\n      }\n    }.eraseToAnyPublisher()\n  }\n}\n\nextension OneWayTransformer {\n  /**\n   Wraps the transformer with a boolean condition on the input that controls when a transformation should fail unconditionally.\n\n   - parameter condition: The condition closure that takes an input and returns true if the input can be transformed, or false if the request should fail unconditionally. The closure can also pass a specific error in case it wants to explicitly communicate why it failed. The condition can be asynchronous and has to return a Future<Bool>\n\n   - returns: A new OneWayTransformer that will check for the condition before every transformation is dispatched to the decorated transformer\n   */\n  public func conditioned(_ condition: @escaping (TypeIn) -> AnyPublisher<Bool, Error>) -> OneWayTransformationBox<TypeIn, TypeOut> {\n    OneWayTransformationBox(transform: conditionedClosure(transform, condition: condition))\n  }\n}\n\nextension TwoWayTransformer {\n  /**\n   Wraps the transformer with a boolean condition on the input and a boolean condition on the \"inverse input\" that controls when a transformation on either side should fail unconditionally.\n\n   - parameter condition: The condition closure used for normal transformations that takes an input and returns true if the input can be transformed, or false if the request should fail unconditionally. The closure can also pass a specific error in case it wants to explicitly communicate why it failed. The condition can be asynchronous and has to return a Future<Bool>\n   - parameter inverseCondition: The condition closure used for inverse transformations that takes a TypeOut argument and returns true if the input can be transformed, or false if the request should fail unconditionally. The closure can also pass a specific error in case it wants to explicitly communicate why it failed. The condition can be asynchronous and has to return a Future<Bool>.\n\n   - returns: A new TwoWayTransformer that will check for the conditions before every transformation is dispatched to the decorated transformer\n   */\n  public func conditioned(_ condition: @escaping (TypeIn) -> AnyPublisher<Bool, Error>, inverseCondition: @escaping (TypeOut) -> AnyPublisher<Bool, Error>) -> TwoWayTransformationBox<TypeIn, TypeOut> {\n    TwoWayTransformationBox(\n      transform: conditionedClosure(transform, condition: condition),\n      inverseTransform: conditionedClosure(inverseTransform, condition: inverseCondition)\n    )\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/CacheLevels/DiskCacheLevel.swift",
    "content": "import Combine\nimport Foundation\n\npublic enum DiskCacheLevelError: Error {\n  case diskArchiveWriteFailed\n}\n\n/// This class is a disk cache level. It has a configurable total size that defaults to 100 MB.\npublic final class DiskCacheLevel<K: StringConvertible, T: NSCoding>: CacheLevel {\n  /// At the moment the disk cache level only accepts keys that can be converted to string values\n  public typealias KeyType = K\n\n  /// The output type of the cache, should conform to NSCoding\n  public typealias OutputType = T\n\n  private let path: String\n  private var size: UInt64 = 0\n  private let fileManager: FileManager\n\n  /// The capacity of the cache\n  public var capacity: UInt64 = 0 {\n    didSet {\n      cacheQueue.async {\n        self.controlCapacity()\n      }\n    }\n  }\n\n  private lazy var cacheQueue: DispatchQueue = {\n    DispatchQueue(label: \"\\(CarlosGlobals.queueNamePrefix)\\((self.path as NSString).lastPathComponent)\")\n  }()\n\n  /**\n   This method is a no-op since all the contents of the cache are stored on disk, so removing them would have no benefit for memory pressure\n   */\n  public func onMemoryWarning() {}\n\n  /**\n   Initializes a new disk cache level\n\n   - parameter path: The path to the disk storage. Defaults to a Carlos specific folder in the Caches sandbox folder.\n   - parameter capacity: The total capacity in bytes for the disk cache. Defaults to 100 MB\n   - parameter fileManager: The file manager to use. Defaults to the default NSFileManager. It's here mainly for dependency injection testing purposes.\n   */\n  public init(\n    path: String = (CarlosGlobals.caches as NSString).appendingPathComponent(CarlosGlobals.queueNamePrefix + \"default\"),\n    capacity: UInt64 = 100 * 1024 * 1024,\n    fileManager: FileManager = FileManager.default\n  ) {\n    self.path = path\n    self.fileManager = fileManager\n    self.capacity = capacity\n\n    _ = try? fileManager.createDirectory(atPath: path, withIntermediateDirectories: true, attributes: [:])\n\n    cacheQueue.async {\n      self.calculateSize()\n      self.controlCapacity()\n    }\n  }\n\n  /**\n   Asynchronously sets a value for the given key\n\n   - parameter value: The value to save on disk\n   - parameter key: The key for the value\n   */\n  public func set(_ value: T, forKey key: K) -> AnyPublisher<Void, Error> {\n    Logger.log(\"DiskCacheLevel| Setting a value for the key \\(key.toString()) on the disk cache \\(self)\", .info)\n\n    return Just((value, key))\n      .setFailureType(to: Error.self)\n      .subscribe(on: cacheQueue)\n      .flatMap { [weak self] payload -> AnyPublisher<Void, Error> in\n        guard let self = self else {\n          return Empty(completeImmediately: true).eraseToAnyPublisher()\n        }\n\n        return self.setDataSync(payload.0, key: payload.1)\n      }\n      .eraseToAnyPublisher()\n  }\n\n  /**\n   Asynchronously gets the value for the given key\n\n   - parameter key: The key for the value\n\n   - returns: A Future where you can call onSuccess and onFailure to be notified of the result of the fetch\n   */\n  public func get(_ key: KeyType) -> AnyPublisher<OutputType, Error> {\n    AnyPublisher.create { [weak self] promise in\n      guard let self = self else {\n        return\n      }\n\n      let path = self.pathForKey(key)\n\n      if let data = try? Data(contentsOf: URL(fileURLWithPath: path)),\n        let obj = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? T\n      {\n        Logger.log(\"DiskCacheLevel| Fetched \\(key.toString()) on disk level\", .info)\n\n        promise(.success(obj))\n\n        _ = self.updateDiskAccessDateAtPath(path)\n      } else {\n        // Remove the file (maybe corrupted)\n        Logger.log(\"DiskCacheLevel| Failed fetching \\(key.toString()) in path: \\(path) on the disk cache\", .info)\n\n        _ = try? self.fileManager.removeItem(atPath: path)\n\n        promise(.failure(FetchError.valueNotInCache))\n      }\n    }\n    .subscribe(on: cacheQueue)\n    .eraseToAnyPublisher()\n  }\n\n  public func remove(_ key: K) -> AnyPublisher<Void, Error> {\n    AnyPublisher.create { [weak self] promise in\n      guard let path = self?.pathForKey(key) else {\n        return\n      }\n\n      do {\n        Logger.log(\"DiskCacheLevel| Removing \\(key.toString()) at path: \\(path) on the disk cache\", .info)\n        try self?.fileManager.removeItem(atPath: path)\n\n        self?.calculateSize()\n\n        promise(.success(()))\n      } catch {\n        Logger.log(\"DiskCacheLevel| Failed to remove \\(key.toString()) at path: \\(path) on the disk cache\", .error)\n\n        promise(.failure(error))\n      }\n    }\n    .subscribe(on: cacheQueue)\n    .eraseToAnyPublisher()\n  }\n\n  /**\n   Asynchronously clears the contents of the cache\n\n   All the cached files will be removed from the disk storage\n   */\n  public func clear() {\n    cacheQueue.async {\n      self.itemsInDirectory(self.path).forEach { filePath in\n        _ = try? self.fileManager.removeItem(atPath: filePath)\n      }\n      self.calculateSize()\n    }\n  }\n\n  // MARK: Private\n\n  private func removeData(_ key: K) {\n    cacheQueue.async {\n      self.removeFileAtPath(self.pathForKey(key))\n    }\n  }\n\n  private func pathForKey(_ key: K) -> String {\n    let md5PathComponent = key.toString().MD5String()\n    let strippedMd5PathComponent = stripSpecialCharactersForPath(from: md5PathComponent)\n\n    return (path as NSString).appendingPathComponent(strippedMd5PathComponent)\n  }\n\n  private func stripSpecialCharactersForPath(from string: String) -> String {\n    let okayChars = Set(\"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLKMNOPQRSTUVWXYZ1234567890\")\n    return string.filter { okayChars.contains($0) }\n  }\n\n  private func sizeForFileAtPath(_ filePath: String) -> UInt64 {\n    var size: UInt64 = 0\n\n    do {\n      let attributes: NSDictionary = try fileManager.attributesOfItem(atPath: filePath) as NSDictionary\n      size = attributes.fileSize()\n    } catch {}\n\n    return size\n  }\n\n  private func calculateSize() {\n    size = itemsInDirectory(path).reduce(0) { accumulator, filePath in\n      accumulator + sizeForFileAtPath(filePath)\n    }\n  }\n\n  private func controlCapacity() {\n    if size > capacity {\n      enumerateContentsOfDirectorySortedByAscendingModificationDateAtPath(path) { (URL, stop: inout Bool) in\n        removeFileAtPath(URL.path)\n        stop = size <= capacity\n      }\n    }\n  }\n\n  private func setDataSync(_ data: T, key: K) -> AnyPublisher<Void, Error> {\n    let path = pathForKey(key)\n    let previousSize = sizeForFileAtPath(path)\n\n    do {\n      let data = try NSKeyedArchiver.archivedData(withRootObject: data, requiringSecureCoding: false)\n      try data.write(to: URL(fileURLWithPath: path), options: .atomicWrite)\n\n      _ = updateDiskAccessDateAtPath(path)\n\n      let newSize = sizeForFileAtPath(path)\n      if newSize > previousSize {\n        size += newSize - previousSize\n        controlCapacity()\n      } else {\n        size -= previousSize - newSize\n      }\n\n      return Just(())\n        .setFailureType(to: Error.self)\n        .eraseToAnyPublisher()\n    } catch {\n      Logger.log(\"DiskCacheLevel| Failed to write key \\(key.toString()) on the disk cache\", .error)\n      return Fail(error: DiskCacheLevelError.diskArchiveWriteFailed).eraseToAnyPublisher()\n    }\n  }\n\n  private func updateDiskAccessDateAtPath(_ path: String) -> Bool {\n    var result = false\n\n    do {\n      try fileManager.setAttributes([\n        FileAttributeKey.modificationDate: Date()\n      ], ofItemAtPath: path)\n      result = true\n    } catch _ {}\n\n    return result\n  }\n\n  private func removeFileAtPath(_ path: String) {\n    do {\n      if let attributes: NSDictionary = try fileManager.attributesOfItem(atPath: path) as NSDictionary? {\n        try fileManager.removeItem(atPath: path)\n        size -= attributes.fileSize()\n      }\n    } catch _ {}\n  }\n\n  private func itemsInDirectory(_ directory: String) -> [String] {\n    var items: [String] = []\n\n    do {\n      items = try fileManager.contentsOfDirectory(atPath: directory).map {\n        (directory as NSString).appendingPathComponent($0)\n      }\n    } catch _ {}\n\n    return items\n  }\n\n  private func enumerateContentsOfDirectorySortedByAscendingModificationDateAtPath(_ path: String, usingBlock block: (URL, inout Bool) -> Void) {\n    let property = URLResourceKey.contentModificationDateKey\n\n    do {\n      let directoryURL = URL(fileURLWithPath: path)\n      let contents = try fileManager.contentsOfDirectory(at: directoryURL, includingPropertiesForKeys: [property], options: [])\n      let sortedContents = contents.sorted(by: { URL1, URL2 in\n        var value1: AnyObject?\n        do {\n          try (URL1 as NSURL).getResourceValue(&value1, forKey: property)\n        } catch _ {\n          return true\n        }\n\n        var value2: AnyObject?\n        do {\n          try (URL2 as NSURL).getResourceValue(&value2, forKey: property)\n        } catch _ {\n          return false\n        }\n\n        if let date1 = value1 as? Date, let date2 = value2 as? Date {\n          return date1.compare(date2) == .orderedAscending\n        }\n\n        return false\n      })\n\n      for value in sortedContents {\n        var stop = false\n        block(value, &stop)\n        if stop {\n          break\n        }\n      }\n    } catch _ {}\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/CacheLevels/Fetcher.swift",
    "content": "//\n//  Fetcher.swift\n//\n//\n//  Created by Lisovyi, Ivan on 24.10.20.\n//\n\nimport Combine\nimport Foundation\n\n/// An abstraction for a generic cache level that can only fetch values but not store them\npublic protocol Fetcher: CacheLevel {}\n\n/// Extending the Fetcher protocol to have a default no-op implementation for clear, onMemoryWarning and set\nextension Fetcher {\n  /// No-op\n  public func remove(_ key: KeyType) -> AnyPublisher<Void, Error> {\n    Empty(completeImmediately: true).eraseToAnyPublisher()\n  }\n\n  /// No-op\n  public func clear() {}\n\n  /// No-op\n  public func onMemoryWarning() {}\n\n  /// No-op\n  public func set(_: OutputType, forKey _: KeyType) -> AnyPublisher<Void, Error> {\n    Empty(completeImmediately: true).eraseToAnyPublisher()\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/CacheLevels/MemoryCacheLevel.swift",
    "content": "import Combine\nimport Foundation\n\n/// This class is a memory cache level. It internally uses NSCache, and has a configurable total cost limit that defaults to 50 MB.\npublic final class MemoryCacheLevel<K: StringConvertible, T: AnyObject>: CacheLevel where T: ExpensiveObject {\n  /// At the moment the memory cache level only accepts String keys\n  public typealias KeyType = K\n  public typealias OutputType = T\n\n  private let internalCache: NSCache<NSString, AnyObject>\n\n  /**\n   Initializes a new memory cache level\n\n   - parameter cost: The total cost limit for the memory cache. Defaults to 50 MB\n   */\n  public init(capacity: Int = 50 * 1024 * 1024) {\n    internalCache = NSCache()\n    internalCache.totalCostLimit = capacity\n  }\n\n  /**\n   Synchronously gets a value for the given key\n\n   - parameter key: The key for the value\n\n   - returns: A Future where you can call onSuccess and onFailure to be notified of the result of the fetch\n   */\n  public func get(_ key: KeyType) -> AnyPublisher<OutputType, Error> {\n    AnyPublisher.create { [weak self] promise in\n      if let result = self?.internalCache.object(forKey: key.toString() as NSString) as? T {\n        Logger.log(\"MemoryCacheLevel| Fetched \\(key.toString()) on memory level.\", .info)\n        promise(.success(result))\n      } else {\n        Logger.log(\"MemoryCacheLevel| Failed fetching \\(key.toString()) on the memory cache.\", .info)\n        promise(.failure(FetchError.valueNotInCache))\n      }\n    }\n    .eraseToAnyPublisher()\n  }\n\n  public func remove(_ key: K) -> AnyPublisher<Void, Error> {\n    AnyPublisher.create { [weak self] promise in\n      Logger.log(\"MemoryCacheLevel| Removing \\(key.toString()) on memory level.\", .info)\n\n      self?.internalCache.removeObject(forKey: key.toString() as NSString)\n      \n      promise(.success(()))\n    }\n  }\n\n  /**\n   Clears the contents of the cache\n   */\n  public func onMemoryWarning() {\n    clear()\n  }\n\n  /**\n   Sets a value for the given key\n\n   - parameter value: The value to set\n   - parameter key: The key for the value\n   */\n  public func set(_ value: T, forKey key: K) -> AnyPublisher<Void, Error> {\n    AnyPublisher.create { [weak self] promise in\n      self?.internalCache.setObject(value, forKey: key.toString() as NSString, cost: value.cost)\n\n      promise(.success(()))\n    }\n  }\n\n  /**\n   Clears the contents of the cache\n   */\n  public func clear() {\n    internalCache.removeAllObjects()\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/CacheLevels/NSUserDefaultsCacheLevel.swift",
    "content": "import Combine\nimport Foundation\n\n/**\n Default name for the persistent domain used by the NSUserDefaultsCacheLevel\n\n Keep in mind that using this domain for multiple cache levels at the same time could lead to undesired results!\n For example, if one of the cache levels get cleared, also the other will be affected unless they save something before leaving the app.\n The behavior is not 100% certain and this possibility is discouraged.\n */\npublic let DefaultUserDefaultsDomainName = \"CarlosPersistentDomain\"\n\n/// This class is a NSUserDefaults cache level. It has a configurable domain name so that multiple levels can be included in the same sandboxed app.\npublic final class NSUserDefaultsCacheLevel<K: StringConvertible, T: NSCoding>: CacheLevel {\n  /// The key type of the cache, should be convertible to String values\n  public typealias KeyType = K\n\n  /// The output type of the cache, should conform to NSCoding\n  public typealias OutputType = T\n\n  private let domainName: String\n  private let lock: UnfairLock\n  private let userDefaults: UserDefaults\n  private var internalDomain: [String: Data]?\n  private var safeInternalDomain: [String: Data] {\n    if let internalDomain = internalDomain {\n      return internalDomain\n    } else {\n      let fetchedDomain = (userDefaults.persistentDomain(forName: domainName) as? [String: Data]) ?? [:]\n      internalDomain = fetchedDomain\n      return fetchedDomain\n    }\n  }\n\n  /**\n   Creates a new instance of this NSUserDefaults-based cache level.\n\n   - parameter name: The name to use for the persistent domain on NSUserDefaults. Should be unique in your sandboxed app\n   */\n  public init(name: String = DefaultUserDefaultsDomainName) {\n    domainName = name\n\n    lock = UnfairLock()\n    userDefaults = UserDefaults.standard\n    internalDomain = safeInternalDomain\n  }\n\n  /**\n   Sets a new value for the given key\n\n   - parameter value: The value to set for the given key\n   - parameter key: The key you want to set\n\n   This method will convert the value to NSData by using NSCoding and save the data on the persistent domain.\n\n   A soft-cache is used to avoid hitting the persistent domain everytime you are going to fetch values from this cache. The operation is thread-safe\n   */\n  public func set(_ value: OutputType, forKey key: KeyType) -> AnyPublisher<Void, Error> {\n    AnyPublisher.create { [weak self] promise in\n      guard let self = self else {\n        return\n      }\n\n      var softCache = self.safeInternalDomain\n\n      Logger.log(\"Setting a value for the key \\(key.toString()) on the user defaults cache \\(self)\")\n\n      if let data = try? NSKeyedArchiver.archivedData(withRootObject: value, requiringSecureCoding: false) {\n        softCache[key.toString()] = data\n        self.internalDomain = softCache\n        self.userDefaults.setPersistentDomain(softCache, forName: self.domainName)\n\n        promise(.success(()))\n      } else {\n        Logger.log(\"Failed setting a value for the key \\(key.toString()) on the user defaults cache \\(self)\")\n\n        promise(.failure(FetchError.invalidCachedData))\n      }\n    }\n    .eraseToAnyPublisher()\n  }\n\n  /**\n   Fetches a value on the persistent domain for the given key\n\n   - parameter key: The key you want to fetch\n\n   - returns: The result of this fetch on the cache\n\n   A soft-cache is used to avoid hitting the persistent domain everytime. This operation is thread-safe\n   */\n  public func get(_ key: KeyType) -> AnyPublisher<OutputType, Error> {\n    AnyPublisher.create { [weak self] promise in\n      guard let self = self else {\n        return\n      }\n\n      if let cachedValue = self.safeInternalDomain[key.toString()] {\n        if let unencodedObject = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(cachedValue) as? T {\n          Logger.log(\"Fetched \\(key.toString()) on user defaults level (domain \\(self.domainName)\")\n          promise(.success(unencodedObject))\n        } else {\n          Logger.log(\"Failed fetching \\(key.toString()) on the user defaults cache (domain \\(self.domainName), corrupted data\")\n          promise(.failure(FetchError.invalidCachedData))\n        }\n      } else {\n        Logger.log(\"Failed fetching \\(key.toString()) on the user defaults cache (domain \\(self.domainName), no data\")\n        promise(.failure(FetchError.valueNotInCache))\n      }\n    }\n    .eraseToAnyPublisher()\n  }\n\n  public func remove(_ key: K) -> AnyPublisher<Void, Error> {\n    AnyPublisher.create { [weak self] promise in\n      self?.userDefaults.removeObject(forKey: key.toString())\n      promise(.success(()))\n    }\n  }\n\n  /**\n   Completely clears the contents of this cache\n\n   Please keep in mind that if the same name is used for multiple cache levels, the contents of these caches will also be cleared, at least from a persistence point of view.\n   The soft caches of the other levels will still contain consistent values, though, so setting a value on one of these levels will result in the whole previous content of the cache to be persisted on NSUserDefaults, even this may or may not be the desired behavior.\n   The conclusion is that you should only use the same name for multiple cache levels if you are aware of the consequences. In general the behavior may not be the expected one.\n\n   The operation is thread-safe\n   */\n  public func clear() {\n    lock.locked {\n      userDefaults.removePersistentDomain(forName: domainName)\n      internalDomain = [:]\n    }\n  }\n\n  /**\n   Clears the contents of the soft cache for this cache level.\n\n   Fetching or setting a value after this call is safe, since the content will be pre-fetched from the disk immediately before.\n\n   The operation is thread-safe\n   */\n  public func onMemoryWarning() {\n    lock.locked {\n      internalDomain = nil\n    }\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/CacheLevels/NetworkFetcher.swift",
    "content": "import Foundation\n\nimport Combine\n\npublic enum NetworkFetcherError: Error {\n  /// Used when the status code of the network response is not included in the range 200..<300\n  case statusCodeNotOk\n\n  /// Used when the network response had an invalid size\n  case invalidNetworkResponse\n\n  /// Used when the network request didn't manage to retrieve data\n  case noDataRetrieved\n}\n\n/// This class is a network cache level, mostly acting as a fetcher (meaning that calls to the set method won't have any effect). It internally uses NSURLSession to retrieve values from the internet\nopen class NetworkFetcher: Fetcher {\n  /// The network cache accepts only NSURL keys\n  public typealias KeyType = URL\n\n  /// The network cache returns only NSData values\n  public typealias OutputType = NSData\n\n  /**\n   Initializes a new instance of a NetworkFetcher\n   */\n  public init() {}\n\n  /**\n   Asks the cache to get a value for the given key\n\n   - parameter key: The key for the value. It represents the URL to fetch the value\n\n   - returns: A Future that you can use to get the asynchronous results of the network fetch\n   */\n  open func get(_ key: KeyType) -> AnyPublisher<OutputType, Error> {\n    URLSession.shared.dataTaskPublisher(for: key)\n      .tryMap { [weak self] data, response -> NSData in\n        guard let response = response as? HTTPURLResponse else {\n          throw NetworkFetcherError.invalidNetworkResponse\n        }\n\n        guard 200..<300 ~= response.statusCode else {\n          throw NetworkFetcherError.statusCodeNotOk\n        }\n\n        if self?.validate(response, withData: data) == true {\n          return data as NSData\n        }\n\n        throw NetworkFetcherError.invalidNetworkResponse\n      }\n      .eraseToAnyPublisher()\n  }\n\n  private func validate(_ response: HTTPURLResponse, withData data: Data) -> Bool {\n    var responseIsValid = true\n    let expectedContentLength = response.expectedContentLength\n    if expectedContentLength > -1 {\n      responseIsValid = Int64(data.count) >= expectedContentLength\n    }\n    return responseIsValid\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/CacheLevels/PoolCache.swift",
    "content": "import Combine\nimport Foundation\n\nextension CacheLevel where KeyType: Hashable {\n  /// Wraps the CacheLevel with a requests pool\n  ///\n  /// - Returns: A `PoolCache` that will pool requests coming to the decorated cache.\n  ///            This means that multiple requests for the same key will be pooled and only one will be actually done\n  ///            (so that expensive operations like network or file system fetches will only be done once).\n  public func pooled() -> PoolCache<Self> {\n    PoolCache(internalCache: self)\n  }\n}\n\n/// A CacheLevel that pools incoming get requests.\n///\n/// This means that multiple requests for the same key will be pooled and only one will be actually executed\n/// (so that expensive operations like network or file system fetches will only be done once).\npublic final class PoolCache<C: CacheLevel>: CacheLevel where C.KeyType: Hashable {\n  public typealias KeyType = C.KeyType\n  public typealias OutputType = C.OutputType\n\n  private let internalCache: C\n  private let lock: UnfairLock\n  private var requestsPool: [C.KeyType: AnyPublisher<C.OutputType, Error>] = [:]\n\n  /// Creates a new instance of a pooled cache\n  ///\n  /// - Parameter internalCache: The CacheLevel instance that this pooled cache will manage\n  public init(internalCache: C) {\n    self.internalCache = internalCache\n    lock = UnfairLock()\n  }\n\n  /// Asks the cache to get the value for the given key\n  ///\n  ///  - Parameter key: The key for the value\n  ///\n  /// - Returns: A `Publisher` that could either have been just created or it could have been reused from a pool of pending Publishers\n  ///            if there is a Publisher for the same key going on at the moment.\n  public func get(_ key: KeyType) -> AnyPublisher<OutputType, Error> {\n    if let pooledRequest = lock.locked({ self.requestsPool[key] }) {\n      Logger.log(\"Using pooled request \\(pooledRequest) for key \\(key)\")\n      return pooledRequest\n    }\n\n    let request = internalCache.get(key)\n\n    lock.locked {\n      self.requestsPool[key] = request\n    }\n\n    Logger.log(\"Creating a new request \\(request) for key \\(key)\")\n\n    return request\n      .handleEvents(receiveCompletion: { [weak self] _ in\n        self?.lock.locked {\n          self?.requestsPool[key] = nil\n        }\n      })\n      .eraseToAnyPublisher()\n  }\n\n  /// Sets a value for the given key on the managed cache\n  ///\n  /// - Parameter value: The value to set\n  /// - Parameter key: The key for the value\n  public func set(_ value: C.OutputType, forKey key: C.KeyType) -> AnyPublisher<Void, Error> {\n    internalCache.set(value, forKey: key)\n  }\n\n  public func remove(_ key: C.KeyType) -> AnyPublisher<Void, Error> {\n    internalCache.remove(key)\n  }\n\n  /// Clears the managed cache\n  public func clear() {\n    internalCache.clear()\n  }\n\n  /// Notifies the managed cache that a memory warning event was thrown\n  public func onMemoryWarning() {\n    internalCache.onMemoryWarning()\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/CacheProvider.swift",
    "content": "import Foundation\n\n/// A provider for the built-int caches.\npublic enum CacheProvider {\n  /// A shared data cache instance\n  public static let sharedDataCache: BasicCache<URL, NSData> = CacheProvider.dataCache()\n\n  /// A shared JSON cache instance\n  public static let sharedJSONCache: BasicCache<URL, AnyObject> = CacheProvider.JSONCache()\n\n  /// A shared image cache instance\n  public static let sharedImageCache: BasicCache<URL, CarlosImage> = CacheProvider.imageCache()\n\n  /// - Returns: An initialized and configured CacheLevel that takes URL keys and stores NSData values.\n  ///           Network requests are pooled for efficiency. Keep in mind that calling this method twice returns two different instances.\n  ///           You should take care of retaining the result or use `sharedDataCache` instead.\n  public static func dataCache() -> BasicCache<URL, NSData> {\n    MemoryCacheLevel<URL, NSData>()\n      .compose(\n        DiskCacheLevel<URL, NSData>().compose(NetworkFetcher())\n          .pooled()\n      )\n  }\n\n  /// - Returns: An initialized and configured CacheLevel that takes URL keys and stores JSON values in the form of AnyObject.\n  ///            Network requests are pooled for efficiency. Keep in mind that calling this method twice returns two different instances.\n  ///            You should take care of retaining the result or use `sharedJSONCache` instead\n  public static func JSONCache() -> BasicCache<URL, AnyObject> {\n    dataCache().transformValues(JSONTransformer())\n  }\n\n  /// - Returns: An initialized and configured `CacheLevel` that takes URL keys and stores `CarlosImage` (UIImage | NSImage) values.\n  ///            Network requests are pooled for efficiency. Keep in mind that calling this method twice returns two different instances.\n  ///            You should take care of retaining the result or use `sharedImageCache` instead\n  public static func imageCache() -> BasicCache<URL, CarlosImage> {\n    MemoryCacheLevel<URL, CarlosImage>()\n      .compose(DiskCacheLevel<URL, CarlosImage>())\n      .compose(\n        NetworkFetcher()\n          .pooled()\n          .transformValues(ImageTransformer())\n      )\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Carlos.swift",
    "content": "import Combine\nimport Foundation\n\npublic struct CarlosGlobals {\n  public static let queueNamePrefix = \"com.carlos.\"\n  public static let caches = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.cachesDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0]\n}\n\n/// An abstraction for a generic cache level\npublic protocol CacheLevel: AnyObject {\n  /// A typealias for the key the cache level accepts\n  associatedtype KeyType\n\n  /// A typealias for the data the cache returns in the success closure\n  associatedtype OutputType\n\n  /// Tries to get a value from the cache level\n  ///\n  /// - Parameter key: The key of the value you would like to get\n  ///\n  /// - Returns: A `Publisher` that you can attach success and failure closures to\n  func get(_ key: KeyType) -> AnyPublisher<OutputType, Error>\n\n  /// Tries to set a value on the cache level\n  ///\n  /// - Parameter value: The bytes to set on the cache level\n  /// - Parameter key: The key of the value you're trying to set\n  ///\n  /// - Returns: A `Publisher` that will reflect the status of the set operation\n  func set(_ value: OutputType, forKey key: KeyType) -> AnyPublisher<Void, Error>\n\n  /// Remove value from cache for a given key.\n  ///\n  /// - Parameter key: They key of the value to be removed\n  ///\n  /// - Returns: A `Publisher` that reflects a status of the remove operation.\n  func remove(_ key: KeyType) -> AnyPublisher<Void, Error>\n\n  /// Asks to clear the cache level\n  func clear()\n\n  /// Notifies the cache level that a memory warning was thrown, and asks it to do its best to clean some memory\n  func onMemoryWarning()\n}\n"
  },
  {
    "path": "Sources/Carlos/Core/BasicCache.swift",
    "content": "import Combine\nimport Foundation\n\n/// A wrapper cache that explicitly takes get, set, clear and memory warning closures\npublic final class BasicCache<A, B>: CacheLevel {\n  public typealias KeyType = A\n  public typealias OutputType = B\n\n  private let getClosure: (_ key: A) -> AnyPublisher<B, Error>\n  private let setClosure: (_ value: B, _ key: A) -> AnyPublisher<Void, Error>\n  private let removeClosure: (_ key: A) -> AnyPublisher<Void, Error>\n  private let clearClosure: () -> Void\n  private let memoryClosure: () -> Void\n\n  /**\n   Initializes a new instance of a BasicCache specifying closures for get, set, clear and onMemoryWarning, thus determining the behavior of the cache level as a whole\n\n   - parameter getClosure: The closure to execute when you call get(key) on this instance\n   - parameter setClosure: The closure to execute when you call set(value, key) on this instance\n   - parameter clearClosure: The closure to execute when you call clear() on this instance\n   - parameter memoryClosure: The closure to execute when you call onMemoryWarning() on this instance, or when a memory warning is thrown by the system and the cache level is listening for memory pressure events\n   */\n  public init(\n    getClosure: @escaping (_ key: A) -> AnyPublisher<B, Error>,\n    setClosure: @escaping (_ value: B, _ key: A) -> AnyPublisher<Void, Error>,\n    removeClosure: @escaping (_ key: A) -> AnyPublisher<Void, Error>,\n    clearClosure: @escaping () -> Void,\n    memoryClosure: @escaping () -> Void\n  ) {\n    self.getClosure = getClosure\n    self.setClosure = setClosure\n    self.removeClosure = removeClosure\n    self.clearClosure = clearClosure\n    self.memoryClosure = memoryClosure\n  }\n\n  /**\n   Asks the cache to get the value for a given key\n\n   - parameter key: The key you want to get the value for\n\n   - returns: The result of the getClosure specified when initializing the instance\n   */\n  public func get(_ key: KeyType) -> AnyPublisher<OutputType, Error> {\n    getClosure(key)\n  }\n\n  /**\n   Asks the cache to set a value for the given key\n\n   - parameter value: The value to set on the cache\n   - parameter key: The key to use for the given value\n\n   This call executes the setClosure specified when initializing the instance\n   */\n  public func set(_ value: B, forKey key: A) -> AnyPublisher<Void, Error> {\n    setClosure(value, key)\n  }\n\n  public func remove(_ key: A) -> AnyPublisher<Void, Error> {\n    removeClosure(key)\n  }\n\n  /**\n   Asks the cache to clear its contents\n\n   This call executes the clearClosure specified when initializing the instance\n   */\n  public func clear() {\n    clearClosure()\n  }\n\n  /**\n   Tells the cache that a memory warning event was received\n\n   This call executes the memoryClosure specified when initializing the instance\n   */\n  public func onMemoryWarning() {\n    memoryClosure()\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Core/BasicFetcher.swift",
    "content": "import Combine\nimport Foundation\n\n/// A wrapper fetcher that explicitly takes a get closure\npublic final class BasicFetcher<A, B>: Fetcher {\n  public typealias KeyType = A\n  public typealias OutputType = B\n\n  private let getClosure: (_ key: A) -> AnyPublisher<B, Error>\n\n  /**\n   Initializes a new instance of a BasicFetcher specifying a get closure, thus determining the behavior of the fetcher as a whole\n\n   - parameter getClosure: The closure to execute when you call get(key) on this instance\n   */\n  public init(getClosure: @escaping (_ key: A) -> AnyPublisher<B, Error>) {\n    self.getClosure = getClosure\n  }\n\n  /**\n   Asks the fetcher to get the value for a given key\n\n   - parameter key: The key you want to get the value for\n\n   - returns: The result of the getClosure specified when initializing the instance\n   */\n  public func get(_ key: KeyType) -> AnyPublisher<OutputType, Error> {\n    getClosure(key)\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Core/Errors.swift",
    "content": "import Foundation\n\npublic enum FetchError: Error {\n  /// Used when a cache level doesn't have a value in the cache\n  case valueNotInCache\n\n  /// Used when no cache level did find the key\n  case noCacheLevelsRemaining\n\n  /// Used when the specified key was invalid\n  case invalidKey\n\n  /// Used when some cached data was found but was likely corrupted\n  case invalidCachedData\n\n  /// Used when the key doesn't satisfy the cache condition\n  case conditionNotSatisfied\n\n  /// Used when a key transformation failed and the cache level had to skip a get operation\n  case keyTransformationFailed\n\n  /// Used when a value transformation failed and the cache level had to skip a get operation\n  case valueTransformationFailed\n}\n"
  },
  {
    "path": "Sources/Carlos/Core/ExpensiveObject.swift",
    "content": "import Foundation\n\n/// Abstracts objects that have a cost (useful for the MemoryCacheLevel)\npublic protocol ExpensiveObject {\n  /// The cost of the object\n  var cost: Int { get }\n}\n\nextension Data: ExpensiveObject {\n  /// The number of bytes of the data block\n  public var cost: Int {\n    count\n  }\n}\n\nextension NSData: ExpensiveObject {\n  /// The number of bytes of the data block\n  public var cost: Int {\n    length\n  }\n}\n\nextension String: ExpensiveObject {\n  /// The number of characters of the string\n  public var cost: Int {\n    count\n  }\n}\n\nextension NSString: ExpensiveObject {\n  /// The number of characters of the NSString\n  public var cost: Int {\n    length\n  }\n}\n\nextension URL: ExpensiveObject {\n  /// The size of the URL\n  public var cost: Int {\n    String(absoluteString).cost\n  }\n}\n\nextension Int: ExpensiveObject {\n  /// Integers have a unit cost\n  public var cost: Int {\n    1\n  }\n}\n\nextension Float: ExpensiveObject {\n  /// Floats have a unit cost\n  public var cost: Int {\n    1\n  }\n}\n\nextension Double: ExpensiveObject {\n  /// Doubles have a unit cost\n  public var cost: Int {\n    1\n  }\n}\n\nextension Character: ExpensiveObject {\n  /// Characters have a unit cost\n  public var cost: Int {\n    1\n  }\n}\n\nextension CarlosImage: ExpensiveObject {\n  /// The size of the image in pixels (W x H)\n  public var cost: Int {\n    Int(size.width * size.height)\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Core/Extensions.swift",
    "content": "import Combine\nimport CryptoKit\nimport Foundation\n\npublic extension String {\n  func MD5String() -> String {\n    guard let data = data(using: .utf8) else {\n      return self\n    }\n\n    return Insecure.MD5.hash(data: data).map { String(format: \"%02hhx\", $0) }.joined()\n  }\n}\n\nextension AnyPublisher {\n  static func create(_ block: @escaping ((Result<Output, Failure>) -> Void) -> Void) -> AnyPublisher<Output, Failure> {\n    Deferred {\n      Future { promise in\n        block(promise)\n      }\n    }\n    .eraseToAnyPublisher()\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Core/FetcherValueTransformation.swift",
    "content": "import Combine\nimport Foundation\n\nextension Fetcher {\n  /**\n   Applies a transformation to the fetcher\n   The transformation works by changing the type of the value the fetcher returns when succeeding\n   Use this transformation when you store a value type but want to mount the fetcher in a pipeline that works with other value types\n\n   - parameter transformer: The transformation you want to apply\n\n   - returns: A new fetcher result of the transformation of the original fetcher\n   */\n  public func transformValues<A: OneWayTransformer>(_ transformer: A) -> BasicFetcher<KeyType, A.TypeOut> where OutputType == A.TypeIn {\n    BasicFetcher(\n      getClosure: { key in\n        self.get(key)\n          .flatMap(transformer.transform)\n          .eraseToAnyPublisher()\n      }\n    )\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Core/FunctionComposition.swift",
    "content": "import Combine\nimport Foundation\n\ninfix operator >>>: CompositionPrecedence\nprecedencegroup CompositionPrecedence {\n  associativity: left\n  higherThan: AssignmentPrecedence\n}\n\n/**\n Composes two sync closures\n\n - parameter f: A closure taking an A parameter and returning an Optional<B>\n - parameter g: A closure taking a B parameter and returning an Optional<C>\n\n - returns: A closure taking an A parameter and returning an Optional<C> obtained by combining f and g in a way similar to g(f(x))\n */\nfunc >>> <A, B, C>(f: @escaping (A) -> B?, g: @escaping (B) -> C?) -> (A) -> C? {\n  { x in\n    if let fx = f(x) {\n      return g(fx)\n    } else {\n      return nil\n    }\n  }\n}\n\n/**\n Composes two sync closures\n\n - parameter f: A closure taking an A parameter and returning a value of type B\n - parameter g: A closure taking a B parameter and returning a value of type C\n\n - returns: A closure taking an A parameter and returning a value of type C obtained by combining f and g through g(f(x))\n */\nfunc >>> <A, B, C>(f: @escaping (A) -> B, g: @escaping (B) -> C) -> (A) -> C {\n  { x in\n    g(f(x))\n  }\n}\n\n/**\n Composes two async (Future) closures\n\n - parameter f: A closure taking an A parameter and returning a Future<B> (basically a future for a B return type)\n - parameter g: A closure taking a B parameter and returning a Future<C> (basically a future for a C return type)\n\n - returns: A closure taking an A parameter and returning a Future<C> (basically a future for a C return type) obtained by combining f and g in a way similar to g(f(x)) (if the closures were sync)\n */\nfunc >>> <A, B, C>(f: @escaping (A) -> AnyPublisher<B, Error>, g: @escaping (B) -> AnyPublisher<C, Error>) -> (A) -> AnyPublisher<C, Error> {\n  { param in\n    f(param).flatMap(g).eraseToAnyPublisher()\n  }\n}\n\n// Expose later if it makes sense to\n/**\n Composes two async closures\n\n - parameter f: A closure taking an A parameter and a completion callback taking an Optional<B> and returning Void\n - parameter g: A closure taking a B parameter and a completion callback taking an Optional<C> and returning Void\n\n - returns: A closure taking an A parameter and a completion callback taking an Optional<C> and returning Void obtained by combining f and g in a way similar to g(f(x)) (if the closures were sync)\n */\ninternal func >>> <A, B, C>(f: @escaping (A, (B?) -> Void) -> Void, g: @escaping (B, (C?) -> Void) -> Void) -> (A, (C?) -> Void) -> Void {\n  { x, completion in\n    f(x) { fx in\n      if let fx = fx {\n        g(fx) { result in\n          completion(result)\n        }\n      } else {\n        completion(nil)\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Core/Logger.swift",
    "content": "import Foundation\n\n/// A simple logger to use instead of println with configurable output closure\npublic final class Logger {\n  /// The level of the logged message\n  public enum Level: String {\n    case debug = \"Debug\"\n    case info = \"Info\"\n    case warning = \"Warning\"\n    case error = \"Error\"\n  }\n\n  private static let queue = DispatchQueue(label: CarlosGlobals.queueNamePrefix + \"logger\")\n\n  /**\n   Called to output the log message. Override for custom logging.\n   */\n  public static var output: (String, Level) -> Void = { msg, level in\n    queue.async {\n      print(\"[Carlos][\\(level.rawValue)]: \\(msg)\")\n    }\n  }\n\n  /**\n   Logs a message on the console\n\n   - parameter message: The message to log\n\n   This method uses the output closure internally to output the message. The closure is always dispatched on the main queue\n   */\n  public static func log(_ message: String, _ level: Level = Level.debug) {\n    DispatchQueue.main.async {\n      self.output(message, level)\n    }\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Core/MemoryWarning.swift",
    "content": "import Foundation\n\n#if os(iOS) || os(tvOS)\n  import UIKit\n#endif\n\n#if !os(watchOS)\n  extension CacheLevel where Self: AnyObject {\n    /**\n     Adds a memory warning listener on the given cache\n\n     - returns: The token that you should use later on to unsubscribe\n     */\n    public func listenToMemoryWarnings() -> NSObjectProtocol {\n      #if os(macOS)\n        let source = DispatchSource.makeMemoryPressureSource(eventMask: [.warning, .critical])\n        let workItem = DispatchWorkItem(block: { [weak self] in\n          self?.onMemoryWarning()\n        })\n        source.setEventHandler(handler: workItem)\n        return source\n      #else\n        return NotificationCenter.default.addObserver(forName: UIApplication.didReceiveMemoryWarningNotification, object: nil, queue: OperationQueue.main, using: { [weak self] _ in\n          self?.onMemoryWarning()\n        })\n      #endif\n    }\n  }\n\n  /**\n   Removes the memory warning listener\n\n   - parameter token: The token you got from the call to listenToMemoryWarning: previously\n   */\n  public func unsubscribeToMemoryWarnings(_ token: NSObjectProtocol) {\n    #if os(macOS)\n      if let source = token as? DispatchSource {\n        source.cancel()\n      }\n    #else\n      NotificationCenter.default.removeObserver(token, name: UIApplication.didReceiveMemoryWarningNotification, object: nil)\n    #endif\n  }\n#endif\n"
  },
  {
    "path": "Sources/Carlos/Core/StringConvertible.swift",
    "content": "import Foundation\n\n/// Represents a type that can be converted to a string\npublic protocol StringConvertible {\n  /**\n   - returns: the String representation of the value\n   */\n  func toString() -> String\n}\n\nextension StringConvertible {\n  public func toString() -> String {\n    \"Nan\"\n  }\n}\n\nextension String: StringConvertible {\n  /**\n   - returns: The value itself\n   */\n  public func toString() -> String {\n    self\n  }\n}\n\nextension NSString: StringConvertible {\n  /**\n   - returns: The value itself\n   */\n  public func toString() -> String {\n    self as String\n  }\n}\n\nextension URL: StringConvertible {\n  /**\n   - returns: The absolute string or an empty string if the absolute string is nil\n   */\n  public func toString() -> String {\n    absoluteString\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Core/UnfairLock.swift",
    "content": "//\n//  UnfairLock.swift\n//\n//\n//  Created by Lisovyi, Ivan on 16.08.20.\n//\n\nimport Foundation\n\nfinal class UnfairLock {\n  private var _lock: UnsafeMutablePointer<os_unfair_lock>\n\n  init() {\n    _lock = UnsafeMutablePointer<os_unfair_lock>.allocate(capacity: 1)\n    _lock.initialize(to: os_unfair_lock())\n  }\n\n  deinit {\n    _lock.deallocate()\n  }\n\n  func locked<ReturnValue>(_ f: () throws -> ReturnValue) rethrows -> ReturnValue {\n    os_unfair_lock_lock(_lock)\n    defer { os_unfair_lock_unlock(_lock) }\n    return try f()\n  }\n\n  func assertOwned() {\n    os_unfair_lock_assert_owner(_lock)\n  }\n\n  func assertNotOwned() {\n    os_unfair_lock_assert_not_owner(_lock)\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>FMWK</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>$(MARKETING_VERSION)</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>$(CURRENT_PROJECT_VERSION)</string>\n\t<key>NSPrincipalClass</key>\n\t<string></string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Sources/Carlos/Operations/CacheLevel+Batch.swift",
    "content": "import Combine\nimport Foundation\n\nextension CacheLevel {\n  /**\n   Performs a batch of get requests on this CacheLevel\n\n   - parameter keys: The list of keys to batch\n\n   - returns: A Future that will call the success callback when all the keys will be either fetched or failed, passing a list containing just the successful results\n   */\n  public func batchGetSome(_ keys: [KeyType]) -> AnyPublisher<[OutputType], Error> {\n    let allResults: [AnyPublisher<Result<OutputType, Error>, Error>] = keys.map { key in\n      get(key)\n        .map { Result<Self.OutputType, Error>.success($0) }\n        .catch {\n          Just(Result<Self.OutputType, Error>.failure($0))\n            .setFailureType(to: Error.self)\n        }\n        .eraseToAnyPublisher()\n    }\n\n    return allResults.publisher\n      .setFailureType(to: Error.self)\n      .flatMap { $0 }\n      .collect(allResults.count)\n      .map { result in\n        result.compactMap { try? $0.get() }\n      }\n      .eraseToAnyPublisher()\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Operations/KeyTransformation.swift",
    "content": "import Combine\nimport Foundation\n\nextension CacheLevel {\n  /**\n   Applies a transformation to the cache level\n   The transformation works by changing the type of the key the cache accepts\n   Use this transformation when you use a domain specific key or a wrapper key that contains several values every cache level can choose from\n\n   - parameter transformer: The transformation you want to apply\n\n   - returns: A new cache level result of the transformation of the original cache level\n   */\n  public func transformKeys<A: OneWayTransformer>(_ transformer: A) -> BasicCache<A.TypeIn, OutputType> where KeyType == A.TypeOut {\n    BasicCache(\n      getClosure: { key in\n        transformer.transform(key)\n          .flatMap(self.get)\n          .eraseToAnyPublisher()\n      },\n      setClosure: { value, key in\n        transformer.transform(key)\n          .flatMap { transformedKey in\n            self.set(value, forKey: transformedKey)\n          }\n          .eraseToAnyPublisher()\n      },\n      removeClosure: { \n        transformer.transform($0)\n          .flatMap(self.remove)\n          .eraseToAnyPublisher()\n      },\n      clearClosure: clear,\n      memoryClosure: onMemoryWarning\n    )\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Operations/Normalize.swift",
    "content": "import Foundation\n\nextension CacheLevel {\n  /**\n   Normalizes the CacheLevel into a BasicCache.\n   Use this function when you want to have a value of type BasicCache (e.g. to store as a instance property) and you don't care about the specific class of the CacheLevel you're going to obtain from the sequence of Carlos composition calls\n\n   - returns: The CacheLevel normalized to appear as a BasicCache.\n   */\n  public func normalize() -> BasicCache<KeyType, OutputType> {\n    if let normalized = self as? BasicCache<KeyType, OutputType> {\n      return normalized\n    } else {\n      return BasicCache<KeyType, OutputType>(\n        getClosure: get,\n        setClosure: set,\n        removeClosure: remove,\n        clearClosure: clear,\n        memoryClosure: onMemoryWarning\n      )\n    }\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Operations/PostProcess.swift",
    "content": "import Foundation\n\nextension CacheLevel {\n  /**\n   Adds a post-processing step to the get results of this CacheLevel\n\n   As usual, if the transformation fails, the get request will also fail\n\n   - parameter transformer: The OneWayTransformer that will be applied to every successful result of the method get called on the cache level. The transformer has to return the same type of the input type, and the transformation won't be applied when setting values on the cache level.\n\n   - returns: A transformed CacheLevel that incorporates the post-processing step\n   */\n  public func postProcess<A: OneWayTransformer>(_ transformer: A) -> BasicCache<KeyType, OutputType> where OutputType == A.TypeIn, A.TypeIn == A.TypeOut {\n    BasicCache(\n      getClosure: { key in\n        self.get(key)\n          .flatMap(transformer.transform)\n          .eraseToAnyPublisher()\n      },\n      setClosure: set,\n      removeClosure: remove,\n      clearClosure: clear,\n      memoryClosure: onMemoryWarning\n    )\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Operations/SwitchCache.swift",
    "content": "import Foundation\nimport Combine\n\n/// Convenience enumeration to specify which of two switched cache levels should be used for a get or set operation\npublic enum CacheLevelSwitchResult {\n  /// The first CacheLevel of the switch\n  case cacheA\n  /// The second CacheLevel of the switch\n  case cacheB\n}\n\n/**\n Switches two existing cache levels and returns a new cache level with the switching logic inside.\n This enables you to have multiple cache \"lanes\" and switch between them depending on the key that is currently being fetcher or set, or some other external condition.\n\n - parameter cacheA: The first cache level you want to switch\n - parameter cacheB: The second cache level you want to switch\n - parameter switchClosure: The closure where you return which of the two cache levels should be used for get or set calls depending on the key or some other external condition\n\n - returns: A new cache level that includes the specified switching logic. clear and onMemoryWarning calls are dispatched to both lanes.\n */\npublic func switchLevels<A: CacheLevel, B: CacheLevel>(cacheA: A, cacheB: B, switchClosure: @escaping (_ key: A.KeyType) -> CacheLevelSwitchResult) -> BasicCache<A.KeyType, A.OutputType> where A.KeyType == B.KeyType, A.OutputType == B.OutputType {\n  BasicCache(\n    getClosure: { key in\n      switch switchClosure(key) {\n      case .cacheA:\n        return cacheA.get(key)\n      case .cacheB:\n        return cacheB.get(key)\n      }\n    },\n    setClosure: { value, key in\n      switch switchClosure(key) {\n      case .cacheA:\n        return cacheA.set(value, forKey: key)\n      case .cacheB:\n        return cacheB.set(value, forKey: key)\n      }\n    },\n    removeClosure: {\n      Publishers.Zip(cacheA.remove($0), cacheB.remove($0))\n        .map { _ in () }\n        .eraseToAnyPublisher()\n    },\n    clearClosure: {\n      cacheA.clear()\n      cacheB.clear()\n    },\n    memoryClosure: {\n      cacheA.onMemoryWarning()\n      cacheB.onMemoryWarning()\n    }\n  )\n}\n"
  },
  {
    "path": "Sources/Carlos/Operations/ValueTransformation.swift",
    "content": "import Combine\nimport Foundation\n\nextension CacheLevel {\n  /**\n   Applies a transformation to the cache level\n   The transformation works by changing the type of the value the cache returns when succeeding\n   Use this transformation when you store a value type but want to mount the cache in a pipeline that works with other value types\n\n   - parameter transformer: The transformation you want to apply\n\n   - returns: A new cache result of the transformation of the original cache\n   */\n  public func transformValues<A: TwoWayTransformer>(_ transformer: A) -> BasicCache<KeyType, A.TypeOut> where OutputType == A.TypeIn {\n    BasicCache(\n      getClosure: { key in\n        self.get(key)\n          .flatMap(transformer.transform)\n          .eraseToAnyPublisher()\n      },\n      setClosure: { value, key in\n        transformer.inverseTransform(value)\n          .flatMap { transformedValue in\n            self.set(transformedValue, forKey: key)\n          }\n          .eraseToAnyPublisher()\n      },\n      removeClosure: remove,\n      clearClosure: clear,\n      memoryClosure: onMemoryWarning\n    )\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Transformers/ComposedOneWayTransformer.swift",
    "content": "import Foundation\n\nextension OneWayTransformer {\n  /**\n   Composes the transformer with another OneWayTransformer\n\n   - parameter transformer: The second OneWayTransformer to apply\n\n   - returns: A new OneWayTransformer that is the result of the composition of the two OneWayTransformers\n   */\n  public func compose<A: OneWayTransformer>(_ transformer: A) -> OneWayTransformationBox<TypeIn, A.TypeOut> where A.TypeIn == TypeOut {\n    OneWayTransformationBox(transform: transform >>> transformer.transform)\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Transformers/ComposedTwoWayTransformer.swift",
    "content": "import Combine\nimport Foundation\n\nextension TwoWayTransformer {\n  /**\n   Composes the transformer with another TwoWayTransformer\n\n   - parameter transformer: The second TwoWayTransformer to apply\n\n   - returns: A new TwoWayTransformer that is the result of the composition of the two TwoWayTransformers\n   */\n  public func compose<A: TwoWayTransformer>(_ transformer: A) -> TwoWayTransformationBox<TypeIn, A.TypeOut> where A.TypeIn == TypeOut {\n    TwoWayTransformationBox(\n      transform: transform >>> transformer.transform,\n      inverseTransform: transformer.inverseTransform >>> inverseTransform\n    )\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Transformers/ConditionedOneWayTransformer.swift",
    "content": "import Combine\nimport Foundation\n\n/// Abstract an object that can conditionally transform values to another type\npublic protocol ConditionedOneWayTransformer {\n  /// The input type of the transformer\n  associatedtype TypeIn\n\n  /// The output type of the transformer\n  associatedtype TypeOut\n\n  /// The type of the key used to evaluate the condition\n  associatedtype KeyType\n\n  /**\n   Apply the conditional transformation from A to B\n\n   - parameter key: The key to use to evaluate the condition\n   - parameter val: The value to transform\n\n   - returns: A Future that will contain the transformed value, or fail if the transformation failed\n   */\n  func conditionalTransform(key: KeyType, value: TypeIn) -> AnyPublisher<TypeOut, Error>\n}\n\n/// Simple implementation of the ConditionedOneWayTransformer protocol\npublic final class ConditionedOneWayTransformationBox<Key, InputType, OutputType>: ConditionedOneWayTransformer {\n  /// The input type of the transformation box\n  public typealias TypeIn = InputType\n\n  /// The output type of the transformation box\n  public typealias TypeOut = OutputType\n\n  /// The key type used by the transformation box\n  public typealias KeyType = Key\n\n  private let conditionalTransformClosure: (_ key: Key, _ value: InputType) -> AnyPublisher<OutputType, Error>\n\n  /**\n   Initializes a conditioned 1-way transformation box with the given closure\n\n   - parameter conditionalTransformClosure: The conditional transformation closure to convert a value of type TypeIn into a value of type TypeOut given a key of type KeyType\n   */\n  public init(conditionalTransformClosure: @escaping (_ key: Key, _ value: InputType) -> AnyPublisher<OutputType, Error>) {\n    self.conditionalTransformClosure = conditionalTransformClosure\n  }\n\n  /**\n   Convenience initializer to create a conditioned 1-way transformation box through a normal 1-way transformer\n\n    - parameter transformer: The normal OneWayTransformer with matching input and output type\n\n   This initializer will basically ignore the key\n   */\n  public convenience init<T: OneWayTransformer>(transformer: T) where T.TypeIn == TypeIn, T.TypeOut == TypeOut {\n    self.init(conditionalTransformClosure: { _, value in\n      transformer.transform(value)\n    })\n  }\n\n  /**\n   Conditionally transforms a value of type TypeIn into a value of type TypeOut, based on the given key\n\n   - parameter key: The key to use to evaluate the condition\n   - parameter val: The value to convert\n\n   - returns: A Future that will contain the converted value or fail if the transformation fails\n   */\n  public func conditionalTransform(key: KeyType, value: TypeIn) -> AnyPublisher<TypeOut, Error> {\n    conditionalTransformClosure(key, value)\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Transformers/ConditionedOutputProcessing.swift",
    "content": "import Combine\nimport Foundation\n\nextension CacheLevel {\n  /**\n   Adds a conditioned post-processing step to the get results of this CacheLevel\n\n   As usual, if the transformation fails, the get request will also fail\n\n   - parameter conditionedTransformer: The transformer that will be applied to every successful result of the method get called on the cache level. The object gets the key used for the get request (where it can apply its condition on) and the fetched value, and has to return the same type of the value.\n     The transformation won't be applied when setting values on the cache level.\n\n   - returns: A transformed CacheLevel that incorporates the post-processing step\n   */\n  public func conditionedPostProcess<T: ConditionedOneWayTransformer>(_ conditionedTransformer: T) -> BasicCache<KeyType, OutputType> where T.KeyType == KeyType, T.TypeIn == OutputType, T.TypeOut == OutputType {\n    BasicCache(\n      getClosure: { key in\n        self.get(key)\n          .flatMap { conditionedTransformer.conditionalTransform(key: key, value: $0) }\n          .eraseToAnyPublisher()\n      },\n      setClosure: set,\n      removeClosure: remove,\n      clearClosure: clear,\n      memoryClosure: onMemoryWarning\n    )\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Transformers/ConditionedTwoWayTransformer.swift",
    "content": "import Combine\nimport Foundation\n\n/// Abstract an object that can conditionally transform values to another type and back to the original one, based on a given key\npublic protocol ConditionedTwoWayTransformer: ConditionedOneWayTransformer {\n  /**\n   Conditionally apply the inverse transformation from B to A\n\n   - parameter key: The key to use to evaluate the condition\n   - parameter val: The value to inverse transform\n\n   - returns: A Future that will contain the original value, or fail if the transformation failed\n   */\n  func conditionalInverseTransform(key: KeyType, value: TypeOut) -> AnyPublisher<TypeIn, Error>\n}\n\nextension ConditionedTwoWayTransformer {\n  /**\n   Inverts a ConditionedTwoWayTransformer\n\n   - returns: A ConditionedTwoWayTransformationBox that takes the output type of the original transformer and returns the input type of the original transformer, maintaining the condition unmodified\n   */\n  public func invert() -> ConditionedTwoWayTransformationBox<KeyType, TypeOut, TypeIn> {\n    ConditionedTwoWayTransformationBox(conditionalTransformClosure: conditionalInverseTransform, conditionalInverseTransformClosure: conditionalTransform)\n  }\n}\n\n/// Simple implementation of the ConditionedTwoWayTransformer protocol\npublic final class ConditionedTwoWayTransformationBox<Key, InputType, OutputType>: ConditionedTwoWayTransformer {\n  /// The input type of the transformation box\n  public typealias TypeIn = InputType\n\n  /// The output type of the transformation box\n  public typealias TypeOut = OutputType\n\n  /// The key type to use for the condition\n  public typealias KeyType = Key\n\n  private let conditionalTransformClosure: (_ key: Key, _ value: InputType) -> AnyPublisher<OutputType, Error>\n  private let conditionalInverseTransformClosure: (_ key: Key, _ value: OutputType) -> AnyPublisher<InputType, Error>\n\n  /**\n   Initializes a new instance of a conditioned 2-way transformation box\n\n   - parameter conditionalTransformClosure: The conditional transformation closure to convert a value of type TypeIn to a value of type TypeOut\n   - parameter conditionalInverseTransformClosure: The conditional transformation closure to convert a value of type TypeOut to a value of type TypeIn\n   */\n  public init(conditionalTransformClosure: @escaping (_ key: Key, _ value: InputType) -> AnyPublisher<OutputType, Error>, conditionalInverseTransformClosure: @escaping (_ key: Key, _ value: OutputType) -> AnyPublisher<InputType, Error>) {\n    self.conditionalTransformClosure = conditionalTransformClosure\n    self.conditionalInverseTransformClosure = conditionalInverseTransformClosure\n  }\n\n  /**\n   Convenience initializer to create a conditioned 2-way transformation box through a normal 2-way transformer\n\n   - parameter transformer: The normal TwoWayTransformer with matching input and output type\n\n   This initializer will basically ignore the key\n   */\n  public convenience init<T: TwoWayTransformer>(transformer: T) where T.TypeIn == TypeIn, T.TypeOut == TypeOut {\n    self.init(conditionalTransformClosure: { _, value in\n      transformer.transform(value)\n    }, conditionalInverseTransformClosure: { _, value in\n      transformer.inverseTransform(value)\n    })\n  }\n\n  /**\n   Conditionally converts a value of type TypeIn to a value of type TypeOut, based on the given key\n\n   - parameter key: The key to use to evaluate the condition\n   - parameter val: The value to convert\n\n   - returns: A Future that will contain the converted value, or fail if the transformation fails\n   */\n  public func conditionalTransform(key: KeyType, value: TypeIn) -> AnyPublisher<TypeOut, Error> {\n    conditionalTransformClosure(key, value)\n  }\n\n  /**\n   Conditionally converts a value of type TypeOut to a value of type TypeIn, based on the given key\n\n   - parameter key: The key to use to evaluate the condition\n   - parameter val: The value to convert\n\n   - returns: A Future that will contain the converted value, or fail if the inverse transformation fails\n   */\n  public func conditionalInverseTransform(key: KeyType, value: TypeOut) -> AnyPublisher<TypeIn, Error> {\n    conditionalInverseTransformClosure(key, value)\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Transformers/ConditionedValueTransformation.swift",
    "content": "import Combine\nimport Foundation\n\nextension CacheLevel {\n  /**\n   Applies a conditional transformation to the cache level\n\n   The transformation works by changing the type of the value the cache returns when succeeding\n\n   Use this transformation when you store a value type but want to mount the cache in a pipeline that works with other value types\n\n   - parameter conditionedTransformer: The conditioned transformer that will be applied to every successful result of the method get or (inverse transform) set called on the cache level. The object gets the key used for the get request (where it can apply its condition on) and the fetched value, and returns the transformed value.\n\n   - returns: A new cache result of the transformation of the original cache\n   */\n  public func conditionedValueTransformation<A: ConditionedTwoWayTransformer>(transformer: A) -> BasicCache<KeyType, A.TypeOut> where OutputType == A.TypeIn, A.KeyType == KeyType {\n    BasicCache(\n      getClosure: { key -> AnyPublisher<A.TypeOut, Error> in\n        self.get(key)\n          .flatMap { transformer.conditionalTransform(key: key, value: $0) }\n          .eraseToAnyPublisher()\n      },\n      setClosure: { value, key in\n        return transformer.conditionalInverseTransform(key: key, value: value)\n          .flatMap { transformedValue in\n            self.set(transformedValue, forKey: key)\n          }\n          .eraseToAnyPublisher()\n      },\n      removeClosure: remove,\n      clearClosure: clear,\n      memoryClosure: onMemoryWarning\n    )\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Transformers/ImageTransformer.swift",
    "content": "import Foundation\n\nimport Combine\n\n#if os(macOS)\n  import Cocoa\n  public typealias CarlosImage = NSImage\n#else\n  import UIKit\n  public typealias CarlosImage = UIImage\n#endif\n/**\n This class takes care of transforming NSData instances into UIImage (or NSImage objects on macOS).\n\n Keep in mind that at the moment this class always deserializes images through UIImagePNGRepresentation, so there may be a data usage bigger than actually required.\n */\npublic final class ImageTransformer: TwoWayTransformer {\n  public enum TransformationError: Error {\n    case invalidData\n    case cannotConvertImage\n  }\n\n  public typealias TypeIn = NSData\n  public typealias TypeOut = CarlosImage\n\n  /// Initializes a new instance of ImageTransformer\n  public init() {}\n\n  /**\n   Serializes an NSData instance into a UIImage\n\n   - parameter val: The NSData you want to serialize\n\n   - returns: A Future<UIImage> object\n   */\n  public func transform(_ val: TypeIn) -> AnyPublisher<TypeOut, Error> {\n    AnyPublisher.create { promise in\n      if let image = CarlosImage(data: val as Data) {\n        promise(.success(image))\n      } else {\n        promise(.failure(TransformationError.invalidData))\n      }\n    }\n    .eraseToAnyPublisher()\n  }\n\n  /**\n   Deserializes an UIImage instance into NSData\n\n   - parameter val: The UIImage you want to deserialize\n\n   - returns: A Future<NSData> instance obtained with UIImagePNGRepresentation\n   */\n  public func inverseTransform(_ val: TypeOut) -> AnyPublisher<TypeIn, Error> {\n    AnyPublisher.create { promise in\n      #if os(macOS)\n        if let rep = val.tiffRepresentation, let bitmapImageRep = NSBitmapImageRep(data: rep) {\n          promise(.success(bitmapImageRep.representation(using: .png, properties: [:])))\n        }\n        promise(.success(nil))\n      #else\n        /* This is a waste of bytes, we should probably use a lower-level framework */\n        promise(.success(val.pngData()))\n      #endif\n    }.flatMap { (data: Data?) -> AnyPublisher<TypeIn, Error> in\n      guard let data = data else {\n        return Fail(error: TransformationError.cannotConvertImage).eraseToAnyPublisher()\n      }\n\n      return Just(data as NSData)\n        .setFailureType(to: Error.self)\n        .eraseToAnyPublisher()\n    }\n    .eraseToAnyPublisher()\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Transformers/JSONTransformer.swift",
    "content": "import Combine\nimport Foundation\n\n/**\n This class takes care of transforming NSData instances into JSON objects in the form of AnyObject instances. Depending on your usage, the AnyObject could contain an Array, a Dictionary, or nil if the NSData is not a valid JSON\n */\npublic final class JSONTransformer: TwoWayTransformer {\n  public typealias TypeIn = NSData\n  public typealias TypeOut = AnyObject\n\n  /// Initializes a new instance of JSONTransformer\n  public init() {}\n\n  /**\n   Parses JSON from an NSData instance into an AnyObject instance\n\n   - parameter val: The NSData representing the received JSON\n\n   - returns: A Future<AnyObject> value, with the parsed JSON if the input data was valid\n   */\n  public func transform(_ val: TypeIn) -> AnyPublisher<TypeOut, Error> {\n    AnyPublisher.create { promise in\n      do {\n        let transformed = try JSONSerialization.jsonObject(with: val as Data, options: [.allowFragments]) as AnyObject\n        promise(.success(transformed))\n      } catch {\n        promise(.failure(error))\n      }\n    }\n  }\n\n  /**\n   Deserializes a JSON object into an NSData instance\n\n   - parameter val: The JSON object you want to deserialize\n\n   - returns: A Future<NSData> value, with the deserialized JSON if the input was valid\n   */\n  public func inverseTransform(_ val: TypeOut) -> AnyPublisher<TypeIn, Error> {\n    AnyPublisher.create { promise in\n      do {\n        let transformed = try JSONSerialization.data(withJSONObject: val, options: [])\n        promise(.success(transformed as NSData))\n      } catch {\n        promise(.failure(error))\n      }\n    }\n    .eraseToAnyPublisher()\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Transformers/OneWayTransformer.swift",
    "content": "import Combine\nimport Foundation\n\n/// Abstract an object that can transform values to another type\npublic protocol OneWayTransformer {\n  /// The input type of the transformer\n  associatedtype TypeIn\n\n  /// The output type of the transformer\n  associatedtype TypeOut\n\n  /**\n   Apply the transformation from A to B\n\n   - parameter val: The value to transform\n\n   - returns: A Future that will contain the transformed value, or fail if the transformation failed\n   */\n  func transform(_ val: TypeIn) -> AnyPublisher<TypeOut, Error>\n}\n\n/// Simple implementation of the OneWayTransformer protocol\npublic final class OneWayTransformationBox<I, O>: OneWayTransformer {\n  /// The input type of the transformation box\n  public typealias TypeIn = I\n\n  /// The output type of the transformation box\n  public typealias TypeOut = O\n\n  private let transformClosure: (I) -> AnyPublisher<O, Error>\n\n  /**\n   Initializes a 1-way transformation box with the given closure\n\n   - parameter transform: The transformation closure to convert a value of type TypeIn into a value of type TypeOut\n   */\n  public init(transform: @escaping ((I) -> AnyPublisher<O, Error>)) {\n    transformClosure = transform\n  }\n\n  /**\n   Transforms a value of type TypeIn into a value of type TypeOut\n\n   - parameter val: The value to convert\n\n   - returns: A Future that will contain the converted value or fail if the transformation fails\n   */\n  public func transform(_ val: TypeIn) -> AnyPublisher<TypeOut, Error> {\n    transformClosure(val)\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Transformers/StringTransformer.swift",
    "content": "import Combine\nimport Foundation\n\n/**\n This class takes care of transforming NSData instances into String values.\n */\npublic final class StringTransformer: TwoWayTransformer {\n  public enum TransformationError: Error {\n    case invalidData\n    case dataConversionToStringFailed\n  }\n\n  public typealias TypeIn = NSData\n  public typealias TypeOut = String\n\n  private let encoding: String.Encoding\n\n  /**\n   Initializes a new instance of StringTransformer\n\n   - parameter encoding: The encoding the transformer will use when serializing and deserializing NSData instances. By default it's NSUTF8StringEncoding\n   */\n  public init(encoding: String.Encoding = String.Encoding.utf8) {\n    self.encoding = encoding\n  }\n\n  /**\n   Serializes a NSData instance into a String with the configured encoding\n\n   - parameter val: The NSData instance to serialize\n\n   - returns: A Future containing the serialized String with the given encoding if the input is valid\n   */\n  public func transform(_ val: TypeIn) -> AnyPublisher<TypeOut, Error> {\n    AnyPublisher.create { [encoding] promise in\n      guard let string = String(data: val as Data, encoding: encoding) else {\n        promise(.failure(TransformationError.invalidData))\n        return\n      }\n\n      promise(.success(string))\n    }\n    .eraseToAnyPublisher()\n  }\n\n  /**\n   Deserializes a String into a NSData instance\n\n   - parameter val: The String to deserialize\n\n   - returns: A Future<NSData> instance containing the bytes representation of the given string\n   */\n  public func inverseTransform(_ val: TypeOut) -> AnyPublisher<TypeIn, Error> {\n    AnyPublisher.create { [encoding] promise in\n      guard let data = val.data(using: encoding, allowLossyConversion: false) as NSData? else {\n        promise(.failure(TransformationError.dataConversionToStringFailed))\n        return\n      }\n\n      promise(.success(data))\n    }\n    .eraseToAnyPublisher()\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Transformers/Transformers.swift",
    "content": "import Combine\nimport Foundation\nimport MapKit\n\npublic enum NSDateFormatterError: Error {\n  case invalidInputString\n}\n\n/**\n NSDateFormatter extension to conform to the TwoWayTransformer protocol\n\n This class transforms from NSDate to String (transform) and viceversa (inverseTransform)\n */\nextension DateFormatter: TwoWayTransformer {\n  public typealias TypeIn = Date\n  public typealias TypeOut = String\n\n  public func transform(_ val: TypeIn) -> AnyPublisher<TypeOut, Error> {\n    AnyPublisher.create { promise in\n      promise(.success(self.string(from: val)))\n    }\n    .eraseToAnyPublisher()\n  }\n\n  public func inverseTransform(_ val: TypeOut) -> AnyPublisher<TypeIn, Error> {\n    AnyPublisher.create { promise in\n      guard let date = self.date(from: val) else {\n        promise(.failure(NSDateFormatterError.invalidInputString))\n        return\n      }\n\n      promise(.success(date))\n    }\n    .eraseToAnyPublisher()\n  }\n}\n\npublic enum NSNumberFormatterError: Error {\n  case cannotConvertToString\n  case invalidString\n}\n\n/**\n NSNumberFormatter extension to conform to the TwoWayTransformer protocol\n\n This class transforms from NSNumber to String (transform) and viceversa (inverseTransform)\n */\nextension NumberFormatter: TwoWayTransformer {\n  public typealias TypeIn = NSNumber\n  public typealias TypeOut = String\n\n  public func transform(_ val: TypeIn) -> AnyPublisher<TypeOut, Error> {\n    AnyPublisher.create { promise in\n      guard let string = self.string(from: val) else {\n        promise(.failure(NSNumberFormatterError.cannotConvertToString))\n        return\n      }\n\n      promise(.success(string))\n    }\n    .eraseToAnyPublisher()\n  }\n\n  public func inverseTransform(_ val: TypeOut) -> AnyPublisher<TypeIn, Error> {\n    AnyPublisher.create { promise in\n      guard let number = self.number(from: val) else {\n        promise(.failure(NSNumberFormatterError.invalidString))\n        return\n      }\n\n      promise(.success(number))\n    }\n    .eraseToAnyPublisher()\n  }\n}\n\n/**\n MKDistanceFormatter extension to conform to the TwoWayTransformer protocol\n\n This class transforms from CLLocationDistance to String (transform) and viceversa (inverseTransform)\n */\nextension MKDistanceFormatter: TwoWayTransformer {\n  public typealias TypeIn = CLLocationDistance\n  public typealias TypeOut = String\n\n  public func transform(_ val: TypeIn) -> AnyPublisher<TypeOut, Error> {\n    AnyPublisher.create { $0(.success(self.string(fromDistance: val))) }\n      .eraseToAnyPublisher()\n  }\n\n  public func inverseTransform(_ val: TypeOut) -> AnyPublisher<TypeIn, Error> {\n    AnyPublisher.create { $0(.success(self.distance(from: val))) }\n      .eraseToAnyPublisher()\n  }\n}\n"
  },
  {
    "path": "Sources/Carlos/Transformers/TwoWayTransformer.swift",
    "content": "import Combine\nimport Foundation\n\n/// Abstract an object that can transform values to another type and back to the original one\npublic protocol TwoWayTransformer: OneWayTransformer {\n  /**\n   Apply the inverse transformation from B to A\n\n   - parameter val: The value to inverse transform\n\n   - returns: A Future that will contain the original value, or fail if the transformation failed\n   */\n  func inverseTransform(_ val: TypeOut) -> AnyPublisher<TypeIn, Error>\n}\n\nextension TwoWayTransformer {\n  /**\n   Inverts a TwoWayTransformer\n\n   - returns: A TwoWayTransformationBox that takes the output type of the original transformer and returns the input type of the original transformer\n   */\n  public func invert() -> TwoWayTransformationBox<TypeOut, TypeIn> {\n    TwoWayTransformationBox(\n      transform: inverseTransform,\n      inverseTransform: transform\n    )\n  }\n}\n\n/// Simple implementation of the TwoWayTransformer protocol\npublic final class TwoWayTransformationBox<I, O>: TwoWayTransformer {\n  /// The input type of the transformation box\n  public typealias TypeIn = I\n\n  /// The output type of the transformation box\n  public typealias TypeOut = O\n\n  private let transformClosure: (I) -> AnyPublisher<O, Error>\n  private let inverseTransformClosure: (O) -> AnyPublisher<I, Error>\n\n  /**\n   Initializes a new instance of a 2-way transformation box\n\n   - parameter transform: The transformation closure to convert a value of type TypeIn to a value of type TypeOut\n   - parameter inverseTransform: The transformation closure to convert a value of type TypeOut to a value of type TypeIn\n   */\n  public init(transform: @escaping ((I) -> AnyPublisher<O, Error>), inverseTransform: @escaping ((O) -> AnyPublisher<I, Error>)) {\n    transformClosure = transform\n    inverseTransformClosure = inverseTransform\n  }\n\n  /**\n   Converts a value of type TypeIn to a value of type TypeOut\n\n   - parameter val: The value to convert\n\n   - returns: A Future that will contain the converted value, or fail if the transformation fails\n   */\n  public func transform(_ val: I) -> AnyPublisher<O, Error> {\n    transformClosure(val)\n  }\n\n  /**\n   Converts a value of type TypeOut to a value of type TypeIn\n\n   - parameter val: The value to convert\n\n   - returns: A Future that will contain the converted value, or fail if the inverse transformation fails\n   */\n  public func inverseTransform(_ val: O) -> AnyPublisher<I, Error> {\n    inverseTransformClosure(val)\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/BasicCacheTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nenum TestError: Error {\n  case anotherError\n  case simpleError\n}\n\nfinal class BasicCacheTests: QuickSpec {\n  override func spec() {\n    describe(\"BasicCache\") {\n      var cache: BasicCache<String, Int>!\n      var numberOfTimesCalledClear = 0\n      var numberOfTimesCalledOnMemoryWarning = 0\n      var numberOfTimesCalledGet = 0\n      var numberOfTimesCalledSet = 0\n      var numberOfTimesCalledRemove = 0\n      var didSetKey: String?\n      var didSetValue: Int?\n      var didGetKey: String?\n      var removeKey: String?\n      \n      var getSubject: PassthroughSubject<Int, Error>!\n      var setSubject: PassthroughSubject<Void, Error>!\n      var removeSubject: PassthroughSubject<Void, Error>!\n\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        numberOfTimesCalledClear = 0\n        numberOfTimesCalledGet = 0\n        numberOfTimesCalledOnMemoryWarning = 0\n        numberOfTimesCalledSet = 0\n\n        getSubject = PassthroughSubject()\n        setSubject = PassthroughSubject()\n\n        cache = BasicCache<String, Int>(\n          getClosure: { key in\n            didGetKey = key\n            numberOfTimesCalledGet += 1\n\n            return getSubject.eraseToAnyPublisher()\n          },\n          setClosure: { value, key in\n            didSetKey = key\n            didSetValue = value\n            numberOfTimesCalledSet += 1\n\n            return setSubject.eraseToAnyPublisher()\n          },\n          removeClosure: { key in\n            numberOfTimesCalledRemove += 1\n            removeKey = key\n            return removeSubject.eraseToAnyPublisher()\n          },\n          clearClosure: {\n            numberOfTimesCalledClear += 1\n          },\n          memoryClosure: {\n            numberOfTimesCalledOnMemoryWarning += 1\n          }\n        )\n      }\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n      }\n\n      context(\"when calling get\") {\n        let key = \"key to test\"\n        var succeeded: Int?\n        var failed: Error?\n        var canceled: Bool!\n\n        beforeEach {\n          canceled = false\n          failed = nil\n          succeeded = nil\n\n          cancellable = cache.get(key)\n            .handleEvents(receiveCancel: {\n              canceled = true\n            })\n            .sink(receiveCompletion: { completion in\n              if case let .failure(error) = completion {\n                failed = error\n              }\n            }, receiveValue: {\n              succeeded = $0\n            })\n        }\n\n        it(\"should call the closure\") {\n          expect(numberOfTimesCalledGet) == 1\n        }\n\n        it(\"should pass the right key\") {\n          expect(didGetKey) == key\n        }\n\n        context(\"when the get closure succeeds\") {\n          let value = 3\n\n          beforeEach {\n            getSubject.send(value)\n          }\n\n          it(\"should succeed the future\") {\n            expect(succeeded) == value\n          }\n        }\n\n        context(\"when the get clousure is canceled\") {\n          beforeEach {\n            cancellable?.cancel()\n          }\n\n          it(\"should cancel the future\") {\n            expect(canceled) == true\n          }\n        }\n\n        context(\"when the get closure fails\") {\n          let error = TestError.anotherError\n\n          beforeEach {\n            getSubject.send(completion: .failure(error))\n          }\n\n          it(\"should fail the future\") {\n            expect(failed as? TestError) == error\n          }\n        }\n      }\n\n      context(\"when calling set\") {\n        let key = \"test key\"\n        let value = 101\n        var succeeded: Bool!\n        var failed: Error?\n        var canceled: Bool!\n\n        beforeEach {\n          succeeded = false\n          failed = nil\n          canceled = false\n\n          cancellable = cache.set(value, forKey: key)\n            .handleEvents(receiveCancel: {\n              canceled = true\n            })\n            .sink(receiveCompletion: { completion in\n              if case let .failure(error) = completion {\n                failed = error\n              }\n            }, receiveValue: {\n              succeeded = true\n            })\n        }\n\n        it(\"should call the closure\") {\n          expect(numberOfTimesCalledSet) == 1\n        }\n\n        it(\"should pass the right key\") {\n          expect(didSetKey) == key\n        }\n\n        it(\"should pass the right value\") {\n          expect(didSetValue) == value\n        }\n\n        context(\"when the set closure succeeds\") {\n          beforeEach {\n            setSubject.send()\n          }\n\n          it(\"should succeed the future\") {\n            expect(succeeded) == true\n          }\n        }\n\n        context(\"when the set clousure is canceled\") {\n          beforeEach {\n            cancellable?.cancel()\n          }\n\n          it(\"should cancel the future\") {\n            expect(canceled) == true\n          }\n        }\n\n        context(\"when the set closure fails\") {\n          let error = TestError.anotherError\n\n          beforeEach {\n            setSubject.send(completion: .failure(error))\n          }\n\n          it(\"should fail the future\") {\n            expect(failed as? TestError) == error\n          }\n        }\n      }\n\n      context(\"when calling clear\") {\n        beforeEach {\n          cache.clear()\n        }\n\n        it(\"should call the closure\") {\n          expect(numberOfTimesCalledClear) == 1\n        }\n      }\n\n      context(\"when calling onMemoryWarning\") {\n        beforeEach {\n          cache.onMemoryWarning()\n        }\n\n        it(\"should call the closure\") {\n          expect(numberOfTimesCalledOnMemoryWarning) == 1\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/BasicFetcherTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nfinal class BasicFetcherTests: QuickSpec {\n  override func spec() {\n    describe(\"BasicFetcher\") {\n      var fetcher: BasicFetcher<String, Int>!\n      var numberOfTimesCalledGet = 0\n      var didGetKey: String?\n      var getSubject: PassthroughSubject<Int, Error>!\n\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        numberOfTimesCalledGet = 0\n        getSubject = PassthroughSubject()\n\n        fetcher = BasicFetcher<String, Int>(\n          getClosure: { key in\n            didGetKey = key\n            numberOfTimesCalledGet += 1\n\n            return getSubject.eraseToAnyPublisher()\n          }\n        )\n      }\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n      }\n\n      context(\"when calling get\") {\n        let key = \"key to test\"\n        var succeeded: Int?\n        var failed: Error?\n        var canceled: Bool!\n\n        beforeEach {\n          canceled = false\n          failed = nil\n          succeeded = nil\n\n          cancellable = fetcher.get(key)\n            .handleEvents(receiveCancel: { canceled = true })\n            .sink(receiveCompletion: { completion in\n              if case let .failure(error) = completion {\n                failed = error\n              }\n            }, receiveValue: { succeeded = $0 })\n        }\n\n        it(\"should call the closure\") {\n          expect(numberOfTimesCalledGet) == 1\n        }\n\n        it(\"should pass the right key\") {\n          expect(didGetKey) == key\n        }\n\n        context(\"when the get closure succeeds\") {\n          let value = 3\n\n          beforeEach {\n            getSubject.send(value)\n          }\n\n          it(\"should succeed the future\") {\n            expect(succeeded) == value\n          }\n        }\n\n        context(\"when the get clousure is canceled\") {\n          beforeEach {\n            cancellable?.cancel()\n          }\n\n          it(\"should cancel the future\") {\n            expect(canceled) == true\n          }\n        }\n\n        context(\"when the get closure fails\") {\n          let error = TestError.anotherError\n\n          beforeEach {\n            getSubject.send(completion: .failure(error))\n          }\n\n          it(\"should fail the future\") {\n            expect(failed as? TestError) == error\n          }\n        }\n      }\n\n      context(\"when calling set\") {\n        var succeeded: Bool!\n\n        beforeEach {\n          succeeded = false\n\n          _ = fetcher.set(0, forKey: \"\")\n            .sink(receiveCompletion: { _ in\n              succeeded = true\n            }, receiveValue: {})\n        }\n\n        it(\"should immediately succeed the future\") {\n          expect(succeeded) == true\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/BatchTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nfinal class BatchAllCacheTests: QuickSpec {\n  override func spec() {\n    describe(\"allBatch\") {\n      let requestsCount = 5\n\n      var internalCache: CacheLevelFake<Int, String>!\n      var cache: BatchAllCache<[Int], CacheLevelFake<Int, String>>!\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        internalCache = CacheLevelFake<Int, String>()\n        cache = internalCache.allBatch()\n      }\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n      }\n\n      context(\"when calling clear\") {\n        beforeEach {\n          cache.clear()\n        }\n\n        it(\"should call clear on the internal cache\") {\n          expect(internalCache.numberOfTimesCalledClear).toEventually(equal(1))\n        }\n      }\n\n      context(\"when calling onMemoryWarning\") {\n        beforeEach {\n          cache.onMemoryWarning()\n        }\n\n        it(\"should call onMemoryWarning on the internal cache\") {\n          expect(internalCache.numberOfTimesCalledOnMemoryWarning).toEventually(equal(1))\n        }\n      }\n\n      context(\"when calling set\") {\n        var succeeded: Bool!\n        var failed: Error?\n\n        let keys = [1, 2, 3]\n        let values = [\"\", \"\", \"\"]\n\n        beforeEach {\n          cancellable = cache.set(values, forKey: keys)\n            .sink(receiveCompletion: { completion in\n              if case let .failure(error) = completion {\n                failed = error\n              }\n            }, receiveValue: { _ in succeeded = true })\n        }\n\n        it(\"should call set on the internal cache\") {\n          expect(internalCache.numberOfTimesCalledSet).toEventually(equal(values.count))\n        }\n\n        context(\"when one of the set calls fails\") {\n          let error = TestError.anotherError\n\n          beforeEach {\n            internalCache.setPublishers[0]?.send()\n            internalCache.setPublishers[1]?.send(completion: .failure(error))\n          }\n\n          it(\"should fail the whole future\") {\n            expect(failed as? TestError).toEventually(equal(error))\n          }\n        }\n\n        context(\"when all the set calls succeed\") {\n          beforeEach {\n            internalCache.setPublishers[1]?.send()\n            internalCache.setPublishers[2]?.send()\n            internalCache.setPublishers[3]?.send()\n          }\n\n          it(\"should succeed the whole future\") {\n            expect(succeeded).toEventually(beTrue())\n          }\n        }\n      }\n\n      context(\"when calling get\") {\n        var result: [String]?\n        var errors: [Error]!\n\n        beforeEach {\n          errors = []\n          result = nil\n\n          cancellable = cache.get(Array(0..<requestsCount))\n            .sink(receiveCompletion: { completion in\n              if case let .failure(error) = completion {\n                errors.append(error)\n              }\n            }, receiveValue: {\n              result = $0\n            })\n        }\n\n        it(\"should dispatch all of the requests to the underlying cache\") {\n          expect(internalCache.numberOfTimesCalledGet).toEventually(equal(requestsCount))\n        }\n\n        context(\"when one of the requests fails\") {\n          beforeEach {\n            internalCache.getPublishers[0]?.send(completion: .failure(TestError.simpleError))\n          }\n\n          it(\"should fail the resulting future\") {\n            expect(errors).toEventuallyNot(beEmpty())\n          }\n\n          it(\"should pass the right error\") {\n            expect(errors.first as? TestError).toEventually(equal(TestError.simpleError))\n          }\n\n          it(\"should not call the success closure\") {\n            expect(result).toEventually(beNil())\n          }\n        }\n\n        context(\"when one of the requests succeeds\") {\n          beforeEach {\n            internalCache.getPublishers[0]?.send(\"Test\")\n          }\n\n          it(\"should not call the failure closure\") {\n            expect(errors).toEventually(beEmpty())\n          }\n\n          it(\"should not call the success closure\") {\n            expect(result).toEventually(beNil())\n          }\n        }\n\n        context(\"when all of the requests succeed\") {\n          beforeEach {\n            internalCache.getPublishers.forEach { key, value in\n              value.send(\"\\(key)\")\n            }\n          }\n\n          it(\"should not call the failure closure\") {\n            expect(errors).toEventually(beEmpty())\n          }\n\n          it(\"should call the success closure\") {\n            expect(result).toEventuallyNot(beNil())\n          }\n\n          it(\"should pass all the values\") {\n            expect(result?.count).toEventually(equal(internalCache.getPublishers.count))\n          }\n\n          it(\"should pass the individual results in the right order\") {\n            expect(result?.sorted()).toEventually(equal(internalCache.getPublishers.enumerated().map { iteration, _ in\n              \"\\(iteration)\"\n            }))\n          }\n        }\n      }\n    }\n  }\n}\n\nfinal class BatchTests: QuickSpec {\n  override func spec() {\n    let requestsCount = 5\n\n    var cache: CacheLevelFake<Int, String>!\n    var cancellable: AnyCancellable?\n\n    beforeEach {\n      cache = CacheLevelFake<Int, String>()\n    }\n\n    afterEach {\n      cancellable?.cancel()\n    }\n\n    describe(\"batchGetSome\") {\n      var result: [String]!\n      var errors: [Error]!\n\n      beforeEach {\n        errors = []\n        result = nil\n\n        cancellable = cache.batchGetSome(Array(0..<requestsCount))\n          .sink(receiveCompletion: { completion in\n            if case let .failure(error) = completion {\n              errors.append(error)\n            }\n          }, receiveValue: { result = $0 })\n      }\n\n      it(\"should dispatch all of the requests to the underlying cache\") {\n        expect(cache.numberOfTimesCalledGet).toEventually(equal(requestsCount))\n      }\n\n      context(\"when one of the requests fails\") {\n        let failedIndex = 2\n\n        beforeEach {\n          cache.getPublishers[failedIndex]?.send(completion: .failure(TestError.simpleError))\n        }\n\n        it(\"should not call the success closure\") {\n          expect(result).toEventually(beNil())\n        }\n\n        it(\"should not call the failure closure\") {\n          expect(errors).toEventually(beEmpty())\n        }\n\n        context(\"when all the other requests succeed\") {\n          beforeEach {\n            cache.getPublishers.forEach { key, value in\n              value.send(\"\\(key)\")\n            }\n          }\n\n          it(\"should call the success closure\") {\n            expect(result).toEventuallyNot(beNil())\n          }\n\n          it(\"should pass the right number of results\") {\n            expect(result.count).toEventually(equal(cache.getPublishers.count - 1))\n          }\n\n          it(\"should only pass the succeeded requests\") {\n            var expectedResult = cache.getPublishers.enumerated().map { iteration, _ in\n              \"\\(iteration)\"\n            }\n            _ = expectedResult.remove(at: failedIndex)\n\n            expect(result.sorted()).toEventually(equal(expectedResult))\n          }\n\n          it(\"should not call the failure closure\") {\n            expect(errors).toEventually(beEmpty())\n          }\n        }\n      }\n\n      context(\"when all the other requests complete\") {\n        beforeEach {\n          cache.getPublishers.forEach { key, value in\n            value.send(\"\\(key)\")\n          }\n        }\n\n        it(\"should call the success closure\") {\n          expect(result).toEventuallyNot(beNil())\n        }\n\n        it(\"should pass the right number of results\") {\n          expect(result.count).toEventually(equal(cache.getPublishers.count))\n        }\n\n        it(\"should only pass the succeeded requests\") {\n          expect(result.sorted()).toEventually(equal(cache.getPublishers.enumerated().map { iteration, _ in\n            \"\\(iteration)\"\n          }))\n        }\n\n        it(\"should not call the failure closure\") {\n          expect(errors).toEventually(beEmpty())\n        }\n      }\n\n      context(\"when one of the requests fails\") {\n        let failedIndex = 3\n\n        beforeEach {\n          cache.getPublishers[failedIndex]?.send(completion: .failure(TestError.simpleError))\n        }\n\n        it(\"should not call the success closure\") {\n          expect(result).toEventually(beNil())\n        }\n\n        it(\"should not call the error closure\") {\n          expect(errors).toEventually(beEmpty())\n        }\n\n        context(\"when all the other requests complete\") {\n          beforeEach {\n            cache.getPublishers.forEach { key, value in\n              value.send(\"\\(key)\")\n            }\n          }\n\n          it(\"should call the success closure\") {\n            expect(result).toEventuallyNot(beNil())\n          }\n\n          it(\"should pass the right number of results\") {\n            expect(result.count).toEventually(equal(cache.getPublishers.count - 1))\n          }\n\n          it(\"should only pass the succeeded requests\") {\n            var expectedResult = cache.getPublishers.enumerated().map { iteration, _ in\n              \"\\(iteration)\"\n            }\n            _ = expectedResult.remove(at: failedIndex)\n\n            expect(result.sorted()).toEventually(equal(expectedResult))\n          }\n\n          it(\"should not call the failure closure\") {\n            expect(errors).toEventually(beEmpty())\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/CacheProviderTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\n\nfinal class CacheProviderTests: QuickSpec {\n  override func spec() {\n    describe(\"Cache provider\") {\n      context(\"when calling imageCache\") {\n        var cache: BasicCache<URL, CarlosImage>!\n\n        beforeEach {\n          cache = CacheProvider.imageCache()\n        }\n\n        it(\"should always return new instances\") {\n          expect(CacheProvider.imageCache()).notTo(beIdenticalTo(cache))\n        }\n      }\n\n      context(\"when calling dataCache\") {\n        var cache: BasicCache<URL, NSData>!\n\n        beforeEach {\n          cache = CacheProvider.dataCache()\n        }\n\n        it(\"should always return new instances\") {\n          expect(CacheProvider.dataCache()).notTo(beIdenticalTo(cache))\n        }\n      }\n\n      context(\"when calling JSONCache\") {\n        var cache: BasicCache<URL, AnyObject>!\n\n        beforeEach {\n          cache = CacheProvider.JSONCache()\n        }\n\n        it(\"should always return new instances\") {\n          expect(CacheProvider.JSONCache()).notTo(beIdenticalTo(cache))\n        }\n      }\n\n      context(\"when calling sharedImageCache\") {\n        var cache: BasicCache<URL, CarlosImage>!\n\n        beforeEach {\n          cache = CacheProvider.sharedImageCache\n        }\n\n        it(\"should always return the same instance\") {\n          expect(CacheProvider.sharedImageCache) === cache\n        }\n      }\n\n      context(\"when calling sharedDataCache\") {\n        var cache: BasicCache<URL, NSData>!\n\n        beforeEach {\n          cache = CacheProvider.sharedDataCache\n        }\n\n        it(\"should always return the same instance\") {\n          expect(CacheProvider.sharedDataCache) === cache\n        }\n      }\n\n      context(\"when calling sharedJSONCache\") {\n        var cache: BasicCache<URL, AnyObject>!\n\n        beforeEach {\n          cache = CacheProvider.sharedJSONCache\n        }\n\n        it(\"should always return the same instance\") {\n          expect(CacheProvider.sharedJSONCache) === cache\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/CompositionTests.swift",
    "content": "import Foundation\nimport XCTest\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nstruct ComposedCacheSharedExamplesContext {\n  static let CacheToTest = \"composedCache\"\n  static let FirstComposedCache = \"cache1\"\n  static let SecondComposedCache = \"cache2\"\n}\n\nfinal class CompositionSharedExamplesConfiguration: QuickConfiguration {\n  override class func configure(_: Configuration) {\n    sharedExamples(\"get without considering set calls\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache1: CacheLevelFake<String, Int>!\n      var cache2: CacheLevelFake<String, Int>!\n      var composedCache: BasicCache<String, Int>!\n\n      beforeEach {\n        cache1 = sharedExampleContext()[ComposedCacheSharedExamplesContext.FirstComposedCache] as? CacheLevelFake<String, Int>\n        cache2 = sharedExampleContext()[ComposedCacheSharedExamplesContext.SecondComposedCache] as? CacheLevelFake<String, Int>\n        composedCache = sharedExampleContext()[ComposedCacheSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n      }\n\n      context(\"when calling get\") {\n        let key = \"test key\"\n\n        var cancellable: AnyCancellable?\n        var cache1Subject: PassthroughSubject<Int, Error>!\n        var cache2Subject: PassthroughSubject<Int, Error>!\n\n        var successSentinel: Bool?\n        var failureSentinel: Bool?\n        var cancelSentinel: Bool!\n        var successValue: Int?\n\n        beforeEach {\n          cancelSentinel = false\n          successSentinel = nil\n          successValue = nil\n          failureSentinel = nil\n\n          cache1Subject = PassthroughSubject()\n          cache1.getSubject = cache1Subject\n          cache1.setSubject = PassthroughSubject()\n\n          cache2Subject = PassthroughSubject()\n          cache2.getSubject = cache2Subject\n          cache2.setSubject = PassthroughSubject()\n\n          for cache in [cache1, cache2] {\n            cache?.numberOfTimesCalledGet = 0\n            cache?.numberOfTimesCalledSet = 0\n          }\n\n          cancellable = composedCache.get(key)\n            .handleEvents(receiveCancel: { cancelSentinel = true })\n            .sink(receiveCompletion: { completion in\n              if case .failure = completion {\n                failureSentinel = true\n              }\n            }, receiveValue: { value in\n              successSentinel = true\n              successValue = value\n            })\n        }\n\n        afterEach {\n          cancellable?.cancel()\n          cancellable = nil\n        }\n\n        it(\"should not call any success closure\") {\n          expect(successSentinel).toEventually(beNil())\n        }\n\n        it(\"should not call any failure closure\") {\n          expect(failureSentinel).toEventually(beNil())\n        }\n\n        it(\"should not call any cancel closure\") {\n          expect(cancelSentinel).toEventually(beFalse())\n        }\n\n        it(\"should call get on the first cache\") {\n          expect(cache1.numberOfTimesCalledGet).toEventually(equal(1))\n        }\n\n        it(\"should not call get on the second cache\") {\n          expect(cache2.numberOfTimesCalledGet).toEventually(equal(0))\n        }\n\n        context(\"when the first request succeeds\") {\n          let value = 1022\n\n          beforeEach {\n            cache1Subject.send(value)\n          }\n\n          it(\"should call the success closure\") {\n            expect(successSentinel).toEventuallyNot(beNil())\n          }\n\n          it(\"should pass the right value\") {\n            expect(successValue).toEventually(equal(value))\n          }\n\n          it(\"should not call the failure closure\") {\n            expect(failureSentinel).toEventually(beNil())\n          }\n\n          it(\"should not call the cancel closure\") {\n            expect(cancelSentinel).toEventually(beFalse())\n          }\n\n          it(\"should not call get on the second cache\") {\n            expect(cache2.numberOfTimesCalledGet).toEventually(equal(0))\n          }\n        }\n\n        context(\"when the request is canceled\") {\n          beforeEach {\n            cancellable?.cancel()\n          }\n\n          it(\"should not call the success closure\") {\n            expect(successSentinel).toEventually(beNil())\n          }\n\n          it(\"should not call the failure closure\") {\n            expect(failureSentinel).toEventually(beNil())\n          }\n\n          it(\"should call the cancel closure\") {\n            expect(cancelSentinel).toEventually(beTrue())\n          }\n        }\n\n        context(\"when the first request fails\") {\n          beforeEach {\n            cache1Subject.send(completion: .failure(TestError.simpleError))\n          }\n\n          it(\"should not call the success closure\") {\n            expect(successSentinel).toEventually(beNil())\n          }\n\n          it(\"should not call the failure closure\") {\n            expect(failureSentinel).toEventually(beNil())\n          }\n\n          it(\"should not call the cancel closure\") {\n            expect(cancelSentinel).toEventually(beFalse())\n          }\n\n          it(\"should call get on the second cache\") {\n            expect(cache2.numberOfTimesCalledGet).toEventually(equal(1))\n          }\n\n          it(\"should not do other get calls on the first cache\") {\n            expect(cache1.numberOfTimesCalledGet).toEventually(equal(1))\n          }\n\n          context(\"when the second request succeeds\") {\n            let value = -122\n\n            beforeEach {\n              cache2Subject.send(value)\n              cache1.setSubject?.send(())\n            }\n\n            it(\"should call the success closure\") {\n              expect(successSentinel).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the right value\") {\n              expect(successValue).toEventually(equal(value))\n            }\n\n            it(\"should not call the failure closure\") {\n              expect(failureSentinel).toEventually(beNil())\n            }\n\n            it(\"should not call the cancel closure\") {\n              expect(cancelSentinel).toEventually(beFalse())\n            }\n          }\n\n          context(\"when the second request fails\") {\n            beforeEach {\n              cache2Subject.send(completion: .failure(TestError.simpleError))\n            }\n\n            it(\"should not call the success closure\") {\n              expect(successSentinel).toEventually(beNil())\n            }\n\n            it(\"should call the failure closure\") {\n              expect(failureSentinel).toEventuallyNot(beNil())\n            }\n\n            it(\"should not call the cancel closure\") {\n              expect(cancelSentinel).toEventually(beFalse())\n            }\n\n            it(\"should not do other get calls on the first cache\") {\n              expect(cache1.numberOfTimesCalledGet).toEventually(equal(1))\n            }\n\n            it(\"should not do other get calls on the second cache\") {\n              expect(cache2.numberOfTimesCalledGet).toEventually(equal(1))\n            }\n          }\n        }\n      }\n    }\n\n    sharedExamples(\"get on caches\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache1: CacheLevelFake<String, Int>!\n      var cache2: CacheLevelFake<String, Int>!\n      var composedCache: BasicCache<String, Int>!\n\n      beforeEach {\n        cache1 = sharedExampleContext()[ComposedCacheSharedExamplesContext.FirstComposedCache] as? CacheLevelFake<String, Int>\n        cache2 = sharedExampleContext()[ComposedCacheSharedExamplesContext.SecondComposedCache] as? CacheLevelFake<String, Int>\n        composedCache = sharedExampleContext()[ComposedCacheSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n      }\n\n      context(\"when calling get\") {\n        let key = \"test key\"\n\n        var cancellable: AnyCancellable?\n        var cache1Subject: PassthroughSubject<Int, Error>!\n        var cache2Subject: PassthroughSubject<Int, Error>!\n\n        beforeEach {\n          cache1Subject = PassthroughSubject()\n          cache1.getSubject = cache1Subject\n\n          cache2Subject = PassthroughSubject()\n          cache2.getSubject = cache2Subject\n\n          for cache in [cache1, cache2] {\n            cache?.numberOfTimesCalledGet = 0\n            cache?.numberOfTimesCalledSet = 0\n          }\n\n          cancellable = composedCache.get(key).sink(receiveCompletion: { _ in }, receiveValue: { _ in })\n        }\n\n        afterEach {\n          cancellable?.cancel()\n          cancellable = nil\n        }\n\n        itBehavesLike(\"get without considering set calls\") {\n          [\n            ComposedCacheSharedExamplesContext.FirstComposedCache: cache1 as Any,\n            ComposedCacheSharedExamplesContext.SecondComposedCache: cache2 as Any,\n            ComposedCacheSharedExamplesContext.CacheToTest: composedCache as Any\n          ]\n        }\n\n        context(\"when the first request fails\") {\n          beforeEach {\n            cache1Subject.send(completion: .failure(TestError.simpleError))\n          }\n\n          context(\"when the second request succeeds\") {\n            let value = -122\n\n            beforeEach {\n              cache2Subject.send(value)\n            }\n\n            it(\"should set the value on the first cache\") {\n              expect(cache1.numberOfTimesCalledSet).toEventually(equal(1))\n            }\n\n            it(\"should set the value on the first cache with the right key\") {\n              expect(cache1.didSetKey).toEventually(equal(key))\n            }\n\n            it(\"should set the right value on the first cache\") {\n              expect(cache1.didSetValue).toEventually(equal(value))\n            }\n\n            it(\"should not set the same value again on the second cache\") {\n              expect(cache2.numberOfTimesCalledSet).toEventually(equal(0))\n            }\n          }\n        }\n      }\n    }\n\n    sharedExamples(\"both caches are caches\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache1: CacheLevelFake<String, Int>!\n      var cache2: CacheLevelFake<String, Int>!\n      var composedCache: BasicCache<String, Int>!\n\n      beforeEach {\n        cache1 = sharedExampleContext()[ComposedCacheSharedExamplesContext.FirstComposedCache] as? CacheLevelFake<String, Int>\n        cache2 = sharedExampleContext()[ComposedCacheSharedExamplesContext.SecondComposedCache] as? CacheLevelFake<String, Int>\n        composedCache = sharedExampleContext()[ComposedCacheSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n      }\n\n      itBehavesLike(\"first cache is a cache\") {\n        [\n          ComposedCacheSharedExamplesContext.FirstComposedCache: cache1 as Any,\n          ComposedCacheSharedExamplesContext.SecondComposedCache: cache2 as Any,\n          ComposedCacheSharedExamplesContext.CacheToTest: composedCache as Any\n        ]\n      }\n\n      itBehavesLike(\"second cache is a cache\") {\n        [\n          ComposedCacheSharedExamplesContext.FirstComposedCache: cache1 as Any,\n          ComposedCacheSharedExamplesContext.SecondComposedCache: cache2 as Any,\n          ComposedCacheSharedExamplesContext.CacheToTest: composedCache as Any\n        ]\n      }\n\n      context(\"when calling set\") {\n        let key = \"this key\"\n        let value = 102\n        var succeeded: Bool!\n        var failed: Error?\n        var canceled: Bool!\n        var cancellable: AnyCancellable?\n\n        beforeEach {\n          succeeded = false\n          failed = nil\n          canceled = false\n\n          cancellable = composedCache.set(value, forKey: key)\n            .handleEvents(receiveCancel: { canceled = true })\n            .sink(receiveCompletion: { completion in\n              if case let .failure(error) = completion {\n                failed = error\n              }\n            }, receiveValue: { _ in succeeded = true })\n        }\n\n        afterEach {\n          cancellable?.cancel()\n          cancellable = nil\n        }\n\n        it(\"should call set on the first cache\") {\n          expect(cache1.numberOfTimesCalledSet).toEventually(equal(1))\n        }\n\n        it(\"should pass the right key on the first cache\") {\n          expect(cache1.didSetKey).toEventually(equal(key))\n        }\n\n        it(\"should pass the right value on the first cache\") {\n          expect(cache1.didSetValue).toEventually(equal(value))\n        }\n\n        context(\"when the set closure succeeds\") {\n          beforeEach {\n            cache1.setPublishers[key]?.send()\n          }\n\n          it(\"should call set on the second cache\") {\n            expect(cache2.numberOfTimesCalledSet).toEventually(equal(1))\n          }\n\n          it(\"should pass the right key on the second cache\") {\n            expect(cache2.didSetKey).toEventually(equal(key))\n          }\n\n          it(\"should pass the right value on the second cache\") {\n            expect(cache2.didSetValue).toEventually(equal(value))\n          }\n\n          context(\"when the set closure succeeds\") {\n            beforeEach {\n              cache2.setPublishers[key]?.send()\n            }\n\n            it(\"should succeed the future\") {\n              expect(succeeded).toEventually(beTrue())\n            }\n          }\n\n          context(\"when the set closure fails\") {\n            let error = TestError.anotherError\n\n            beforeEach {\n              cache2.setPublishers[key]?.send(completion: .failure(error))\n            }\n\n            it(\"should fail the future\") {\n              expect(failed as? TestError).toEventually(equal(error))\n            }\n          }\n        }\n\n        context(\"when the set clousure is canceled\") {\n          beforeEach {\n            cancellable?.cancel()\n          }\n\n          it(\"should cancel the future\") {\n            expect(canceled).toEventually(beTrue())\n          }\n        }\n\n        context(\"when the set closure fails\") {\n          let error = TestError.anotherError\n\n          beforeEach {\n            cache1.setPublishers[key]?.send(completion: .failure(error))\n          }\n\n          it(\"should fail the future\") {\n            expect(failed as? TestError).toEventually(equal(error))\n          }\n        }\n      }\n    }\n\n    sharedExamples(\"first cache is a cache\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache1: CacheLevelFake<String, Int>!\n      var composedCache: BasicCache<String, Int>!\n\n      beforeEach {\n        cache1 = sharedExampleContext()[ComposedCacheSharedExamplesContext.FirstComposedCache] as? CacheLevelFake<String, Int>\n        composedCache = sharedExampleContext()[ComposedCacheSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n      }\n\n      context(\"when calling set\") {\n        let key = \"this key\"\n        let value = 102\n        var failed: Error?\n        var canceled: Bool!\n        var cancellable: AnyCancellable?\n\n        beforeEach {\n          failed = nil\n          canceled = false\n\n          cancellable = composedCache.set(value, forKey: key)\n            .handleEvents(receiveCancel: { canceled = true })\n            .sink(receiveCompletion: { completion in\n              if case let .failure(error) = completion {\n                failed = error\n              }\n            }, receiveValue: { _ in })\n        }\n\n        afterEach {\n          cancellable?.cancel()\n          cancellable = nil\n        }\n\n        it(\"should call set on the first cache\") {\n          expect(cache1.numberOfTimesCalledSet).toEventually(equal(1))\n        }\n\n        it(\"should pass the right key on the first cache\") {\n          expect(cache1.didSetKey).toEventually(equal(key))\n        }\n\n        it(\"should pass the right value on the first cache\") {\n          expect(cache1.didSetValue).toEventually(equal(value))\n        }\n\n        context(\"when the set clousure is canceled\") {\n          beforeEach {\n            cancellable?.cancel()\n          }\n\n          it(\"should cancel the future\") {\n            expect(canceled).toEventually(beTrue())\n          }\n        }\n\n        context(\"when the set closure fails\") {\n          let error = TestError.anotherError\n\n          beforeEach {\n            cache1.setPublishers[key]?.send(completion: .failure(error))\n          }\n\n          it(\"should fail the future\") {\n            expect(failed as? TestError).toEventually(equal(error))\n          }\n        }\n      }\n\n      context(\"when calling clear\") {\n        beforeEach {\n          composedCache.clear()\n        }\n\n        it(\"should call clear on the first cache\") {\n          expect(cache1.numberOfTimesCalledClear).toEventually(equal(1))\n        }\n      }\n\n      context(\"when calling onMemoryWarning\") {\n        beforeEach {\n          composedCache.onMemoryWarning()\n        }\n\n        it(\"should call onMemoryWarning on the first cache\") {\n          expect(cache1.numberOfTimesCalledOnMemoryWarning).toEventually(equal(1))\n        }\n      }\n    }\n\n    sharedExamples(\"second cache is a cache\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache2: CacheLevelFake<String, Int>!\n      var cache1: CacheLevelFake<String, Int>!\n      var composedCache: BasicCache<String, Int>!\n\n      beforeEach {\n        cache1 = sharedExampleContext()[ComposedCacheSharedExamplesContext.FirstComposedCache] as? CacheLevelFake<String, Int>\n        cache2 = sharedExampleContext()[ComposedCacheSharedExamplesContext.SecondComposedCache] as? CacheLevelFake<String, Int>\n        composedCache = sharedExampleContext()[ComposedCacheSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n      }\n\n      context(\"when calling set\") {\n        let key = \"this key\"\n        let value = 102\n        var succeeded: Bool!\n        var failed: Error?\n        var canceled: Bool!\n        var cancellable: AnyCancellable?\n\n        beforeEach {\n          succeeded = false\n          failed = nil\n          canceled = false\n\n          cancellable = composedCache.set(value, forKey: key)\n            .handleEvents(receiveCancel: { canceled = true })\n            .sink(receiveCompletion: { completion in\n              if case let .failure(error) = completion {\n                failed = error\n              }\n            }, receiveValue: { _ in succeeded = true })\n        }\n\n        afterEach {\n          cancellable?.cancel()\n          cancellable = nil\n        }\n\n        it(\"should call set on the second cache\") {\n          expect(cache2.numberOfTimesCalledSet).toEventually(equal(1))\n        }\n\n        it(\"should pass the right key on the second cache\") {\n          expect(cache2.didSetKey).toEventually(equal(key))\n        }\n\n        it(\"should pass the right value on the second cache\") {\n          expect(cache2.didSetValue).toEventually(equal(value))\n        }\n\n        context(\"when the set closure succeeds\") {\n          beforeEach {\n            cache1.setPublishers[key]?.send()\n            cache2.setPublishers[key]?.send()\n          }\n\n          it(\"should succeed the future\") {\n            expect(succeeded).toEventually(beTrue())\n          }\n        }\n\n        context(\"when the set clousure is canceled\") {\n          beforeEach {\n            cancellable?.cancel()\n          }\n\n          it(\"should cancel the future\") {\n            expect(canceled).toEventually(beTrue())\n          }\n        }\n\n        context(\"when the set closure fails\") {\n          let error = TestError.anotherError\n\n          beforeEach {\n            cache1.setPublishers[key]?.send(completion: .failure(error))\n            cache2.setPublishers[key]?.send(completion: .failure(error))\n          }\n\n          it(\"should fail the future\") {\n            expect(failed as? TestError).toEventually(equal(error))\n          }\n        }\n      }\n\n      context(\"when calling clear\") {\n        beforeEach {\n          composedCache.clear()\n        }\n\n        it(\"should call clear on the second cache\") {\n          expect(cache2.numberOfTimesCalledClear).toEventually(equal(1))\n        }\n      }\n\n      context(\"when calling onMemoryWarning\") {\n        beforeEach {\n          composedCache.onMemoryWarning()\n        }\n\n        it(\"should call onMemoryWarning on the second cache\") {\n          expect(cache2.numberOfTimesCalledOnMemoryWarning).toEventually(equal(1))\n        }\n      }\n    }\n\n    sharedExamples(\"a composition of two fetch closures\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache1: CacheLevelFake<String, Int>!\n      var cache2: CacheLevelFake<String, Int>!\n      var composedCache: BasicCache<String, Int>!\n\n      beforeEach {\n        cache1 = sharedExampleContext()[ComposedCacheSharedExamplesContext.FirstComposedCache] as? CacheLevelFake<String, Int>\n        cache2 = sharedExampleContext()[ComposedCacheSharedExamplesContext.SecondComposedCache] as? CacheLevelFake<String, Int>\n        composedCache = sharedExampleContext()[ComposedCacheSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n      }\n\n      itBehavesLike(\"get without considering set calls\") {\n        [\n          ComposedCacheSharedExamplesContext.FirstComposedCache: cache1 as Any,\n          ComposedCacheSharedExamplesContext.SecondComposedCache: cache2 as Any,\n          ComposedCacheSharedExamplesContext.CacheToTest: composedCache as Any\n        ]\n      }\n    }\n\n    sharedExamples(\"a composition of a fetch closure and a cache\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache1: CacheLevelFake<String, Int>!\n      var cache2: CacheLevelFake<String, Int>!\n      var composedCache: BasicCache<String, Int>!\n\n      beforeEach {\n        cache1 = sharedExampleContext()[ComposedCacheSharedExamplesContext.FirstComposedCache] as? CacheLevelFake<String, Int>\n        cache2 = sharedExampleContext()[ComposedCacheSharedExamplesContext.SecondComposedCache] as? CacheLevelFake<String, Int>\n        composedCache = sharedExampleContext()[ComposedCacheSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n      }\n\n      itBehavesLike(\"get without considering set calls\") {\n        [\n          ComposedCacheSharedExamplesContext.FirstComposedCache: cache1 as Any,\n          ComposedCacheSharedExamplesContext.SecondComposedCache: cache2 as Any,\n          ComposedCacheSharedExamplesContext.CacheToTest: composedCache as Any\n        ]\n      }\n\n      itBehavesLike(\"second cache is a cache\") {\n        [\n          ComposedCacheSharedExamplesContext.FirstComposedCache: cache1 as Any,\n          ComposedCacheSharedExamplesContext.SecondComposedCache: cache2 as Any,\n          ComposedCacheSharedExamplesContext.CacheToTest: composedCache as Any\n        ]\n      }\n    }\n\n    sharedExamples(\"a composition of a cache and a fetch closure\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache1: CacheLevelFake<String, Int>!\n      var cache2: CacheLevelFake<String, Int>!\n      var composedCache: BasicCache<String, Int>!\n\n      beforeEach {\n        cache1 = sharedExampleContext()[ComposedCacheSharedExamplesContext.FirstComposedCache] as? CacheLevelFake<String, Int>\n        cache2 = sharedExampleContext()[ComposedCacheSharedExamplesContext.SecondComposedCache] as? CacheLevelFake<String, Int>\n        composedCache = sharedExampleContext()[ComposedCacheSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n      }\n\n      itBehavesLike(\"get on caches\") {\n        [\n          ComposedCacheSharedExamplesContext.FirstComposedCache: cache1 as Any,\n          ComposedCacheSharedExamplesContext.SecondComposedCache: cache2 as Any,\n          ComposedCacheSharedExamplesContext.CacheToTest: composedCache as Any\n        ]\n      }\n\n      itBehavesLike(\"first cache is a cache\") {\n        [\n          ComposedCacheSharedExamplesContext.FirstComposedCache: cache1 as Any,\n          ComposedCacheSharedExamplesContext.SecondComposedCache: cache2 as Any,\n          ComposedCacheSharedExamplesContext.CacheToTest: composedCache as Any\n        ]\n      }\n    }\n\n    sharedExamples(\"a composed cache\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache1: CacheLevelFake<String, Int>!\n      var cache2: CacheLevelFake<String, Int>!\n      var composedCache: BasicCache<String, Int>!\n\n      beforeEach {\n        cache1 = sharedExampleContext()[ComposedCacheSharedExamplesContext.FirstComposedCache] as? CacheLevelFake<String, Int>\n        cache2 = sharedExampleContext()[ComposedCacheSharedExamplesContext.SecondComposedCache] as? CacheLevelFake<String, Int>\n        composedCache = sharedExampleContext()[ComposedCacheSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n      }\n\n      itBehavesLike(\"get on caches\") {\n        [\n          ComposedCacheSharedExamplesContext.FirstComposedCache: cache1 as Any,\n          ComposedCacheSharedExamplesContext.SecondComposedCache: cache2 as Any,\n          ComposedCacheSharedExamplesContext.CacheToTest: composedCache as Any\n        ]\n      }\n\n      itBehavesLike(\"both caches are caches\") {\n        [\n          ComposedCacheSharedExamplesContext.FirstComposedCache: cache1 as Any,\n          ComposedCacheSharedExamplesContext.SecondComposedCache: cache2 as Any,\n          ComposedCacheSharedExamplesContext.CacheToTest: composedCache as Any\n        ]\n      }\n    }\n  }\n}\n\nfinal class CacheLevelCompositionTests: QuickSpec {\n  override func spec() {\n    var cache1: CacheLevelFake<String, Int>!\n    var cache2: CacheLevelFake<String, Int>!\n    var composedCache: BasicCache<String, Int>!\n\n    describe(\"Cache composition using two cache levels with the instance function\") {\n      beforeEach {\n        cache1 = CacheLevelFake<String, Int>()\n        cache2 = CacheLevelFake<String, Int>()\n\n        composedCache = cache1.compose(cache2)\n      }\n\n      itBehavesLike(\"a composed cache\") {\n        [\n          ComposedCacheSharedExamplesContext.FirstComposedCache: cache1 as Any,\n          ComposedCacheSharedExamplesContext.SecondComposedCache: cache2 as Any,\n          ComposedCacheSharedExamplesContext.CacheToTest: composedCache as Any\n        ]\n      }\n    }\n  }\n}\n\nfinal class ComposedCacheTests: XCTestCase {\n  var cancellables: Set<AnyCancellable>!\n  var cache: BasicCache<String, NSData>!\n\n  override func setUp() {\n    super.setUp()\n\n    cancellables = Set()\n    cache = MemoryCacheLevel().compose(DiskCacheLevel<String, NSData>())\n  }\n\n  override func tearDown() {\n    cache.clear()\n\n    super.tearDown()\n  }\n\n  func testGet_whenKeyDoesNotExistInCache_shallCompleteWithError() {\n    let expectation = self.expectation(description: #function)\n\n    cache.get(\"does_not_exist\")\n        .sink(receiveCompletion: { completion in\n          switch completion {\n          case let .failure(error):\n            XCTAssertEqual(error as! FetchError, FetchError.valueNotInCache)\n\n            expectation.fulfill()\n          case .finished:\n            XCTFail(\"Shall not finish\")\n          }\n        }, receiveValue: { _ in\n          XCTFail(\"Shall not receive any value\")\n        })\n      .store(in: &cancellables)\n\n    wait(for: [expectation], timeout: 1.0)\n  }\n\n  func testGet_whenKeyDoesExistInCache_shallReturnCachedValue() {\n    let expectation = self.expectation(description: #function)\n    let key = \"does_exist\"\n    let expectedValue = \"value\"\n\n    cache.set(expectedValue.data(using: .utf8)! as NSData, forKey: key)\n      .flatMap {\n        self.cache.get(key)\n      }\n      .sink(receiveCompletion: { completion in\n        switch completion {\n        case let .failure(error):\n          XCTFail(\"Shall not fail with error \\(error)\")\n        case .finished:\n          expectation.fulfill()\n        }\n      }, receiveValue: { value in\n        let resultValue = String(data: value as Data, encoding: .utf8)\n        XCTAssertEqual(resultValue, expectedValue)\n      })\n    .store(in: &cancellables)\n\n    wait(for: [expectation], timeout: 1.0)\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/ConditionedCacheTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nstruct ConditionedCacheSharedExamplesContext {\n  static let CacheToTest = \"cache\"\n  static let InternalCache = \"internalCache\"\n}\n\nfinal class ConditionedCacheSharedExamplesConfiguration: QuickConfiguration {\n  override class func configure(_: Configuration) {\n    sharedExamples(\"a conditioned fetch closure\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache: BasicCache<String, Int>!\n      var internalCache: CacheLevelFake<String, Int>!\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        cache = sharedExampleContext()[ConditionedCacheSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n        internalCache = sharedExampleContext()[ConditionedCacheSharedExamplesContext.InternalCache] as? CacheLevelFake<String, Int>\n      }\n\n      context(\"when calling get\") {\n        let value = 221\n        var fakeRequest: PassthroughSubject<Int, Error>!\n        var successSentinel: Bool?\n        var successValue: Int?\n        var failureSentinel: Bool?\n        var failureValue: Error?\n        var cancelSentinel: Bool?\n\n        beforeEach {\n          failureSentinel = nil\n          failureValue = nil\n          successSentinel = nil\n          successValue = nil\n          cancelSentinel = nil\n\n          fakeRequest = PassthroughSubject()\n          internalCache.getSubject = fakeRequest\n        }\n\n        afterEach {\n          cancellable?.cancel()\n          cancellable = nil\n        }\n\n        context(\"when the condition is satisfied\") {\n          let key = \"this key works\"\n\n          beforeEach {\n            cancellable = cache.get(key)\n              .handleEvents(receiveCancel: { cancelSentinel = true })\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  failureSentinel = true\n                  failureValue = error\n                }\n              }, receiveValue: { value in\n                successSentinel = true\n                successValue = value\n              })\n          }\n\n          it(\"should forward the call to the internal cache\") {\n            expect(internalCache.numberOfTimesCalledGet).toEventually(equal(1))\n          }\n\n          it(\"should pass the right key\") {\n            expect(internalCache.didGetKey).toEventually(equal(key))\n          }\n\n          context(\"when the request succeeds\") {\n            beforeEach {\n              fakeRequest.send(value)\n            }\n\n            it(\"should call the original closure\") {\n              expect(successSentinel).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the right value\") {\n              expect(successValue).toEventually(equal(value))\n            }\n\n            it(\"should not call the cancel closure\") {\n              expect(cancelSentinel).toEventually(beNil())\n            }\n\n            it(\"should not call the failure closure\") {\n              expect(failureSentinel).toEventually(beNil())\n            }\n          }\n\n          context(\"when the request is canceled\") {\n            beforeEach {\n              cancellable?.cancel()\n            }\n\n            it(\"should call the original closure\") {\n              expect(cancelSentinel).toEventually(beTrue())\n            }\n\n            it(\"should not call the success closure\") {\n              expect(successSentinel).toEventually(beNil())\n            }\n\n            it(\"should not call the failure closure\") {\n              expect(failureSentinel).toEventually(beNil())\n            }\n          }\n\n          context(\"when the request fails\") {\n            let errorCode = TestError.simpleError\n\n            beforeEach {\n              fakeRequest.send(completion: .failure(errorCode))\n            }\n\n            it(\"should call the original closure\") {\n              expect(failureSentinel).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the right error\") {\n              expect(failureValue as? TestError).toEventually(equal(errorCode))\n            }\n\n            it(\"should not call the cancel closure\") {\n              expect(cancelSentinel).toEventually(beNil())\n            }\n\n            it(\"should not call the success closure\") {\n              expect(successSentinel).toEventually(beNil())\n            }\n          }\n        }\n\n        context(\"when the condition is not satisfied\") {\n          let key = \":(\"\n\n          beforeEach {\n            cancellable = cache.get(key)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  failureSentinel = true\n                  failureValue = error\n                }\n              }, receiveValue: { value in\n                successSentinel = true\n                successValue = value\n              })\n          }\n\n          it(\"should not forward the call to the internal cache\") {\n            expect(internalCache.numberOfTimesCalledGet).toEventually(equal(0))\n          }\n\n          it(\"should call the failure closure\") {\n            expect(failureSentinel).toEventuallyNot(beNil())\n          }\n\n          it(\"should pass the provided error\") {\n            expect(failureValue as? ConditionError).toEventually(equal(ConditionError.MyError))\n          }\n\n          it(\"should not call the cancel closure\") {\n            expect(cancelSentinel).toEventually(beNil())\n          }\n\n          it(\"should not call the success closure\") {\n            expect(successSentinel).toEventually(beNil())\n          }\n        }\n      }\n    }\n\n    sharedExamples(\"a conditioned cache\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache: BasicCache<String, Int>!\n      var internalCache: CacheLevelFake<String, Int>!\n\n      beforeEach {\n        cache = sharedExampleContext()[ConditionedCacheSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n        internalCache = sharedExampleContext()[ConditionedCacheSharedExamplesContext.InternalCache] as? CacheLevelFake<String, Int>\n      }\n\n      itBehavesLike(\"a conditioned fetch closure\") {\n        [\n          ConditionedCacheSharedExamplesContext.CacheToTest: cache as Any,\n          ConditionedCacheSharedExamplesContext.InternalCache: internalCache as Any\n        ]\n      }\n\n      context(\"when calling set\") {\n        let key = \"test-key\"\n        let value = 201\n\n        beforeEach {\n          _ = cache.set(value, forKey: key).sink(receiveCompletion: { _ in }, receiveValue: { _ in })\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledSet).toEventually(equal(1))\n        }\n\n        it(\"should pass the right key\") {\n          expect(internalCache.didSetKey).toEventually(equal(key))\n        }\n\n        it(\"should pass the right value\") {\n          expect(internalCache.didSetValue).toEventually(equal(value))\n        }\n      }\n\n      context(\"when calling clear\") {\n        beforeEach {\n          cache.clear()\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledClear).toEventually(equal(1))\n        }\n      }\n\n      context(\"when calling onMemoryWarning\") {\n        beforeEach {\n          cache.onMemoryWarning()\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledOnMemoryWarning).toEventually(equal(1))\n        }\n      }\n    }\n  }\n}\n\nprivate enum ConditionError: Error {\n  case MyError\n  case AnotherError\n}\n\nfinal class ConditionedCacheTests: QuickSpec {\n  override func spec() {\n    var cache: BasicCache<String, Int>!\n    var internalCache: CacheLevelFake<String, Int>!\n    let closure: ((String) -> AnyPublisher<Bool, Error>) = { key in\n      if key.count >= 5 {\n        return Just(true).setFailureType(to: Error.self).eraseToAnyPublisher()\n      } else {\n        return Fail(error: ConditionError.MyError).eraseToAnyPublisher()\n      }\n    }\n\n    describe(\"The conditioned instance function, applied to a cache level\") {\n      beforeEach {\n        internalCache = CacheLevelFake<String, Int>()\n        cache = internalCache.conditioned(closure)\n      }\n\n      itBehavesLike(\"a conditioned cache\") {\n        [\n          ConditionedCacheSharedExamplesContext.CacheToTest: cache as Any,\n          ConditionedCacheSharedExamplesContext.InternalCache: internalCache as Any\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/ConditionedOneWayTransformationBoxTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nfinal class ConditionedOneWayTransformationBoxTests: QuickSpec {\n  override func spec() {\n    describe(\"Conditioned one-way transformation box\") {\n      var box: ConditionedOneWayTransformationBox<[String: Bool], String, Int>!\n      var cancellable: AnyCancellable?\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n      }\n\n      context(\"when created through a closure\") {\n        beforeEach {\n          box = ConditionedOneWayTransformationBox(conditionalTransformClosure: { key, value in\n            if let _ = key[\"value\"] {\n              guard let intValue = Int(value) else {\n                return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n              }\n\n              return Just(intValue).setFailureType(to: Error.self).eraseToAnyPublisher()\n            } else {\n              return Fail(error: TestError.anotherError).eraseToAnyPublisher()\n            }\n          })\n        }\n\n        context(\"when calling conditionalTransform\") {\n          var result: Int!\n          var error: Error!\n\n          beforeEach {\n            result = nil\n            error = nil\n          }\n\n          context(\"if the transformation is possible\") {\n            let originString = \"102\"\n\n            beforeEach {\n              cancellable = box.conditionalTransform(key: [\"value\": true], value: originString)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should call the success closure\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should not call the failure closure\") {\n              expect(error).toEventually(beNil())\n            }\n\n            it(\"should return the expected result\") {\n              expect(result).toEventually(equal(Int(originString)))\n            }\n          }\n\n          context(\"if the transformation is not possible\") {\n            let originString = \"10asd2\"\n\n            beforeEach {\n              cancellable = box.conditionalTransform(key: [\"value\": true], value: originString)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should not call the success closure\") {\n              expect(result).toEventually(beNil())\n            }\n\n            it(\"should call the failure closure\") {\n              expect(error).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the right error\") {\n              expect(error as? TestError).toEventually(equal(TestError.simpleError))\n            }\n          }\n\n          context(\"if the key doesn't satisfy the condition\") {\n            beforeEach {\n              cancellable = box.conditionalTransform(key: [:], value: \"whatever\")\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should not call the success closure\") {\n              expect(result).toEventually(beNil())\n            }\n\n            it(\"should call the failure closure\") {\n              expect(error).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the right error\") {\n              expect(error as? TestError).toEventually(equal(TestError.anotherError))\n            }\n          }\n        }\n      }\n\n      context(\"when created through a one way transformer\") {\n        beforeEach {\n          let transformer = OneWayTransformationBox<String, Int>(transform: { value in\n            guard let intValue = Int(value) else {\n              return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n            }\n\n            return Just(intValue).setFailureType(to: Error.self).eraseToAnyPublisher()\n          })\n\n          box = ConditionedOneWayTransformationBox(transformer: transformer)\n        }\n\n        context(\"when calling conditionalTransform\") {\n          var result: Int!\n          var error: Error!\n\n          beforeEach {\n            result = nil\n            error = nil\n          }\n\n          context(\"if the transformation is possible\") {\n            let originString = \"102\"\n\n            beforeEach {\n              cancellable = box.conditionalTransform(key: [\"value\": true], value: originString)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should call the success closure\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should not call the failure closure\") {\n              expect(error).toEventually(beNil())\n            }\n\n            it(\"should return the expected result\") {\n              expect(result).toEventually(equal(Int(originString)))\n            }\n          }\n\n          context(\"if the transformation is not possible\") {\n            let originString = \"10asd2\"\n\n            beforeEach {\n              cancellable = box.conditionalTransform(key: [:], value: originString)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should not call the success closure\") {\n              expect(result).toEventually(beNil())\n            }\n\n            it(\"should call the failure closure\") {\n              expect(error).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the right error\") {\n              expect(error as? TestError).toEventually(equal(TestError.simpleError))\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/ConditionedOutputProcessingTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nstruct ConditionedPostProcessSharedExamplesContext {\n  static let CacheToTest = \"cache\"\n  static let InternalCache = \"internalCache\"\n  static let Transformer = \"transformer\"\n}\n\nfinal class ConditionedPostProcessSharedExamplesConfiguration: QuickConfiguration {\n  override class func configure(_: Configuration) {\n    sharedExamples(\"a fetch closure with conditioned post-processing\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache: BasicCache<String, Int>!\n      var internalCache: CacheLevelFake<String, Int>!\n      var transformer: ConditionedOneWayTransformationBox<String, Int, Int>!\n      var cancellables: Set<AnyCancellable>!\n\n      beforeEach {\n        cancellables = Set()\n\n        cache = sharedExampleContext()[ConditionedPostProcessSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n        internalCache = sharedExampleContext()[ConditionedPostProcessSharedExamplesContext.InternalCache] as? CacheLevelFake<String, Int>\n        transformer = sharedExampleContext()[ConditionedPostProcessSharedExamplesContext.Transformer] as? ConditionedOneWayTransformationBox<String, Int, Int>\n      }\n\n      afterEach {\n        cancellables = nil\n      }\n\n      context(\"when calling get with a key that triggers some post-processing\") {\n        let key = \"do\"\n        var successValue: Int?\n        var failureValue: Error?\n        var getSubject: PassthroughSubject<Int, Error>!\n\n        beforeEach {\n          getSubject = PassthroughSubject()\n          internalCache.getSubject = getSubject\n          successValue = nil\n          failureValue = nil\n\n          cache.get(key)\n            .sink(receiveCompletion: { completion in\n              if case let .failure(error) = completion {\n                failureValue = error\n              }\n            }, receiveValue: { successValue = $0 })\n            .store(in: &cancellables)\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledGet).toEventually(equal(1))\n        }\n\n        it(\"should forward the key\") {\n          expect(internalCache.didGetKey).toEventually(equal(key))\n        }\n\n        context(\"when the request succeeds\") {\n          let value = 101\n\n          beforeEach {\n            getSubject.send(value)\n          }\n\n          it(\"should call the transformation closure with the right value\") {\n            var expected: Int!\n            transformer.conditionalTransform(key: key, value: value)\n              .sink(receiveCompletion: { _ in }, receiveValue: { expected = $0 })\n              .store(in: &cancellables)\n            expect(successValue).toEventually(equal(expected))\n          }\n        }\n\n        context(\"when the request fails\") {\n          let errorCode = TestError.simpleError\n\n          beforeEach {\n            getSubject.send(completion: .failure(errorCode))\n          }\n\n          it(\"should call the original failure closure\") {\n            expect(failureValue as? TestError).toEventually(equal(errorCode))\n          }\n        }\n      }\n\n      context(\"when calling get with a key that triggers failure on the post-processing\") {\n        let key = \"don't\"\n        var successValue: Int?\n        var failureValue: Error?\n        var getSubject: PassthroughSubject<Int, Error>!\n\n        beforeEach {\n          getSubject = PassthroughSubject()\n          internalCache.getSubject = getSubject\n          successValue = nil\n          failureValue = nil\n\n          cache.get(key)\n            .sink(receiveCompletion: { completion in\n              if case let .failure(error) = completion {\n                failureValue = error\n              }\n            }, receiveValue: { successValue = $0 })\n            .store(in: &cancellables)\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledGet).toEventually(equal(1))\n        }\n\n        it(\"should forward the key\") {\n          expect(internalCache.didGetKey).toEventually(equal(key))\n        }\n\n        context(\"when the request succeeds\") {\n          let value = -101\n\n          beforeEach {\n            getSubject.send(value)\n          }\n\n          it(\"should not call the original success closure\") {\n            expect(successValue).toEventually(beNil())\n          }\n\n          it(\"should call the original failure closure\") {\n            expect(failureValue).toEventuallyNot(beNil())\n          }\n\n          it(\"should pass the right error code\") {\n            expect(failureValue as? TestError).toEventually(equal(TestError.anotherError))\n          }\n        }\n\n        context(\"when the request fails\") {\n          let errorCode = TestError.simpleError\n\n          beforeEach {\n            getSubject.send(completion: .failure(errorCode))\n          }\n\n          it(\"should call the original failure closure\") {\n            expect(failureValue as? TestError).toEventually(equal(errorCode))\n          }\n        }\n      }\n\n      context(\"when calling get\") {\n        let key = \"12\"\n        var successValue: Int?\n        var failureValue: Error?\n        var getSubject: PassthroughSubject<Int, Error>!\n\n        beforeEach {\n          getSubject = PassthroughSubject()\n          internalCache.getSubject = getSubject\n          successValue = nil\n          failureValue = nil\n\n          cache.get(key)\n            .sink(receiveCompletion: { completion in\n              if case let .failure(error) = completion {\n                failureValue = error\n              }\n            }, receiveValue: { successValue = $0 })\n            .store(in: &cancellables)\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledGet).toEventually(equal(1))\n        }\n\n        it(\"should forward the key\") {\n          expect(internalCache.didGetKey).toEventually(equal(key))\n        }\n\n        context(\"when the request succeeds\") {\n          context(\"when the transformation closure returns a value\") {\n            let value = 101\n\n            beforeEach {\n              getSubject.send(value)\n            }\n\n            it(\"should call the transformation closure with the success value\") {\n              var expected: Int!\n              transformer.conditionalTransform(key: key, value: value)\n                .sink(receiveCompletion: { _ in }, receiveValue: { expected = $0 })\n                .store(in: &cancellables)\n              expect(successValue).toEventually(equal(expected))\n            }\n          }\n\n          context(\"when the transformation closure returns nil\") {\n            let value = -101\n\n            beforeEach {\n              getSubject.send(value)\n            }\n\n            it(\"should not call the original success closure\") {\n              expect(successValue).toEventually(beNil())\n            }\n\n            it(\"should call the original failure closure\") {\n              expect(failureValue).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the right error code\") {\n              expect(failureValue as? TestError).toEventually(equal(TestError.simpleError))\n            }\n          }\n        }\n\n        context(\"when the request fails\") {\n          let errorCode = TestError.anotherError\n\n          beforeEach {\n            getSubject.send(completion: .failure(errorCode))\n          }\n\n          it(\"should call the original failure closure\") {\n            expect(failureValue as? TestError).toEventually(equal(errorCode))\n          }\n        }\n      }\n    }\n\n    sharedExamples(\"a cache with conditioned post-processing\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache: BasicCache<String, Int>!\n      var internalCache: CacheLevelFake<String, Int>!\n      var transformer: ConditionedOneWayTransformationBox<String, Int, Int>!\n\n      beforeEach {\n        cache = sharedExampleContext()[ConditionedPostProcessSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n        internalCache = sharedExampleContext()[ConditionedPostProcessSharedExamplesContext.InternalCache] as? CacheLevelFake<String, Int>\n        transformer = sharedExampleContext()[ConditionedPostProcessSharedExamplesContext.Transformer] as? ConditionedOneWayTransformationBox<String, Int, Int>\n      }\n\n      itBehavesLike(\"a fetch closure with conditioned post-processing\") {\n        [\n          ConditionedPostProcessSharedExamplesContext.CacheToTest: cache as Any,\n          ConditionedPostProcessSharedExamplesContext.InternalCache: internalCache as Any,\n          ConditionedPostProcessSharedExamplesContext.Transformer: transformer as Any\n        ]\n      }\n\n      context(\"when calling set\") {\n        let key = \"10\"\n        let value = 222\n\n        beforeEach {\n          _ = cache.set(value, forKey: key)\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledSet).toEventually(equal(1))\n        }\n\n        it(\"should forward the key\") {\n          expect(internalCache.didSetKey).toEventually(equal(key))\n        }\n\n        it(\"should pass the right value\") {\n          expect(internalCache.didSetValue).toEventually(equal(value))\n        }\n      }\n\n      context(\"when calling clear\") {\n        beforeEach {\n          cache.clear()\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledClear).toEventually(equal(1))\n        }\n      }\n\n      context(\"when calling onMemoryWarning\") {\n        beforeEach {\n          cache.onMemoryWarning()\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledOnMemoryWarning).toEventually(equal(1))\n        }\n      }\n    }\n  }\n}\n\nfinal class ConditionedOutputPostProcessingTests: QuickSpec {\n  override func spec() {\n    var cache: BasicCache<String, Int>!\n    var internalCache: CacheLevelFake<String, Int>!\n    let transformer: ConditionedOneWayTransformationBox<String, Int, Int> = ConditionedOneWayTransformationBox(conditionalTransformClosure: { key, value in\n      if key == \"do\" {\n        return Just(value * 2).setFailureType(to: Error.self).eraseToAnyPublisher()\n      } else if key == \"don't\" {\n        return Fail(error: TestError.anotherError).eraseToAnyPublisher()\n      }\n\n      if value > 0 {\n        return Just(value).setFailureType(to: Error.self).eraseToAnyPublisher()\n      }\n\n      return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n    })\n\n    describe(\"Conditioned post processing on a CacheLevel with the protocol extension\") {\n      beforeEach {\n        internalCache = CacheLevelFake<String, Int>()\n        cache = internalCache.conditionedPostProcess(transformer)\n      }\n\n      itBehavesLike(\"a cache with conditioned post-processing\") {\n        [\n          ConditionedPostProcessSharedExamplesContext.CacheToTest: cache as Any,\n          ConditionedPostProcessSharedExamplesContext.InternalCache: internalCache as Any,\n          ConditionedPostProcessSharedExamplesContext.Transformer: transformer as Any\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/ConditionedTransformersTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nstruct ConditionedTransformerSharedExamplesContext {\n  static let TransformerToTest = \"transformer\"\n}\n\nfinal class ConditionedTransformerSharedExamplesConfiguration: QuickConfiguration {\n  override class func configure(_: Configuration) {\n    sharedExamples(\"a conditioned one-way transformer\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var transformer: OneWayTransformationBox<String, Int>!\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        transformer = sharedExampleContext()[ConditionedTransformerSharedExamplesContext.TransformerToTest] as? OneWayTransformationBox<String, Int>\n      }\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n      }\n\n      context(\"when calling transform\") {\n        var result: Int?\n        var failure: Error?\n\n        beforeEach {\n          result = nil\n          failure = nil\n        }\n\n        context(\"when the condition is satisfied\") {\n          context(\"when the transformation is successful\") {\n            beforeEach {\n              cancellable = transformer.transform(\"15\")\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(error) = completion {\n                    failure = error\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should succeed\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should return the right value\") {\n              expect(result).toEventually(equal(15))\n            }\n\n            it(\"should not fail\") {\n              expect(failure).toEventually(beNil())\n            }\n          }\n\n          context(\"when the transformation fails\") {\n            beforeEach {\n              cancellable = transformer.transform(\"not a number\")\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(error) = completion {\n                    failure = error\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should not succeed\") {\n              expect(result).toEventually(beNil())\n            }\n\n            it(\"should fail\") {\n              expect(failure).toEventuallyNot(beNil())\n            }\n\n            it(\"should return the right error\") {\n              expect(failure as? TransformerError).toEventually(equal(TransformerError.transformationError))\n            }\n          }\n        }\n\n        context(\"when the condition is not satisfied\") {\n          beforeEach {\n            cancellable = transformer.transform(\"fail now\")\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  failure = error\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          it(\"should not succeed\") {\n            expect(result).toEventually(beNil())\n          }\n\n          it(\"should fail\") {\n            expect(failure).toEventuallyNot(beNil())\n          }\n\n          it(\"should return the right error\") {\n            expect(failure as? FetchError).toEventually(equal(FetchError.conditionNotSatisfied))\n          }\n        }\n\n        context(\"when the condition fails\") {\n          beforeEach {\n            cancellable = transformer.transform(\"fail with custom error\")\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  failure = error\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          it(\"should not succeed\") {\n            expect(result).toEventually(beNil())\n          }\n\n          it(\"should fail\") {\n            expect(failure).toEventuallyNot(beNil())\n          }\n\n          it(\"should return the right error\") {\n            expect(failure as? ConditionError).toEventually(equal(ConditionError.customError))\n          }\n        }\n      }\n    }\n\n    sharedExamples(\"a conditioned two-way transformer\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var transformer: TwoWayTransformationBox<String, Int>!\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        transformer = sharedExampleContext()[ConditionedTransformerSharedExamplesContext.TransformerToTest] as? TwoWayTransformationBox<String, Int>\n      }\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n      }\n\n      itBehavesLike(\"a conditioned one-way transformer\") {\n        [\n          ConditionedTransformerSharedExamplesContext.TransformerToTest: OneWayTransformationBox<String, Int>(transform: transformer.transform)\n        ]\n      }\n\n      context(\"when calling inverseTransform\") {\n        var result: String?\n        var failure: Error?\n\n        beforeEach {\n          result = nil\n          failure = nil\n        }\n\n        context(\"when the condition is satisfied\") {\n          beforeEach {\n            cancellable = transformer.inverseTransform(15)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  failure = error\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          it(\"should succeed\") {\n            expect(result).toEventuallyNot(beNil())\n          }\n\n          it(\"should return the right value\") {\n            expect(result).toEventually(equal(\"15\"))\n          }\n\n          it(\"should not fail\") {\n            expect(failure).toEventually(beNil())\n          }\n        }\n\n        context(\"when the condition is not satisfied\") {\n          beforeEach {\n            cancellable = transformer.inverseTransform(-14)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  failure = error\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          it(\"should not succeed\") {\n            expect(result).toEventually(beNil())\n          }\n\n          it(\"should fail\") {\n            expect(failure).toEventuallyNot(beNil())\n          }\n\n          it(\"should return the right error\") {\n            expect(failure as? FetchError).toEventually(equal(FetchError.conditionNotSatisfied))\n          }\n        }\n\n        context(\"when the condition fails\") {\n          beforeEach {\n            cancellable = transformer.inverseTransform(0)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  failure = error\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          it(\"should not succeed\") {\n            expect(result).toEventually(beNil())\n          }\n\n          it(\"should fail\") {\n            expect(failure).toEventuallyNot(beNil())\n          }\n\n          it(\"should return the right error\") {\n            expect(failure as? ConditionError).toEventually(equal(ConditionError.customError))\n          }\n        }\n      }\n    }\n  }\n}\n\nprivate enum ConditionError: Error {\n  case customError\n}\n\nprivate enum TransformerError: Error {\n  case transformationError\n}\n\nfinal class ConditionedTransformersTests: QuickSpec {\n  override func spec() {\n    describe(\"Conditioned one way transformers\") {\n      var transformer: OneWayTransformationBox<String, Int>!\n      let condition: (String) -> AnyPublisher<Bool, Error> = { input in\n        if (input as NSString).range(of: \"fail\").location != NSNotFound {\n          if (input as NSString).range(of: \"custom\").location != NSNotFound {\n            return Fail(error: ConditionError.customError).eraseToAnyPublisher()\n          } else {\n            return Just(false).setFailureType(to: Error.self).eraseToAnyPublisher()\n          }\n        } else {\n          return Just(true).setFailureType(to: Error.self).eraseToAnyPublisher()\n        }\n      }\n\n      beforeEach {\n        transformer = OneWayTransformationBox<String, Int>(transform: {\n          guard let intValue = Int($0) else {\n            return Fail(error: TransformerError.transformationError).eraseToAnyPublisher()\n          }\n\n          return Just(intValue).setFailureType(to: Error.self).eraseToAnyPublisher()\n        }).conditioned(condition)\n      }\n\n      itBehavesLike(\"a conditioned one-way transformer\") {\n        [\n          ConditionedTransformerSharedExamplesContext.TransformerToTest: transformer as Any\n        ]\n      }\n    }\n\n    describe(\"Conditioned two way transformers\") {\n      var transformer: TwoWayTransformationBox<String, Int>!\n      let condition: (String) -> AnyPublisher<Bool, Error> = { input in\n        if (input as NSString).range(of: \"fail\").location != NSNotFound {\n          if (input as NSString).range(of: \"custom\").location != NSNotFound {\n            return Fail(error: ConditionError.customError).eraseToAnyPublisher()\n          } else {\n            return Just(false).setFailureType(to: Error.self).eraseToAnyPublisher()\n          }\n        } else {\n          return Just(true).setFailureType(to: Error.self).eraseToAnyPublisher()\n        }\n      }\n      let inverseCondition: (Int) -> AnyPublisher<Bool, Error> = { input in\n        if input >= 0 {\n          if input == 0 {\n            return Fail(error: ConditionError.customError).eraseToAnyPublisher()\n          } else {\n            return Just(true).setFailureType(to: Error.self).eraseToAnyPublisher()\n          }\n        } else {\n          return Just(false).setFailureType(to: Error.self).eraseToAnyPublisher()\n        }\n      }\n\n      beforeEach {\n        transformer = TwoWayTransformationBox<String, Int>(transform: {\n          guard let intValue = Int($0) else {\n            return Fail(error: TransformerError.transformationError).eraseToAnyPublisher()\n          }\n\n          return Just(intValue).setFailureType(to: Error.self).eraseToAnyPublisher()\n        }, inverseTransform: {\n          Just(\"\\($0)\").setFailureType(to: Error.self).eraseToAnyPublisher()\n        }).conditioned(condition, inverseCondition: inverseCondition)\n      }\n\n      itBehavesLike(\"a conditioned two-way transformer\") {\n        [\n          ConditionedTransformerSharedExamplesContext.TransformerToTest: transformer as Any\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/ConditionedTwoWayTransformationBoxTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nfinal class ConditionedTwoWayTransformationBoxTests: QuickSpec {\n  override func spec() {\n    describe(\"Conditioned two-way transformation box\") {\n      var box: ConditionedTwoWayTransformationBox<Int, NSURL, String>!\n      var error: Error!\n      var cancellable: AnyCancellable?\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n      }\n\n      context(\"when created through closures\") {\n        beforeEach {\n          error = nil\n\n          box = ConditionedTwoWayTransformationBox<Int, NSURL, String>(conditionalTransformClosure: { key, value in\n            if key > 0 {\n              guard value.scheme == \"http\", let value = value.absoluteString else {\n                return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n              }\n\n              return Just(value).setFailureType(to: Error.self).eraseToAnyPublisher()\n            } else {\n              return Fail(error: TestError.anotherError).eraseToAnyPublisher()\n            }\n          }, conditionalInverseTransformClosure: { key, value in\n            if key > 0 {\n              guard let value = NSURL(string: value) else {\n                return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n              }\n\n              return Just(value).setFailureType(to: Error.self).eraseToAnyPublisher()\n            } else {\n              return Fail(error: TestError.anotherError).eraseToAnyPublisher()\n            }\n          })\n        }\n\n        context(\"when calling the conditional transformation\") {\n          var result: String!\n\n          beforeEach {\n            result = nil\n          }\n\n          context(\"if the transformation is possible\") {\n            let expectedResult = \"http://www.google.de?test=1\"\n\n            beforeEach {\n              cancellable = box.conditionalTransform(key: 1, value: NSURL(string: expectedResult)!)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should call the success closure\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should not call the failure closure\") {\n              expect(error).toEventually(beNil())\n            }\n\n            it(\"should return the expected result\") {\n              expect(result).toEventually(equal(expectedResult))\n            }\n          }\n\n          context(\"if the transformation is not possible\") {\n            beforeEach {\n              cancellable = box.conditionalTransform(key: 1, value: NSURL(string: \"ftp://google.de/robots.txt\")!)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should not call the success closure\") {\n              expect(result).toEventually(beNil())\n            }\n\n            it(\"should call the failure closure\") {\n              expect(error).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the right error\") {\n              expect(error as? TestError).toEventually(equal(TestError.simpleError))\n            }\n          }\n\n          context(\"if the key doesn't satisfy the condition\") {\n            beforeEach {\n              cancellable = box.conditionalTransform(key: -1, value: NSURL(string: \"ftp://google.de/robots.txt\")!)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should not call the success closure\") {\n              expect(result).toEventually(beNil())\n            }\n\n            it(\"should call the failure closure\") {\n              expect(error).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the right error\") {\n              expect(error as? TestError).toEventually(equal(TestError.anotherError))\n            }\n          }\n        }\n\n        context(\"when calling the conditional inverse transformation\") {\n          var result: NSURL!\n\n          beforeEach {\n            result = nil\n          }\n\n          context(\"if the transformation is possible\") {\n            let usedString = \"http://www.google.de?test=1\"\n\n            beforeEach {\n              cancellable = box.conditionalInverseTransform(key: 1, value: usedString)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should call the success closure\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should not call the failure closure\") {\n              expect(error).toEventually(beNil())\n            }\n\n            it(\"should return the expected result\") {\n              expect(result).toEventually(equal(NSURL(string: usedString)!))\n            }\n          }\n\n          context(\"if the transformation is not possible\") {\n            beforeEach {\n              cancellable = box.conditionalInverseTransform(key: 1, value: \"this is not a valid URL :'(\")\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should not call the success closure\") {\n              expect(result).toEventually(beNil())\n            }\n\n            it(\"should call the failure closure\") {\n              expect(error).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the right error\") {\n              expect(error as? TestError).toEventually(equal(TestError.simpleError))\n            }\n          }\n\n          context(\"if the key doesn't satisfy the condition\") {\n            beforeEach {\n              cancellable = box.conditionalInverseTransform(key: -1, value: \"http://validurl.de\")\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should not call the success closure\") {\n              expect(result).toEventually(beNil())\n            }\n\n            it(\"should call the failure closure\") {\n              expect(error).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the right error\") {\n              expect(error as? TestError).toEventually(equal(TestError.anotherError))\n            }\n          }\n        }\n\n        context(\"when inverting the transformer\") {\n          var invertedBox: ConditionedTwoWayTransformationBox<Int, String, NSURL>!\n\n          beforeEach {\n            invertedBox = box.invert()\n          }\n\n          context(\"when calling the inverse transformation\") {\n            var result: String!\n\n            beforeEach {\n              result = nil\n            }\n\n            context(\"if the transformation is possible\") {\n              let expectedResult = \"http://www.google.de?test=1\"\n\n              beforeEach {\n                cancellable = invertedBox.conditionalInverseTransform(key: 1, value: NSURL(string: expectedResult)!)\n                  .sink(receiveCompletion: { completion in\n                    if case let .failure(e) = completion {\n                      error = e\n                    }\n                  }, receiveValue: { result = $0 })\n              }\n\n              it(\"should call the success closure\") {\n                expect(result).toEventuallyNot(beNil())\n              }\n\n              it(\"should not call the failure closure\") {\n                expect(error).toEventually(beNil())\n              }\n\n              it(\"should return the expected result\") {\n                expect(result).toEventually(equal(expectedResult))\n              }\n            }\n\n            context(\"if the transformation is not possible\") {\n              beforeEach {\n                cancellable = invertedBox.conditionalInverseTransform(key: 1, value: NSURL(string: \"ftp://google.de/robots.txt\")!)\n                  .sink(receiveCompletion: { completion in\n                    if case let .failure(e) = completion {\n                      error = e\n                    }\n                  }, receiveValue: { result = $0 })\n              }\n\n              it(\"should not call the success closure\") {\n                expect(result).toEventually(beNil())\n              }\n\n              it(\"should call the failure closure\") {\n                expect(error).toEventuallyNot(beNil())\n              }\n\n              it(\"should pass the right error\") {\n                expect(error as? TestError).toEventually(equal(TestError.simpleError))\n              }\n            }\n\n            context(\"if the key doesn't satisfy the condition\") {\n              beforeEach {\n                cancellable = invertedBox.conditionalInverseTransform(key: -1, value: NSURL(string: \"ftp://google.de/robots.txt\")!)\n                  .sink(receiveCompletion: { completion in\n                    if case let .failure(e) = completion {\n                      error = e\n                    }\n                  }, receiveValue: { result = $0 })\n              }\n\n              it(\"should not call the success closure\") {\n                expect(result).toEventually(beNil())\n              }\n\n              it(\"should call the failure closure\") {\n                expect(error).toEventuallyNot(beNil())\n              }\n\n              it(\"should pass the right error\") {\n                expect(error as? TestError).toEventually(equal(TestError.anotherError))\n              }\n            }\n          }\n\n          context(\"when calling the conditional transformation\") {\n            var result: NSURL!\n\n            beforeEach {\n              result = nil\n            }\n\n            context(\"if the transformation is possible\") {\n              let usedString = \"http://www.google.de?test=1\"\n\n              beforeEach {\n                cancellable = invertedBox.conditionalTransform(key: 1, value: usedString)\n                  .sink(receiveCompletion: { completion in\n                    if case let .failure(e) = completion {\n                      error = e\n                    }\n                  }, receiveValue: { result = $0 })\n              }\n\n              it(\"should call the success closure\") {\n                expect(result).toEventuallyNot(beNil())\n              }\n\n              it(\"should not call the failure closure\") {\n                expect(error).toEventually(beNil())\n              }\n\n              it(\"should return the expected result\") {\n                expect(result).toEventually(equal(NSURL(string: usedString)!))\n              }\n            }\n\n            context(\"if the transformation is not possible\") {\n              beforeEach {\n                cancellable = invertedBox.conditionalTransform(key: 1, value: \"this is not a valid URL :'(\")\n                  .sink(receiveCompletion: { completion in\n                    if case let .failure(e) = completion {\n                      error = e\n                    }\n                  }, receiveValue: { result = $0 })\n              }\n\n              it(\"should not call the success closure\") {\n                expect(result).toEventually(beNil())\n              }\n\n              it(\"should call the failure closure\") {\n                expect(error).toEventuallyNot(beNil())\n              }\n\n              it(\"should pass the right error\") {\n                expect(error as? TestError).toEventually(equal(TestError.simpleError))\n              }\n            }\n\n            context(\"if the key doesn't satisfy the condition\") {\n              beforeEach {\n                cancellable = invertedBox.conditionalTransform(key: -1, value: \"http://validurl.de\")\n                  .sink(receiveCompletion: { completion in\n                    if case let .failure(e) = completion {\n                      error = e\n                    }\n                  }, receiveValue: { result = $0 })\n              }\n\n              it(\"should not call the success closure\") {\n                expect(result).toEventually(beNil())\n              }\n\n              it(\"should call the failure closure\") {\n                expect(error).toEventuallyNot(beNil())\n              }\n\n              it(\"should pass the right error\") {\n                expect(error as? TestError).toEventually(equal(TestError.anotherError))\n              }\n            }\n          }\n        }\n      }\n\n      context(\"when created through a 2-way transformer\") {\n        var originalTransformer: TwoWayTransformationBox<NSURL, String>!\n\n        beforeEach {\n          error = nil\n          originalTransformer = TwoWayTransformationBox(transform: { value in\n            guard value.scheme == \"http\", let value = value.absoluteString else {\n              return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n            }\n\n            return Just(value).setFailureType(to: Error.self).eraseToAnyPublisher()\n          }, inverseTransform: { value in\n            guard let value = NSURL(string: value) else {\n              return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n            }\n\n            return Just(value).setFailureType(to: Error.self).eraseToAnyPublisher()\n          })\n\n          box = ConditionedTwoWayTransformationBox<Int, NSURL, String>(transformer: originalTransformer)\n        }\n\n        context(\"when calling the conditional transformation\") {\n          var result: String!\n\n          beforeEach {\n            result = nil\n          }\n\n          context(\"if the transformation is possible\") {\n            let expectedResult = \"http://www.google.de?test=1\"\n\n            beforeEach {\n              cancellable = box.conditionalTransform(key: -1, value: NSURL(string: expectedResult)!)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should call the success closure\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should not call the failure closure\") {\n              expect(error).toEventually(beNil())\n            }\n\n            it(\"should return the expected result\") {\n              expect(result).toEventually(equal(expectedResult))\n            }\n          }\n\n          context(\"if the transformation is not possible\") {\n            beforeEach {\n              cancellable = box.conditionalTransform(key: 1, value: NSURL(string: \"ftp://google.de/robots.txt\")!)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should not call the success closure\") {\n              expect(result).toEventually(beNil())\n            }\n\n            it(\"should call the failure closure\") {\n              expect(error).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the right error\") {\n              expect(error as? TestError).toEventually(equal(TestError.simpleError))\n            }\n          }\n        }\n\n        context(\"when calling the conditional inverse transformation\") {\n          var result: NSURL!\n\n          beforeEach {\n            result = nil\n          }\n\n          context(\"if the transformation is possible\") {\n            let usedString = \"http://www.google.de?test=1\"\n\n            beforeEach {\n              cancellable = box.conditionalInverseTransform(key: -1, value: usedString)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should call the success closure\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should not call the failure closure\") {\n              expect(error).toEventually(beNil())\n            }\n\n            it(\"should return the expected result\") {\n              expect(result).toEventually(equal(NSURL(string: usedString)!))\n            }\n          }\n\n          context(\"if the transformation is not possible\") {\n            beforeEach {\n              cancellable = box.conditionalInverseTransform(key: 1, value: \"this is not a valid URL :'(\")\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should not call the success closure\") {\n              expect(result).toEventually(beNil())\n            }\n\n            it(\"should call the failure closure\") {\n              expect(error).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the right error\") {\n              expect(error as? TestError).toEventually(equal(TestError.simpleError))\n            }\n          }\n        }\n\n        context(\"when inverting the transformer\") {\n          var invertedBox: ConditionedTwoWayTransformationBox<Int, String, NSURL>!\n\n          beforeEach {\n            invertedBox = box.invert()\n          }\n\n          context(\"when calling the inverse transformation\") {\n            var result: String!\n\n            beforeEach {\n              result = nil\n            }\n\n            context(\"if the transformation is possible\") {\n              let expectedResult = \"http://www.google.de?test=1\"\n\n              beforeEach {\n                cancellable = invertedBox.conditionalInverseTransform(key: 1, value: NSURL(string: expectedResult)!)\n                  .sink(receiveCompletion: { completion in\n                    if case let .failure(e) = completion {\n                      error = e\n                    }\n                  }, receiveValue: { result = $0 })\n              }\n\n              it(\"should call the success closure\") {\n                expect(result).toEventuallyNot(beNil())\n              }\n\n              it(\"should not call the failure closure\") {\n                expect(error).toEventually(beNil())\n              }\n\n              it(\"should return the expected result\") {\n                expect(result).toEventually(equal(expectedResult))\n              }\n            }\n\n            context(\"if the transformation is not possible\") {\n              beforeEach {\n                cancellable = invertedBox.conditionalInverseTransform(key: 1, value: NSURL(string: \"ftp://google.de/robots.txt\")!)\n                  .sink(receiveCompletion: { completion in\n                    if case let .failure(e) = completion {\n                      error = e\n                    }\n                  }, receiveValue: { result = $0 })\n              }\n\n              it(\"should not call the success closure\") {\n                expect(result).toEventually(beNil())\n              }\n\n              it(\"should call the failure closure\") {\n                expect(error).toEventuallyNot(beNil())\n              }\n\n              it(\"should pass the right error\") {\n                expect(error as? TestError).toEventually(equal(TestError.simpleError))\n              }\n            }\n          }\n\n          context(\"when calling the conditional transformation\") {\n            var result: NSURL!\n\n            beforeEach {\n              result = nil\n            }\n\n            context(\"if the transformation is possible\") {\n              let usedString = \"http://www.google.de?test=1\"\n\n              beforeEach {\n                cancellable = invertedBox.conditionalTransform(key: 1, value: usedString)\n                  .sink(receiveCompletion: { completion in\n                    if case let .failure(e) = completion {\n                      error = e\n                    }\n                  }, receiveValue: { result = $0 })\n              }\n\n              it(\"should call the success closure\") {\n                expect(result).toEventuallyNot(beNil())\n              }\n\n              it(\"should not call the failure closure\") {\n                expect(error).toEventually(beNil())\n              }\n\n              it(\"should return the expected result\") {\n                expect(result).toEventually(equal(NSURL(string: usedString)!))\n              }\n            }\n\n            context(\"if the transformation is not possible\") {\n              beforeEach {\n                cancellable = invertedBox.conditionalTransform(key: 1, value: \"this is not a valid URL :'(\")\n                  .sink(receiveCompletion: { completion in\n                    if case let .failure(e) = completion {\n                      error = e\n                    }\n                  }, receiveValue: { result = $0 })\n              }\n\n              it(\"should not call the success closure\") {\n                expect(result).toEventually(beNil())\n              }\n\n              it(\"should call the failure closure\") {\n                expect(error).toEventuallyNot(beNil())\n              }\n\n              it(\"should pass the right error\") {\n                expect(error as? TestError).toEventually(equal(TestError.simpleError))\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/ConditionedValueTransformationTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nstruct ConditionedValueTransformationSharedExamplesContext {\n  static let CacheToTest = \"cache\"\n  static let InternalCache = \"internalCache\"\n  static let Transformer = \"transformer\"\n}\n\nfinal class ConditionedValueTransformationSharedExamplesConfiguration: QuickConfiguration {\n  override class func configure(_: Configuration) {\n    sharedExamples(\"a cache with conditioned value transformation\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache: BasicCache<String, Float>!\n      var internalCache: CacheLevelFake<String, Int>!\n      var transformer: ConditionedTwoWayTransformationBox<String, Int, Float>!\n      var cancellables: Set<AnyCancellable>!\n\n      beforeEach {\n        cancellables = Set<AnyCancellable>()\n\n        cache = sharedExampleContext()[ConditionedValueTransformationSharedExamplesContext.CacheToTest] as? BasicCache<String, Float>\n        internalCache = sharedExampleContext()[ConditionedValueTransformationSharedExamplesContext.InternalCache] as? CacheLevelFake<String, Int>\n        transformer = sharedExampleContext()[ConditionedValueTransformationSharedExamplesContext.Transformer] as? ConditionedTwoWayTransformationBox<String, Int, Float>\n      }\n\n      afterEach {\n        cancellables = nil\n      }\n\n      context(\"when calling get with a key that meets the condition\") {\n        let key = \"do\"\n        var successValue: Float?\n        var failureValue: Error?\n        var getSubject: PassthroughSubject<Int, Error>!\n\n        beforeEach {\n          getSubject = PassthroughSubject()\n          internalCache.getSubject = getSubject\n          successValue = nil\n          failureValue = nil\n\n          cache.get(key)\n            .sink(receiveCompletion: { completion in\n              if case let .failure(error) = completion {\n                failureValue = error\n              }\n            }, receiveValue: { successValue = $0 })\n            .store(in: &cancellables)\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledGet).toEventually(equal(1))\n        }\n\n        it(\"should forward the key\") {\n          expect(internalCache.didGetKey).toEventually(equal(key))\n        }\n\n        context(\"when the request succeeds\") {\n          let value = 101\n\n          beforeEach {\n            getSubject.send(value)\n          }\n\n          it(\"should call the transformation closure with the right value\") {\n            var expected: Float!\n            transformer.conditionalTransform(key: key, value: value)\n              .sink(receiveCompletion: { _ in }, receiveValue: { expected = $0 })\n              .store(in: &cancellables)\n            expect(successValue).toEventually(equal(expected))\n          }\n        }\n\n        context(\"when the request fails\") {\n          let errorCode = TestError.simpleError\n\n          beforeEach {\n            getSubject.send(completion: .failure(errorCode))\n          }\n\n          it(\"should call the original failure closure\") {\n            expect(failureValue as? TestError).toEventually(equal(errorCode))\n          }\n        }\n      }\n\n      context(\"when calling get with a key that doesn't meet the condition\") {\n        let key = \"don't\"\n        var successValue: Float?\n        var failureValue: Error?\n        var getSubject: PassthroughSubject<Int, Error>!\n\n        beforeEach {\n          getSubject = PassthroughSubject()\n          internalCache.getSubject = getSubject\n          successValue = nil\n          failureValue = nil\n\n          cache.get(key)\n            .sink(receiveCompletion: { completion in\n              if case let .failure(error) = completion {\n                failureValue = error\n              }\n            }, receiveValue: { successValue = $0 })\n            .store(in: &cancellables)\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledGet).toEventually(equal(1))\n        }\n\n        it(\"should forward the key\") {\n          expect(internalCache.didGetKey).toEventually(equal(key))\n        }\n\n        context(\"when the request succeeds\") {\n          let value = -101\n\n          beforeEach {\n            getSubject.send(value)\n          }\n\n          it(\"should not call the original success closure\") {\n            expect(successValue).toEventually(beNil())\n          }\n\n          it(\"should call the original failure closure\") {\n            expect(failureValue).toEventuallyNot(beNil())\n          }\n\n          it(\"should pass the right error code\") {\n            expect(failureValue as? TestError).toEventually(equal(TestError.anotherError))\n          }\n        }\n\n        context(\"when the request fails\") {\n          let errorCode = TestError.simpleError\n\n          beforeEach {\n            getSubject.send(completion: .failure(errorCode))\n          }\n\n          it(\"should call the original failure closure\") {\n            expect(failureValue as? TestError).toEventually(equal(errorCode))\n          }\n        }\n      }\n\n      context(\"when calling get\") {\n        let key = \"12\"\n        var successValue: Float?\n        var failureValue: Error?\n        var getSubject: PassthroughSubject<Int, Error>!\n\n        beforeEach {\n          getSubject = PassthroughSubject()\n          internalCache.getSubject = getSubject\n          successValue = nil\n          failureValue = nil\n\n          cache.get(key)\n            .sink(receiveCompletion: { completion in\n              if case let .failure(error) = completion {\n                failureValue = error\n              }\n            }, receiveValue: { successValue = $0 })\n            .store(in: &cancellables)\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledGet).toEventually(equal(1))\n        }\n\n        it(\"should forward the key\") {\n          expect(internalCache.didGetKey).toEventually(equal(key))\n        }\n\n        context(\"when the request succeeds\") {\n          context(\"when the transformation closure returns a value\") {\n            let value = 101\n\n            beforeEach {\n              getSubject.send(value)\n            }\n\n            it(\"should call the transformation closure with the success value\") {\n              var expected: Float!\n              transformer.conditionalTransform(key: key, value: value)\n                .sink(receiveCompletion: { _ in }, receiveValue: { expected = $0 })\n                .store(in: &cancellables)\n              expect(successValue).toEventually(equal(expected))\n            }\n          }\n\n          context(\"when the transformation closure returns nil\") {\n            let value = -101\n\n            beforeEach {\n              getSubject.send(value)\n            }\n\n            it(\"should not call the original success closure\") {\n              expect(successValue).toEventually(beNil())\n            }\n\n            it(\"should call the original failure closure\") {\n              expect(failureValue).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the right error code\") {\n              expect(failureValue as? TestError).toEventually(equal(TestError.simpleError))\n            }\n          }\n        }\n\n        context(\"when the request fails\") {\n          let errorCode = TestError.anotherError\n\n          beforeEach {\n            getSubject.send(completion: .failure(errorCode))\n          }\n\n          it(\"should call the original failure closure\") {\n            expect(failureValue as? TestError).toEventually(equal(errorCode))\n          }\n        }\n      }\n\n      context(\"when calling set\") {\n        var failed: Error?\n        var succeeded: Bool!\n        var canceled: Bool!\n\n        beforeEach {\n          canceled = false\n          succeeded = false\n          failed = nil\n        }\n\n        context(\"when the condition is met\") {\n          let key = \"10\"\n          let value: Float = 222\n\n          beforeEach {\n            cache.set(value, forKey: key)\n              .handleEvents(receiveCancel: { canceled = true })\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  failed = error\n                }\n              }, receiveValue: { _ in succeeded = true })\n              .store(in: &cancellables)\n          }\n\n          it(\"should forward the call to the internal cache\") {\n            expect(internalCache.numberOfTimesCalledSet).toEventually(equal(1))\n          }\n\n          it(\"should forward the key\") {\n            expect(internalCache.didSetKey).toEventually(equal(key))\n          }\n\n          it(\"should pass the right value\") {\n            expect(internalCache.didSetValue).toEventually(equal(Int(value)))\n          }\n\n          context(\"when the set closure succeeds\") {\n            beforeEach {\n              internalCache.setPublishers[key]?.send()\n            }\n\n            it(\"should succeed the future\") {\n              expect(succeeded).toEventually(beTrue())\n            }\n          }\n\n          context(\"when the set clousure is canceled\") {\n            beforeEach {\n              cancellables.first?.cancel()\n            }\n\n            it(\"should cancel the future\") {\n              expect(canceled).toEventually(beTrue())\n            }\n          }\n\n          context(\"when the set closure fails\") {\n            let error = TestError.anotherError\n\n            beforeEach {\n              internalCache.setPublishers[key]?.send(completion: .failure(error))\n            }\n\n            it(\"should fail the future\") {\n              expect(failed as? TestError).toEventually(equal(error))\n            }\n          }\n        }\n\n        context(\"when the condition is not met\") {\n          let key = \"Test\"\n          let value: Float = -222\n\n          beforeEach {\n            cache.set(value, forKey: key)\n              .handleEvents(receiveCancel: { canceled = true })\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  failed = error\n                }\n              }, receiveValue: { _ in succeeded = true })\n              .store(in: &cancellables)\n          }\n\n          it(\"should not forward the call to the internal cache\") {\n            expect(internalCache.numberOfTimesCalledSet).toEventually(equal(0))\n          }\n\n          it(\"should fail the future\") {\n            expect(failed).toEventuallyNot(beNil())\n          }\n        }\n      }\n\n      context(\"when calling clear\") {\n        beforeEach {\n          cache.clear()\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledClear).toEventually(equal(1))\n        }\n      }\n\n      context(\"when calling onMemoryWarning\") {\n        beforeEach {\n          cache.onMemoryWarning()\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledOnMemoryWarning).toEventually(equal(1))\n        }\n      }\n    }\n  }\n}\n\nfinal class ConditionedValueTransformationTests: QuickSpec {\n  override func spec() {\n    var cache: BasicCache<String, Float>!\n    var internalCache: CacheLevelFake<String, Int>!\n    let transformer: ConditionedTwoWayTransformationBox<String, Int, Float> = ConditionedTwoWayTransformationBox(conditionalTransformClosure: { key, value in\n      if key == \"do\" {\n        return Just(Float(value * 2)).setFailureType(to: Error.self).eraseToAnyPublisher()\n      } else if key == \"don't\" {\n        return Fail(error: TestError.anotherError).eraseToAnyPublisher()\n      }\n\n      if value > 0 {\n        return Just(Float(value)).setFailureType(to: Error.self).eraseToAnyPublisher()\n      }\n\n      return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n    }, conditionalInverseTransformClosure: { key, value in\n      if key == \"do\" {\n        return Just(Int(value / 2)).setFailureType(to: Error.self).eraseToAnyPublisher()\n      } else if key == \"don't\" {\n        return Fail(error: TestError.anotherError).eraseToAnyPublisher()\n      }\n\n      if value > 0 {\n        return Just(Int(value)).setFailureType(to: Error.self).eraseToAnyPublisher()\n      }\n\n      return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n    })\n\n    describe(\"Conditioned post processing on a CacheLevel with the protocol extension\") {\n      beforeEach {\n        internalCache = CacheLevelFake<String, Int>()\n        cache = internalCache.conditionedValueTransformation(transformer: transformer)\n      }\n\n      itBehavesLike(\"a cache with conditioned value transformation\") {\n        [\n          ConditionedValueTransformationSharedExamplesContext.CacheToTest: cache as Any,\n          ConditionedValueTransformationSharedExamplesContext.InternalCache: internalCache as Any,\n          ConditionedValueTransformationSharedExamplesContext.Transformer: transformer as Any\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/DiskCacheTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nprivate func filesInDirectory(directory: String) -> [String] {\n  let result = (try? FileManager.default.contentsOfDirectory(atPath: directory)) ?? []\n\n  return result\n}\n\nfinal class DiskCacheTests: QuickSpec {\n  override func spec() {\n    describe(\"DiskCacheLevel\") {\n      var cache: DiskCacheLevel<String, NSData>!\n      let path = (NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)[0] as NSString).appendingPathComponent(\"com.carlos.default\")\n      var fileManager: FileManager!\n      var cancellables: Set<AnyCancellable>!\n\n      beforeEach {\n        cancellables = Set()\n\n        fileManager = FileManager.default\n        _ = try? fileManager.removeItem(atPath: path)\n\n        cache = DiskCacheLevel(path: path, capacity: 400)\n      }\n\n      afterEach {\n        cancellables = nil\n      }\n\n      context(\"when calling get\") {\n        var result: NSData?\n        let key = \"test-key\"\n        var failureSentinel: Bool?\n\n        beforeEach {\n          cache.get(key)\n            .sink(receiveCompletion: { completion in\n              if case .failure = completion {\n                failureSentinel = true\n              }\n            }, receiveValue: { result = $0 })\n            .store(in: &cancellables)\n        }\n\n        it(\"should fail\") {\n          expect(failureSentinel).toEventually(beTrue())\n        }\n\n        it(\"should not succeed\") {\n          expect(result).toEventually(beNil())\n        }\n\n        context(\"when setting a value for that key\") {\n          let value = \"value to set\".data(using: .utf8, allowLossyConversion: false)!\n\n          beforeEach {\n            failureSentinel = nil\n\n            cache.set(value as NSData, forKey: key)\n              .sink(receiveCompletion: { _ in }, receiveValue: {})\n              .store(in: &cancellables)\n          }\n\n          context(\"when getting the value for another key\") {\n            let anotherKey = \"test_key_2\"\n\n            beforeEach {\n              cache.get(anotherKey)\n                .sink(receiveCompletion: { completion in\n                  if case .failure = completion {\n                    failureSentinel = true\n                  }\n                }, receiveValue: { result = $0 })\n                .store(in: &cancellables)\n            }\n\n            it(\"should not succeed\") {\n              expect(result).toEventually(beNil())\n            }\n\n            it(\"should fail\") {\n              expect(failureSentinel).toEventuallyNot(beNil())\n            }\n          }\n        }\n      }\n\n      context(\"when calling set\") {\n        let key = \"key\"\n        let value = \"value\".data(using: .utf8, allowLossyConversion: false)!\n        var result: NSData?\n        var failureSentinel: Bool?\n        var writeSucceeded: Bool!\n\n        beforeEach {\n          writeSucceeded = false\n\n          cache.set(value as NSData, forKey: key)\n            .sink(receiveCompletion: { _ in }, receiveValue: { _ in\n              writeSucceeded = true\n            }).store(in: &cancellables)\n        }\n\n        afterEach {\n          failureSentinel = nil\n          result = nil\n        }\n\n        it(\"should save the key on disk\") {\n          expect(fileManager.fileExists(atPath: (path as NSString).appendingPathComponent(key.MD5String()))).toEventually(beTrue())\n        }\n\n        it(\"should save the data on disk\") {\n          expect(NSKeyedUnarchiver.unarchiveObject(withFile: (path as NSString).appendingPathComponent(key.MD5String())) as? NSData).toEventually(equal(value as NSData))\n        }\n\n        // TODO: How to simulate failure during writing in order to test it?\n        it(\"should eventually succeed\") {\n          expect(writeSucceeded).toEventually(beTrue())\n        }\n\n        context(\"when calling get\") {\n          beforeEach {\n            result = nil\n            failureSentinel = nil\n\n            cache.set(value as NSData, forKey: key)\n              .flatMap {\n                cache.get(key)\n              }\n              .sink(receiveCompletion: { completion in\n                if case .failure = completion {\n                  failureSentinel = true\n                }\n              }, receiveValue: { result = $0 })\n              .store(in: &cancellables)\n          }\n\n          it(\"should succeed\") {\n            expect(result).toEventually(equal(value as NSData))\n          }\n\n          it(\"should not fail\") {\n            expect(failureSentinel).toEventually(beNil())\n          }\n        }\n\n        context(\"when setting a different value for the same key\") {\n          let newValue = \"another value\".data(using: .utf8, allowLossyConversion: false)!\n\n          beforeEach {\n            cache.set(newValue as NSData, forKey: key)\n              .sink(receiveCompletion: { _ in }, receiveValue: {})\n              .store(in: &cancellables)\n          }\n\n          it(\"should keep the key on disk\") {\n            expect(fileManager.fileExists(atPath: (path as NSString).appendingPathComponent(key.MD5String()))).toEventually(beTrue())\n          }\n\n          it(\"should overwrite the data on disk\") {\n            expect(NSKeyedUnarchiver.unarchiveObject(withFile: (path as NSString).appendingPathComponent(key.MD5String())) as? NSData).toEventually(equal(newValue as NSData))\n          }\n\n          context(\"when calling get\") {\n            beforeEach {\n              cache.set(newValue as NSData, forKey: key)\n                .flatMap {\n                  cache.get(key)\n                }\n                .sink(receiveCompletion: { completion in\n                  if case .failure = completion {\n                    failureSentinel = true\n                  }\n                }, receiveValue: { result = $0 })\n                .store(in: &cancellables)\n            }\n\n            it(\"should succeed with the overwritten value\") {\n              expect(result).toEventually(equal(newValue as NSData))\n            }\n          }\n        }\n\n        context(\"when setting more than its capacity\") {\n          let otherKeys = [\"key1\", \"key2\", \"key3\"]\n          let otherValues = [\n            \"long string value\",\n            \"even longer string value but should still fit the cache\",\n            \"longest string value that should fill the cache capacity and force it to evict some values\"\n          ]\n\n          beforeEach {\n            for (key, value) in zip(otherKeys, otherValues) {\n              cache.set(value.data(using: .utf8, allowLossyConversion: false)! as NSData, forKey: key)\n                .sink(receiveCompletion: { _ in }, receiveValue: {})\n                .store(in: &cancellables)\n            }\n          }\n\n          it(\"should evict at least one value\") {\n            var evictedAtLeastOne = false\n\n            for key in otherKeys {\n              cache.get(key)\n                .sink(receiveCompletion: { completion in\n                  if case .failure = completion {\n                    evictedAtLeastOne = true\n                  }\n                }, receiveValue: { result = $0 })\n                .store(in: &cancellables)\n            }\n\n            expect(evictedAtLeastOne).toEventually(beTrue())\n          }\n        }\n\n        context(\"when calling remove\") {\n          var result = false\n          let key = \"test-key\"\n\n          beforeEach {\n            result = false\n\n            cache.clear()\n          }\n\n          it(\"shall remove object from cache for given key\") {\n            cache.set(\"value\".data(using: .utf8)! as NSData, forKey: key)\n              .flatMap { cache.remove(key) }\n              .sink(\n                receiveCompletion: { _ in },\n                receiveValue: { _ in\n                  result = true\n                }\n              )\n              .store(in: &cancellables)\n\n            expect(result).toEventually(beTrue())\n          }\n        }\n\n        context(\"when calling clear\") {\n          beforeEach {\n            result = nil\n\n            cache.clear()\n          }\n\n          it(\"should remove all the files on disk\") {\n            expect(filesInDirectory(directory: path)).toEventually(beEmpty())\n          }\n\n          context(\"when calling get\") {\n            beforeEach {\n              cache.get(key)\n                .sink(receiveCompletion: { completion in\n                  if case .failure = completion {\n                    failureSentinel = true\n                  }\n                }, receiveValue: { result = $0 })\n                .store(in: &cancellables)\n            }\n\n            it(\"should fail\") {\n              expect(failureSentinel).toEventually(beTrue())\n            }\n\n            it(\"should not succeed\") {\n              expect(result).toEventually(beNil())\n            }\n          }\n        }\n\n        context(\"when calling onMemoryWarning\") {\n          beforeEach {\n            result = nil\n\n            cache.onMemoryWarning()\n          }\n\n          context(\"when calling get\") {\n            beforeEach {\n              beforeEach {\n                cache.get(key)\n                  .sink(receiveCompletion: { completion in\n                    if case .failure = completion {\n                      failureSentinel = true\n                    }\n                  }, receiveValue: { result = $0 })\n                  .store(in: &cancellables)\n              }\n\n              it(\"should not fail\") {\n                expect(failureSentinel).toEventually(beNil())\n              }\n\n              it(\"should succeed\") {\n                expect(result).toEventually(equal(value as NSData))\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/Fakes/Base64EncodedImage.swift",
    "content": "//\n//  Base64EncodedImage.swift\n//\n//\n//  Created by Lisovyi, Ivan on 01.07.20.\n//\n\nimport Foundation\n\nlet base64EncodedImage = \"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\"\n"
  },
  {
    "path": "Tests/CarlosTests/Fakes/CacheLevelFake.swift",
    "content": "import Foundation\n\nimport Carlos\nimport Combine\n\nclass CacheLevelFake<A: Hashable, B>: CacheLevel {\n  typealias KeyType = A\n  typealias OutputType = B\n\n  var numberOfTimesRemoveCalled = 0\n  var removeKey: KeyType?\n  var removeSubject: PassthroughSubject<Void, Error>!\n\n  init() {}\n\n  // MARK: Get\n\n  var numberOfTimesCalledGet = 0\n  var didGetKey: KeyType?\n  var getSubject: PassthroughSubject<OutputType, Error>?\n  var getPublishers: [KeyType: PassthroughSubject<OutputType, Error>] = [:]\n  func get(_ key: KeyType) -> AnyPublisher<OutputType, Error> {\n    numberOfTimesCalledGet += 1\n    didGetKey = key\n\n    if let getSubject = getSubject {\n      return getSubject.eraseToAnyPublisher()\n    }\n\n    if let subject = getPublishers[key] {\n      return subject.eraseToAnyPublisher()\n    }\n\n    let newSubject = PassthroughSubject<OutputType, Error>()\n    getPublishers[key] = newSubject\n\n    return newSubject.eraseToAnyPublisher()\n  }\n\n  // MARK: Set\n\n  var numberOfTimesCalledSet = 0\n  var didSetValue: OutputType?\n  var didSetKey: KeyType?\n  var setSubject: PassthroughSubject<Void, Error>?\n  var setPublishers: [KeyType: PassthroughSubject<Void, Error>] = [:]\n  func set(_ value: OutputType, forKey key: KeyType) -> AnyPublisher<Void, Error> {\n    numberOfTimesCalledSet += 1\n\n    didSetKey = key\n    didSetValue = value\n\n    if let setSubject = setSubject {\n      return setSubject.eraseToAnyPublisher()\n    }\n\n    if let subject = setPublishers[key] {\n      return subject.eraseToAnyPublisher()\n    }\n\n    let newSubject = PassthroughSubject<Void, Error>()\n    setPublishers[key] = newSubject\n\n    return newSubject.eraseToAnyPublisher()\n  }\n\n  // MARK: - Remove\n\n  func remove(_ key: A) -> AnyPublisher<Void, Error> {\n    numberOfTimesRemoveCalled += 1\n    removeKey = key\n\n    return removeSubject.eraseToAnyPublisher()\n  }\n\n  // MARK: - Clear\n\n  var numberOfTimesCalledClear = 0\n  func clear() {\n    numberOfTimesCalledClear += 1\n  }\n\n  // MARK: - On Memory Warning\n  var numberOfTimesCalledOnMemoryWarning = 0\n  func onMemoryWarning() {\n    numberOfTimesCalledOnMemoryWarning += 1\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/Fakes/FetcherFake.swift",
    "content": "//\n//  FetcherFake.swift\n//\n//\n//  Created by Lisovyi, Ivan on 17.08.20.\n//\n\nimport Foundation\n\nimport Carlos\nimport Combine\n\nclass FetcherFake<A, B>: Fetcher {\n  typealias KeyType = A\n  typealias OutputType = B\n\n  var queueUsedForTheLastCall: UnsafeMutableRawPointer!\n\n  init() {}\n\n  var numberOfTimesCalledGet = 0\n  var didGetKey: KeyType?\n  var getSubject: PassthroughSubject<OutputType, Error>!\n  func get(_ key: KeyType) -> AnyPublisher<OutputType, Error> {\n    numberOfTimesCalledGet += 1\n\n    didGetKey = key\n\n    return getSubject.eraseToAnyPublisher()\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/FetcherValueTransformationTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nstruct FetcherValueTransformationsSharedExamplesContext {\n  static let FetcherToTest = \"fetcher\"\n  static let InternalFetcher = \"internalFetcher\"\n  static let Transformer = \"transformer\"\n}\n\nfinal class FetcherValueTransformationSharedExamplesConfiguration: QuickConfiguration {\n  override class func configure(_: Configuration) {\n    sharedExamples(\"a fetch closure with transformed values\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var fetcher: BasicFetcher<String, String>!\n      var internalFetcher: FetcherFake<String, Int>!\n      var transformer: OneWayTransformationBox<Int, String>!\n      var cancellables: Set<AnyCancellable>!\n\n      beforeEach {\n        cancellables = Set()\n\n        fetcher = sharedExampleContext()[FetcherValueTransformationsSharedExamplesContext.FetcherToTest] as? BasicFetcher<String, String>\n        internalFetcher = sharedExampleContext()[FetcherValueTransformationsSharedExamplesContext.InternalFetcher] as? FetcherFake<String, Int>\n        transformer = sharedExampleContext()[FetcherValueTransformationsSharedExamplesContext.Transformer] as? OneWayTransformationBox<Int, String>\n      }\n\n      context(\"when calling get\") {\n        let key = \"12\"\n        var successValue: String?\n        var failureValue: Error?\n        var getSubject: PassthroughSubject<Int, Error>!\n\n        beforeEach {\n          getSubject = PassthroughSubject()\n          internalFetcher.getSubject = getSubject\n\n          fetcher.get(key)\n            .sink(receiveCompletion: { completion in\n              if case let .failure(error) = completion {\n                failureValue = error\n              }\n            }, receiveValue: { successValue = $0 })\n            .store(in: &cancellables)\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalFetcher.numberOfTimesCalledGet).toEventually(equal(1))\n        }\n\n        it(\"should pass the right key\") {\n          expect(internalFetcher.didGetKey).toEventually(equal(key))\n        }\n\n        context(\"when the request succeeds\") {\n          context(\"when the value can be successfully transformed\") {\n            let value = 101\n\n            beforeEach {\n              getSubject.send(value)\n            }\n\n            it(\"should call the original success closure\") {\n              expect(successValue).toEventuallyNot(beNil())\n            }\n\n            it(\"should transform the value\") {\n              var expected: String!\n              transformer.transform(value)\n                .sink(receiveCompletion: { _ in }, receiveValue: { expected = $0 })\n                .store(in: &cancellables)\n              expect(successValue).toEventually(equal(expected))\n            }\n          }\n\n          context(\"when the value transformation returns nil\") {\n            let value = -101\n\n            beforeEach {\n              successValue = nil\n              getSubject.send(value)\n            }\n\n            it(\"should not call the original success closure\") {\n              expect(successValue).toEventually(beNil())\n            }\n\n            it(\"should call the original failure closure\") {\n              expect(failureValue).toEventuallyNot(beNil())\n            }\n\n            it(\"should fail with the right code\") {\n              expect(failureValue as? TestError).toEventually(equal(TestError.simpleError))\n            }\n          }\n        }\n\n        context(\"when the request fails\") {\n          let errorCode = TestError.anotherError\n\n          beforeEach {\n            getSubject.send(completion: .failure(errorCode))\n          }\n\n          it(\"should call the original failure closure\") {\n            expect(failureValue).toEventuallyNot(beNil())\n          }\n\n          it(\"should fail with the right code\") {\n            expect(failureValue as? TestError).toEventually(equal(errorCode))\n          }\n        }\n      }\n    }\n  }\n}\n\nfinal class FetcherValueTransformationTests: QuickSpec {\n  override func spec() {\n    var fetcher: BasicFetcher<String, String>!\n    var internalFetcher: FetcherFake<String, Int>!\n    var transformer: OneWayTransformationBox<Int, String>!\n    let forwardTransformationClosure: (Int) -> AnyPublisher<String, Error> = {\n      if $0 > 0 {\n        return Just(\"\\($0 + 1)\").setFailureType(to: Error.self).eraseToAnyPublisher()\n      }\n\n      return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n    }\n\n    describe(\"Value transformation using a transformer and a fetcher, with the instance function\") {\n      beforeEach {\n        internalFetcher = FetcherFake<String, Int>()\n        transformer = OneWayTransformationBox(transform: forwardTransformationClosure)\n        fetcher = internalFetcher.transformValues(transformer)\n      }\n\n      itBehavesLike(\"a fetch closure with transformed values\") {\n        [\n          FetcherValueTransformationsSharedExamplesContext.FetcherToTest: fetcher as Any,\n          FetcherValueTransformationsSharedExamplesContext.InternalFetcher: internalFetcher as Any,\n          FetcherValueTransformationsSharedExamplesContext.Transformer: transformer as Any\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/ImageTransformerTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\n#if !os(macOS)\n  import UIKit\n\n  final class ImageTransformerTests: QuickSpec {\n    override func spec() {\n      describe(\"Image transformer\") {\n        var transformer: ImageTransformer!\n        var error: Error!\n        let sampleData = Data(base64Encoded: base64EncodedImage, options: .ignoreUnknownCharacters)!\n\n        var cancellable: AnyCancellable?\n\n        beforeEach {\n          error = nil\n\n          transformer = ImageTransformer()\n        }\n\n        afterEach {\n          cancellable?.cancel()\n          cancellable = nil\n        }\n\n        context(\"when transforming NSData to UIImage\") {\n          var result: UIImage!\n\n          beforeEach {\n            result = nil\n          }\n\n          context(\"when the NSData is a valid image\") {\n            var imageSample: UIImage!\n\n            beforeEach {\n              imageSample = UIImage(data: sampleData)\n\n              cancellable = transformer.transform(imageSample.pngData()! as NSData)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should call the success closure\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should not call the error closure\") {\n              expect(error).toEventually(beNil())\n            }\n\n            it(\"should return the expected data\") {\n              expect(result?.pngData()).toEventually(equal(imageSample.pngData()))\n            }\n          }\n\n          context(\"when the NSData is not a valid image\") {\n            beforeEach {\n              cancellable = transformer.transform((\"test for an invalid image\".data(using: .utf8) as NSData?)!)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should not call the success closure\") {\n              expect(result).toEventually(beNil())\n            }\n\n            it(\"should call the error closure\") {\n              expect(error).toEventuallyNot(beNil())\n            }\n          }\n        }\n\n        context(\"when transforming UIImage to NSData\") {\n          var imageSample: UIImage!\n          var result: NSData!\n\n          beforeEach {\n            imageSample = UIImage(data: sampleData)\n\n            cancellable = transformer.inverseTransform(imageSample)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(e) = completion {\n                  error = e\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          it(\"should call the success closure\") {\n            expect(result).toEventuallyNot(beNil())\n          }\n\n          it(\"should not call the failure closure\") {\n            expect(error).toEventually(beNil())\n          }\n\n          it(\"should return the expected data\") {\n            expect(result).toEventually(equal(imageSample.pngData() as NSData?))\n          }\n        }\n      }\n    }\n  }\n#endif\n"
  },
  {
    "path": "Tests/CarlosTests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>en</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleSignature</key>\n\t<string>????</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "Tests/CarlosTests/JSONTransformerTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nfinal class JSONTransformerTests: QuickSpec {\n  override func spec() {\n    describe(\"JSONTransformer\") {\n      var transformer: JSONTransformer!\n\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        transformer = JSONTransformer()\n      }\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n      }\n\n      context(\"when transforming NSData to JSON\") {\n        var result: AnyObject!\n        var error: Error!\n\n        afterEach {\n          result = nil\n          error = nil\n        }\n\n        context(\"when the NSData is a valid JSON\") {\n          context(\"when it's an array\") {\n            let testObject = [\n              \"list\",\n              \"of\",\n              \"strings\"\n            ]\n\n            beforeEach {\n              let data = try! JSONSerialization.data(withJSONObject: testObject, options: [])\n              cancellable = transformer.transform(data as NSData)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should call the success closure\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should not call the failure closure\") {\n              expect(error).toEventually(beNil())\n            }\n\n            it(\"should return an array\") {\n              expect(result as? [String]).toEventuallyNot(beNil())\n            }\n\n            it(\"should contain the right number of items\") {\n              expect((result as? [String])?.count).toEventually(equal(testObject.count))\n            }\n\n            it(\"should contain the right objects\") {\n              expect(result as? [String]).toEventually(equal(testObject))\n            }\n          }\n\n          context(\"when it's a dictionary\") {\n            let testObject: [String: Any] = [\n              \"id\": 2,\n              \"value\": \"test\",\n              \"anotherKey\": [\n                \"1\",\n                \"2\",\n                \"3\"\n              ]\n            ]\n\n            beforeEach {\n              let data = try! JSONSerialization.data(withJSONObject: testObject, options: [])\n              cancellable = transformer.transform(data as NSData)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: {\n                  result = $0\n                })\n            }\n\n            it(\"should call the success closure\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should not call the failure closure\") {\n              expect(error).toEventually(beNil())\n            }\n\n            it(\"should return a dictionary\") {\n              expect(result as? [String: AnyObject]).toEventuallyNot(beNil())\n            }\n\n            it(\"should contain the right number of items\") {\n              expect((result as? [String: AnyObject])?.keys.count).toEventually(equal(testObject.keys.count))\n            }\n          }\n        }\n\n        context(\"when the NSData is not a valid JSON\") {\n          beforeEach {\n            cancellable = transformer.transform((\"test for an invalid JSON\".data(using: .utf8) as NSData?)!)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(e) = completion {\n                  error = e\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          it(\"should not call the success closure\") {\n            expect(result).toEventually(beNil())\n          }\n\n          it(\"should call the failure closure\") {\n            expect(error).toEventuallyNot(beNil())\n          }\n        }\n      }\n\n      context(\"when transforming JSON to NSData\") {\n        var result: NSData!\n        var error: Error!\n\n        context(\"when the JSON is valid\") {\n          var expectedResult: NSData!\n\n          context(\"when it's an array\") {\n            let testObject = [\n              \"1\", \"two\", \"3\", \"some other thing\"\n            ]\n\n            beforeEach {\n              expectedResult = try! JSONSerialization.data(withJSONObject: testObject, options: []) as NSData\n              cancellable = transformer.inverseTransform(testObject as AnyObject)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should call the success closure\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should not call the failure closure\") {\n              expect(error).toEventually(beNil())\n            }\n\n            it(\"should pass the expected result\") {\n              expect(result).toEventually(equal(expectedResult))\n            }\n          }\n\n          context(\"when it's a dictionary\") {\n            let testObject: [String: Any] = [\n              \"id\": 1,\n              \"key\": \"value\",\n              \"anotherKey\": [\n                1, 2, 3, 4, 5\n              ]\n            ]\n\n            beforeEach {\n              expectedResult = try! JSONSerialization.data(withJSONObject: testObject, options: []) as NSData\n              cancellable = transformer.inverseTransform(testObject as AnyObject)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should call the success closure\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should not call the failure closure\") {\n              expect(error).toEventually(beNil())\n            }\n\n            it(\"should pass the expected result\") {\n              expect(result).toEventually(equal(expectedResult))\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/KeyTransformationTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nstruct KeyTransformationsSharedExamplesContext {\n  static let CacheToTest = \"cache\"\n  static let InternalCache = \"internalCache\"\n  static let Transformer = \"transformer\"\n}\n\nfinal class KeyTransformationSharedExamplesConfiguration: QuickConfiguration {\n  override class func configure(_: Configuration) {\n    sharedExamples(\"a fetch closure with transformed keys\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache: BasicCache<Int, Int>!\n      var internalCache: CacheLevelFake<String, Int>!\n      var transformer: OneWayTransformationBox<Int, String>!\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        cache = sharedExampleContext()[KeyTransformationsSharedExamplesContext.CacheToTest] as? BasicCache<Int, Int>\n        internalCache = sharedExampleContext()[KeyTransformationsSharedExamplesContext.InternalCache] as? CacheLevelFake<String, Int>\n        transformer = sharedExampleContext()[KeyTransformationsSharedExamplesContext.Transformer] as? OneWayTransformationBox<Int, String>\n      }\n\n      context(\"when calling get\") {\n        var successValue: Int?\n        var failureValue: Error?\n        var fakeRequest: PassthroughSubject<Int, Error>!\n        var canceled: Bool!\n\n        beforeEach {\n          canceled = false\n          failureValue = nil\n          successValue = nil\n        }\n\n        afterEach {\n          cancellable?.cancel()\n          cancellable = nil\n        }\n\n        context(\"when the transformation closure returns a value\") {\n          let key = 12\n\n          beforeEach {\n            fakeRequest = PassthroughSubject()\n            internalCache.getSubject = fakeRequest\n\n            cancellable = cache.get(key)\n              .handleEvents(receiveCancel: { canceled = true })\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  failureValue = error\n                }\n              }, receiveValue: { successValue = $0 })\n          }\n\n          it(\"should forward the call to the internal cache\") {\n            expect(internalCache.numberOfTimesCalledGet).toEventually(equal(1))\n          }\n\n          it(\"should transform the key first\") {\n            var expected: String!\n            _ = transformer.transform(key)\n              .sink(receiveCompletion: { _ in }, receiveValue: { expected = $0 })\n\n            expect(internalCache.didGetKey).toEventually(equal(expected))\n          }\n\n          context(\"when the request succeeds\") {\n            let value = 101\n\n            beforeEach {\n              fakeRequest.send(value)\n            }\n\n            it(\"should call the original success closure\") {\n              expect(successValue).toEventually(equal(value))\n            }\n\n            it(\"should not call the original failure closure\") {\n              expect(failureValue).toEventually(beNil())\n            }\n\n            it(\"should not call the original cancel closure\") {\n              expect(canceled).toEventually(beFalse())\n            }\n          }\n\n          context(\"when the request is canceled\") {\n            beforeEach {\n              cancellable?.cancel()\n            }\n\n            it(\"should not call the original failure closure\") {\n              expect(failureValue).toEventually(beNil())\n            }\n\n            it(\"should not call the original success closure\") {\n              expect(successValue).toEventually(beNil())\n            }\n\n            it(\"should call the original cancel closure\") {\n              expect(canceled).toEventually(beTrue())\n            }\n          }\n\n          context(\"when the request fails\") {\n            let errorCode = TestError.anotherError\n\n            beforeEach {\n              fakeRequest.send(completion: .failure(errorCode))\n            }\n\n            it(\"should call the original failure closure\") {\n              expect(failureValue as? TestError).toEventually(equal(errorCode))\n            }\n\n            it(\"should not call the original success closure\") {\n              expect(successValue).toEventually(beNil())\n            }\n\n            it(\"should not call the original cancel closure\") {\n              expect(canceled).toEventually(beFalse())\n            }\n          }\n        }\n\n        context(\"when the transformation closure returns nil\") {\n          let key = -12\n\n          beforeEach {\n            fakeRequest = PassthroughSubject()\n            internalCache.getSubject = fakeRequest\n\n            _ = cache.get(key)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  failureValue = error\n                }\n              }, receiveValue: { successValue = $0 })\n          }\n\n          it(\"should not forward the call to the internal cache\") {\n            expect(internalCache.numberOfTimesCalledGet).toEventually(equal(0))\n          }\n\n          it(\"should not call the original success closure\") {\n            expect(successValue).toEventually(beNil())\n          }\n\n          it(\"should not call the original cancel closure\") {\n            expect(canceled).toEventually(beFalse())\n          }\n\n          it(\"should call the original failure closure\") {\n            expect(failureValue).toEventuallyNot(beNil())\n          }\n\n          it(\"should pass the right error code\") {\n            expect(failureValue as? TestError).toEventually(equal(TestError.simpleError))\n          }\n        }\n      }\n    }\n\n    sharedExamples(\"a cache with transformed keys\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache: BasicCache<Int, Int>!\n      var internalCache: CacheLevelFake<String, Int>!\n      var transformer: OneWayTransformationBox<Int, String>!\n\n      beforeEach {\n        cache = sharedExampleContext()[KeyTransformationsSharedExamplesContext.CacheToTest] as? BasicCache<Int, Int>\n        internalCache = sharedExampleContext()[KeyTransformationsSharedExamplesContext.InternalCache] as? CacheLevelFake<String, Int>\n        transformer = sharedExampleContext()[KeyTransformationsSharedExamplesContext.Transformer] as? OneWayTransformationBox<Int, String>\n      }\n\n      itBehavesLike(\"a fetch closure with transformed keys\") {\n        [\n          KeyTransformationsSharedExamplesContext.CacheToTest: cache as Any,\n          KeyTransformationsSharedExamplesContext.InternalCache: internalCache as Any,\n          KeyTransformationsSharedExamplesContext.Transformer: transformer as Any\n        ]\n      }\n\n      context(\"when calling set\") {\n        var setSucceeded: Bool!\n        var setError: Error?\n        var cancellable: AnyCancellable?\n\n        beforeEach {\n          setSucceeded = false\n          setError = nil\n        }\n\n        afterEach {\n          cancellable?.cancel()\n          cancellable = nil\n        }\n\n        context(\"when the transformation closure returns a value\") {\n          let key = 10\n          let value = 222\n\n          beforeEach {\n            cancellable = cache.set(value, forKey: key)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  setError = error\n                }\n              }, receiveValue: { setSucceeded = true })\n          }\n\n          it(\"should forward the call to the internal cache\") {\n            expect(internalCache.numberOfTimesCalledSet).toEventually(equal(1))\n          }\n\n          it(\"should transform the key first\") {\n            var expected: String!\n            _ = transformer.transform(key)\n              .sink(receiveCompletion: { _ in }, receiveValue: { expected = $0 })\n            expect(internalCache.didSetKey).toEventually(equal(expected))\n          }\n\n          it(\"should pass the right value\") {\n            expect(internalCache.didSetValue).toEventually(equal(value))\n          }\n\n          context(\"when the set succeeds\") {\n            beforeEach {\n              internalCache.setPublishers[\"\\(key + 1)\"]?.send()\n            }\n\n            it(\"should succeed\") {\n              expect(setSucceeded).toEventually(beTrue())\n            }\n          }\n\n          context(\"when the set fails\") {\n            beforeEach {\n              internalCache.setPublishers[\"\\(key + 1)\"]?.send(completion: .failure(TestError.anotherError))\n            }\n\n            it(\"should fail\") {\n              expect(setError).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the error through\") {\n              expect(setError as? TestError).toEventually(equal(TestError.anotherError))\n            }\n          }\n        }\n\n        context(\"when the transformation closure fails\") {\n          let key = -10\n          let value = 222\n\n          beforeEach {\n            cancellable = cache.set(value, forKey: key)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  setError = error\n                }\n              }, receiveValue: { setSucceeded = true })\n          }\n\n          it(\"should not forward the call to the internal cache\") {\n            expect(internalCache.numberOfTimesCalledSet).toEventually(equal(0))\n          }\n\n          it(\"should fail\") {\n            expect(setError).toEventuallyNot(beNil())\n          }\n\n          it(\"should pass the transformation error\") {\n            expect(setError as? TestError).toEventually(equal(TestError.simpleError))\n          }\n        }\n      }\n\n      context(\"when calling clear\") {\n        beforeEach {\n          cache.clear()\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledClear).toEventually(equal(1))\n        }\n      }\n\n      context(\"when calling onMemoryWarning\") {\n        beforeEach {\n          cache.onMemoryWarning()\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledOnMemoryWarning).toEventually(equal(1))\n        }\n      }\n    }\n  }\n}\n\nfinal class KeyTransformationTests: QuickSpec {\n  override func spec() {\n    var cache: BasicCache<Int, Int>!\n    var internalCache: CacheLevelFake<String, Int>!\n    var transformer: OneWayTransformationBox<Int, String>!\n    let transformationClosure: (Int) -> AnyPublisher<String, Error> = {\n      if $0 > 0 {\n        return Just(\"\\($0 + 1)\").setFailureType(to: Error.self).eraseToAnyPublisher()\n      }\n\n      return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n    }\n\n    describe(\"Key transformation using a transformer and a cache, with the instance function\") {\n      beforeEach {\n        internalCache = CacheLevelFake<String, Int>()\n        transformer = OneWayTransformationBox(transform: transformationClosure)\n        cache = internalCache.transformKeys(transformer)\n      }\n\n      itBehavesLike(\"a cache with transformed keys\") {\n        [\n          KeyTransformationsSharedExamplesContext.CacheToTest: cache as Any,\n          KeyTransformationsSharedExamplesContext.InternalCache: internalCache as Any,\n          KeyTransformationsSharedExamplesContext.Transformer: transformer as Any\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/MKDistanceFormatterTransformerTests.swift",
    "content": "import Foundation\nimport MapKit\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nfinal class MKDistanceFormatterTransformerTests: QuickSpec {\n  override func spec() {\n    describe(\"MKDistanceFormatter\") {\n      var formatter: MKDistanceFormatter!\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        formatter = MKDistanceFormatter()\n        formatter.units = .metric\n      }\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n      }\n\n      context(\"when used as a transformer\") {\n        context(\"when transforming\") {\n          let originDistance: CLLocationDistance = 10293.12\n          var resultString: String!\n\n          beforeEach {\n            cancellable = formatter.transform(originDistance)\n              .sink(receiveCompletion: { _ in }, receiveValue: { resultString = $0 })\n          }\n\n          it(\"should return the expected string\") {\n            expect(resultString).toEventually(equal(\"10 km\"))\n          }\n        }\n\n        context(\"when inverse transforming\") {\n          let originString = \"10 km\"\n          var resultDistance: CLLocationDistance!\n\n          beforeEach {\n            cancellable = formatter.inverseTransform(originString)\n              .sink(receiveCompletion: { _ in }, receiveValue: { resultDistance = $0 })\n          }\n\n          it(\"should return the expected number\") {\n            expect(resultDistance).toEventually(equal(10000.0))\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/MemoryCacheLevelTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nfinal class MemoryCacheLevelTests: QuickSpec {\n  override func spec() {\n    describe(\"Memory cache level\") {\n      var cache: MemoryCacheLevel<String, NSString>!\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        cache = MemoryCacheLevel(capacity: 100)\n      }\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n\n        cache = nil\n      }\n\n      context(\"when calling get\") {\n        var result: NSString?\n        let key = \"test-key\"\n        var failureSentinel: Bool?\n\n        beforeEach {\n          cancellable = cache.get(key).sink(receiveCompletion: { completion in\n            if case .failure = completion {\n              failureSentinel = true\n            }\n          }, receiveValue: { result = $0 })\n        }\n\n        afterEach {\n          failureSentinel = nil\n          result = nil\n        }\n\n        it(\"should fail\") {\n          expect(failureSentinel).toEventually(beTrue())\n        }\n\n        it(\"should not succeed\") {\n          expect(result).toEventually(beNil())\n        }\n\n        context(\"when setting a value for that key\") {\n          let value = \"value to set\"\n\n          beforeEach {\n            failureSentinel = nil\n\n            _ = cache.set(value as NSString, forKey: key)\n          }\n\n          context(\"when getting the value for another key\") {\n            let anotherKey = \"test_key_2\"\n\n            beforeEach {\n              cancellable = cache.get(anotherKey).sink(receiveCompletion: { completion in\n                if case .failure = completion {\n                  failureSentinel = true\n                }\n              }, receiveValue: { result = $0 })\n            }\n\n            it(\"should not succeed\") {\n              expect(result).toEventually(beNil())\n            }\n\n            it(\"should fail\") {\n              expect(failureSentinel).toEventuallyNot(beNil())\n            }\n          }\n        }\n      }\n\n      context(\"when calling set\") {\n        let key = \"key\"\n        let value = \"value\"\n        var result: NSString?\n        var failureSentinel: Bool?\n        var didWrite: Bool!\n\n        beforeEach {\n          cancellable = cache.set(value as NSString, forKey: key)\n            .sink(receiveCompletion: { _ in }, receiveValue: { didWrite = true })\n        }\n\n        afterEach {\n          didWrite = false\n          result = nil\n          failureSentinel = nil\n        }\n\n        it(\"should immediately succeed the future\") {\n          expect(didWrite).toEventually(beTrue())\n        }\n\n        context(\"when calling get\") {\n          beforeEach {\n            cancellable = cache.get(key).sink(receiveCompletion: { completion in\n              if case .failure = completion {\n                failureSentinel = true\n              }\n            }, receiveValue: { result = $0 })\n          }\n\n          it(\"should succeed\") {\n            expect(result).toEventuallyNot(beNil())\n          }\n\n          it(\"should return the right value\") {\n            expect(result).toEventually(equal(value as NSString))\n          }\n\n          it(\"should not fail\") {\n            expect(failureSentinel).toEventually(beNil())\n          }\n        }\n\n        context(\"when setting a different value for the same key\") {\n          let newValue = \"another value\"\n\n          it(\"should succeed with the overwritten value\") {\n            cancellable =\n              cache.set(newValue as NSString, forKey: key)\n              .flatMap { _ in cache.get(key) }\n              .sink(\n                receiveCompletion: { completion in\n                  if case .failure = completion {\n                    failureSentinel = true\n                  }\n                },\n                receiveValue: {\n                  result = $0\n                }\n              )\n\n            expect(result).toEventually(equal(newValue as NSString))\n          }\n        }\n\n        context(\"when setting more than its capacity\") {\n          let otherKeys = [\"key1\", \"key2\", \"key3\"]\n          let otherValues = [\n            \"long string value\",\n            \"even longer string value but should still fit the cache\",\n            \"longest string value that should fill the cache capacity and force it to evict some values and we will hope it happends\"\n          ]\n\n          beforeEach {\n            for (key, value) in zip(otherKeys, otherValues) {\n              _ = cache.set(value as NSString, forKey: key)\n            }\n          }\n\n          it(\"should evict at least one value\") {\n            var evictedAtLeastOne = false\n\n            for key in otherKeys {\n              cancellable = cache.get(key).sink(receiveCompletion: { completion in\n                if case .failure = completion {\n                  evictedAtLeastOne = true\n                }\n              }, receiveValue: { _ in })\n            }\n\n            expect(evictedAtLeastOne).toEventually(beTrue(), timeout: .seconds(5))\n          }\n        }\n\n        context(\"when calling clear\") {\n          beforeEach {\n            result = nil\n\n            cache.clear()\n          }\n\n          context(\"when calling get\") {\n            beforeEach {\n              cancellable = cache.get(key).sink(receiveCompletion: { completion in\n                if case .failure = completion {\n                  failureSentinel = true\n                }\n              }, receiveValue: { result = $0 })\n            }\n\n            it(\"should fail\") {\n              expect(failureSentinel).toEventually(beTrue())\n            }\n\n            it(\"should not succeed\") {\n              expect(result).toEventually(beNil())\n            }\n          }\n        }\n\n        context(\"when calling onMemoryWarning\") {\n          beforeEach {\n            result = nil\n\n            cache.onMemoryWarning()\n          }\n\n          context(\"when calling get\") {\n            beforeEach {\n              beforeEach {\n                cancellable = cache.get(key).sink(receiveCompletion: { completion in\n                  if case .failure = completion {\n                    failureSentinel = true\n                  }\n                }, receiveValue: { result = $0 })\n              }\n\n              it(\"should fail\") {\n                expect(failureSentinel).toEventually(beTrue())\n              }\n\n              it(\"should not succeed\") {\n                expect(result).toEventually(beNil())\n              }\n            }\n          }\n        }\n      }\n\n      context(\"when calling remove\") {\n        var result = false\n        let key = \"test-key\"\n\n        beforeEach {\n          result = false\n        }\n\n        it(\"shall remove object from cache for given key\") {\n          cancellable = cache.set(\"value\", forKey: key)\n            .flatMap { cache.remove(key) }\n            .sink(\n              receiveCompletion: { _ in },\n              receiveValue: { _ in\n                result = true\n              }\n            )\n\n          expect(result).toEventually(beTrue())\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/MemoryWarningNotificationTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\n\n#if !os(macOS)\n  import UIKit\n\n  class MemoryWarningNotificationTests: QuickSpec {\n    override func spec() {\n      describe(\"Memory warning listener\") {\n        var cache: CacheLevelFake<String, Int>!\n        var token: NSObjectProtocol!\n\n        beforeEach {\n          cache = CacheLevelFake<String, Int>()\n        }\n\n        context(\"when listening to memory warnings\") {\n          beforeEach {\n            token = cache.listenToMemoryWarnings()\n          }\n\n          context(\"when posting memory warnings\") {\n            beforeEach {\n              NotificationCenter.default.post(name: UIApplication.didReceiveMemoryWarningNotification, object: nil)\n            }\n\n            it(\"should call onMemoryWarning on the cache\") {\n              expect(cache.numberOfTimesCalledOnMemoryWarning) == 1\n            }\n\n            it(\"should not directly call clear\") {\n              expect(cache.numberOfTimesCalledClear) == 0\n            }\n          }\n\n          context(\"when unsubscribing later\") {\n            beforeEach {\n              unsubscribeToMemoryWarnings(token)\n            }\n\n            context(\"when posting memory warnings\") {\n              beforeEach {\n                NotificationCenter.default.post(name: UIApplication.didReceiveMemoryWarningNotification, object: nil)\n              }\n\n              it(\"should not call onMemoryWarning on the cache\") {\n                expect(cache.numberOfTimesCalledOnMemoryWarning) == 0\n              }\n\n              it(\"should not call clear\") {\n                expect(cache.numberOfTimesCalledClear) == 0\n              }\n            }\n          }\n        }\n\n        context(\"by default, posting memory warning notifications\") {\n          beforeEach {\n            NotificationCenter.default.post(name: UIApplication.didReceiveMemoryWarningNotification, object: nil)\n          }\n\n          it(\"should not call clear\") {\n            expect(cache.numberOfTimesCalledClear) == 0\n          }\n\n          it(\"should not call onMemoryWarning\") {\n            expect(cache.numberOfTimesCalledOnMemoryWarning) == 0\n          }\n        }\n      }\n    }\n  }\n#endif\n"
  },
  {
    "path": "Tests/CarlosTests/NSDateFormatterTransformerTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nfinal class NSDateFormatterTransformerTests: QuickSpec {\n  override func spec() {\n    describe(\"DateFormatter\") {\n      var formatter: DateFormatter!\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        formatter = DateFormatter()\n        formatter.dateFormat = \"YYYY-MM-dd\"\n      }\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n      }\n\n      context(\"when used as a transformer\") {\n        var error: Error?\n\n        afterEach {\n          error = nil\n        }\n\n        context(\"when transforming\") {\n          let originDate = Date(timeIntervalSince1970: 1_436_644_623)\n          var result: String!\n\n          beforeEach {\n            cancellable = formatter.transform(originDate)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(e) = completion {\n                  error = e\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          afterEach {\n            result = nil\n          }\n\n          it(\"should call the success closure\") {\n            expect(result).toEventuallyNot(beNil())\n          }\n\n          it(\"should not call the failure closure\") {\n            expect(error).toEventually(beNil())\n          }\n\n          it(\"should return the expected string\") {\n            expect(result).toEventually(equal(\"2015-07-11\"))\n          }\n        }\n\n        context(\"when inverse transforming\") {\n          var result: Date!\n          var formattedResult: String?\n\n          afterEach {\n            result = nil\n            formattedResult = nil\n          }\n\n          context(\"when the string is valid\") {\n            let originString = \"2015-07-11\"\n\n            beforeEach {\n              cancellable = formatter.inverseTransform(originString)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: {\n                  result = $0\n                  formattedResult = formatter.string(from: $0)\n                })\n            }\n\n            it(\"should call the success closure\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should not call the failure closure\") {\n              expect(error).toEventually(beNil())\n            }\n\n            it(\"should return the expected date\") {\n              expect(formattedResult).toEventually(equal(originString))\n            }\n          }\n\n          context(\"when the string is invalid\") {\n            beforeEach {\n              cancellable = formatter.inverseTransform(\"this is not a valid date\")\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should not call the success closure\") {\n              expect(result).toEventually(beNil())\n            }\n\n            it(\"should call the error closure\") {\n              expect(error).toEventuallyNot(beNil())\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/NSNumberFormatterTransformerTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nfinal class NSNumberFormatterTransformerTests: QuickSpec {\n  override func spec() {\n    describe(\"NumberFormatter\") {\n      var formatter: NumberFormatter!\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        formatter = NumberFormatter()\n        formatter.locale = Locale(identifier: \"us_US\")\n        formatter.numberStyle = .decimal\n        formatter.maximumFractionDigits = 5\n        formatter.minimumFractionDigits = 3\n      }\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n      }\n\n      context(\"when used as a transformer\") {\n        var error: Error!\n\n        context(\"when transforming\") {\n          var result: String!\n\n          afterEach {\n            result = nil\n            error = nil\n          }\n\n          context(\"when the number contains a valid number of fraction digits\") {\n            let originNumber = 10.1203\n\n            beforeEach {\n              cancellable = formatter.transform(NSNumber(value: originNumber))\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should call the success closure\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should not call the failure closure\") {\n              expect(error).toEventually(beNil())\n            }\n\n            it(\"should return the expected string\") {\n              expect(result).toEventually(equal(\"10.1203\"))\n            }\n          }\n\n          context(\"when the number contains less fractions digits\") {\n            let originNumber = 10.12\n\n            beforeEach {\n              cancellable = formatter.transform(NSNumber(value: originNumber))\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should call the success closure\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should not call the failure closure\") {\n              expect(error).toEventually(beNil())\n            }\n\n            it(\"should return the expected string\") {\n              expect(result).toEventually(equal(\"10.120\"))\n            }\n          }\n\n          context(\"when the number contains more fraction digits\") {\n            let originNumber = 10.120312\n\n            beforeEach {\n              cancellable = formatter.transform(NSNumber(value: originNumber))\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            it(\"should call the success closure\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should not call the failure closure\") {\n              expect(error).toEventually(beNil())\n            }\n\n            it(\"should return the expected string\") {\n              expect(result).toEventually(equal(\"10.12031\"))\n            }\n          }\n        }\n\n        context(\"when inverse transforming\") {\n          var result: NSNumber!\n\n          context(\"when the string is valid\") {\n            let originString = \"10.1203\"\n\n            beforeEach {\n              cancellable = formatter.inverseTransform(originString)\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                  }\n                }, receiveValue: {\n                  result = $0\n                })\n            }\n\n            afterEach {\n              result = nil\n              error = nil\n            }\n\n            it(\"should call the success closure\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should not call the failure closure\") {\n              expect(error).toEventually(beNil())\n            }\n\n            it(\"should return the expected number\") {\n              expect(result.map { \"\\($0)\" }).toEventually(equal(originString))\n            }\n          }\n\n          context(\"when the string is invalid\") {\n            beforeEach {\n              cancellable = formatter.inverseTransform(\"not a number!\")\n                .sink(receiveCompletion: { completion in\n                  if case let .failure(e) = completion {\n                    error = e\n                    result = nil\n                  }\n                }, receiveValue: { result = $0 })\n            }\n\n            afterEach {\n              result = nil\n              error = nil\n            }\n\n            it(\"should not call the success closure\") {\n              expect(result).toEventually(beNil())\n            }\n\n            it(\"should call the error closure\") {\n              expect(error).toEventuallyNot(beNil())\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/NSUserDefaultsCacheLevelTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nfinal class NSUserDefaultsCacheLevelTests: QuickSpec {\n  override func spec() {\n    describe(\"User defaults cache level\") {\n      var cache: NSUserDefaultsCacheLevel<String, NSString>!\n      var secondCache: NSUserDefaultsCacheLevel<String, NSString>!\n      var standardCache: UserDefaults!\n      var cancellables: Set<AnyCancellable>!\n\n      beforeEach {\n        cancellables = Set<AnyCancellable>()\n        standardCache = UserDefaults.standard\n        cache = NSUserDefaultsCacheLevel(name: \"tests\")\n        secondCache = NSUserDefaultsCacheLevel(name: \"fallback\")\n      }\n\n      afterEach {\n        cancellables = nil\n      }\n\n      afterSuite {\n        cache.clear()\n        secondCache.clear()\n      }\n\n      context(\"when calling get\") {\n        var result: NSString?\n        let key = \"test-key\"\n        var failureSentinel: Bool?\n\n        beforeEach {\n          cache.get(key)\n            .sink(receiveCompletion: { completion in\n              if case .failure = completion {\n                failureSentinel = true\n              }\n            }, receiveValue: {\n              result = $0\n            })\n            .store(in: &cancellables)\n        }\n\n        afterEach {\n          result = nil\n          failureSentinel = nil\n        }\n\n        it(\"should fail\") {\n          expect(failureSentinel).toEventually(beTrue())\n        }\n\n        it(\"should not succeed\") {\n          expect(result).toEventually(beNil())\n        }\n\n        context(\"when setting a value for that key\") {\n          context(\"when getting the value for another key\") {\n            let value = \"value to set\"\n            let anotherKey = \"test_key_2\"\n\n            beforeEach {\n              cache.set(value as NSString, forKey: key)\n                .flatMap {\n                  cache.get(anotherKey)\n                }\n                .sink(receiveCompletion: { completion in\n                  if case .failure = completion {\n                    result = nil\n                    failureSentinel = true\n                  }\n                }, receiveValue: {\n                  result = $0\n                })\n                .store(in: &cancellables)\n            }\n\n            it(\"should not succeed\") {\n              expect(result).toEventually(beNil())\n            }\n\n            it(\"should fail\") {\n              expect(failureSentinel).toEventuallyNot(beNil())\n            }\n          }\n        }\n      }\n\n      context(\"when calling set\") {\n        let key = \"key\"\n        let value = \"value\"\n        var result: NSString?\n        var failureSentinel: Bool?\n        var didWrite: Bool!\n\n        beforeEach {\n          didWrite = false\n\n          cache.set(value as NSString, forKey: key)\n            .sink(receiveCompletion: { _ in }, receiveValue: { didWrite = true })\n            .store(in: &cancellables)\n\n          secondCache.set(value as NSString, forKey: key)\n            .sink(receiveCompletion: { _ in }, receiveValue: {})\n            .store(in: &cancellables)\n\n          standardCache.set(value, forKey: key)\n        }\n\n        it(\"should eventually succeed the set future\") {\n          expect(didWrite).toEventually(beTrue())\n        }\n\n        context(\"when calling get\") {\n          beforeEach {\n            cache.get(key)\n              .sink(receiveCompletion: { completion in\n                if case .failure = completion {\n                  failureSentinel = true\n                }\n              }, receiveValue: { result = $0 })\n              .store(in: &cancellables)\n          }\n\n          it(\"should succeed\") {\n            expect(result).toEventuallyNot(beNil())\n          }\n\n          it(\"should return the right value\") {\n            expect(result).toEventually(equal(value as NSString))\n          }\n\n          it(\"should not fail\") {\n            expect(failureSentinel).toEventually(beNil())\n          }\n        }\n\n        context(\"when setting a different value for the same key\") {\n          let newValue = \"another value\"\n\n          context(\"when calling get\") {\n            beforeEach {\n              cache.set(newValue as NSString, forKey: key)\n                .flatMap {\n                  cache.get(key)\n                }\n                .sink(receiveCompletion: { completion in\n                  if case .failure = completion {\n                    failureSentinel = true\n                  }\n                }, receiveValue: {\n                  result = $0\n                })\n                .store(in: &cancellables)\n            }\n\n            it(\"should succeed with the overwritten value\") {\n              expect(result).toEventually(equal(newValue as NSString), timeout: .seconds(5))\n            }\n          }\n        }\n\n        context(\"when calling remove\") {\n          var result = false\n          let key = \"test-key\"\n\n          beforeEach {\n            result = false\n\n            cache.clear()\n          }\n\n          it(\"shall remove object from cache for given key\") {\n            cache.set(\"value\", forKey: key)\n              .flatMap { cache.remove(key) }\n              .sink(\n                receiveCompletion: { _ in },\n                receiveValue: { _ in\n                  result = true\n                }\n              )\n              .store(in: &cancellables)\n\n            expect(result).toEventually(beTrue())\n          }\n        }\n\n        context(\"when calling clear\") {\n          beforeEach {\n            failureSentinel = nil\n            result = nil\n\n            cache.clear()\n          }\n\n          context(\"when calling get\") {\n            beforeEach {\n              cache.get(key)\n                .sink(receiveCompletion: { completion in\n                  if case .failure = completion {\n                    failureSentinel = true\n                  }\n                }, receiveValue: { result = $0 })\n                .store(in: &cancellables)\n            }\n\n            it(\"should fail\") {\n              expect(failureSentinel).toEventually(beTrue())\n            }\n\n            it(\"should not succeed\") {\n              expect(result).toEventually(beNil())\n            }\n          }\n\n          context(\"when calling get on the other cache\") {\n            beforeEach {\n              secondCache.get(key)\n                .sink(receiveCompletion: { completion in\n                  if case .failure = completion {\n                    failureSentinel = true\n                  }\n                }, receiveValue: { result = $0 })\n                .store(in: &cancellables)\n            }\n\n            it(\"should not fail\") {\n              expect(failureSentinel).toEventually(beNil())\n            }\n\n            it(\"should succeed\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should return the right value\") {\n              expect(result).toEventually(equal(value as NSString))\n            }\n          }\n\n          context(\"when calling get on the standard user defaults\") {\n            beforeEach {\n              result = standardCache.object(forKey: key) as? NSString\n            }\n\n            it(\"should succeed\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should return the right value\") {\n              expect(result).toEventually(equal(value as NSString))\n            }\n          }\n        }\n\n        context(\"when calling onMemoryWarning\") {\n          beforeEach {\n            result = nil\n\n            cache.onMemoryWarning()\n          }\n\n          context(\"when calling get\") {\n            beforeEach {\n              beforeEach {\n                cache.get(key)\n                  .sink(receiveCompletion: { completion in\n                    if case .failure = completion {\n                      failureSentinel = true\n                    }\n                  }, receiveValue: { result = $0 })\n                  .store(in: &cancellables)\n              }\n\n              it(\"should not fail\") {\n                expect(failureSentinel).toEventually(beNil())\n              }\n\n              it(\"should succeed\") {\n                expect(result).toEventuallyNot(beNil())\n              }\n\n              it(\"should return the right value\") {\n                expect(result).toEventually(equal(value as NSString))\n              }\n            }\n          }\n\n          context(\"when calling get on the other cache\") {\n            beforeEach {\n              secondCache.get(key)\n                .sink(receiveCompletion: { completion in\n                  if case .failure = completion {\n                    failureSentinel = true\n                  }\n                }, receiveValue: { result = $0 })\n                .store(in: &cancellables)\n            }\n\n            it(\"should not fail\") {\n              expect(failureSentinel).toEventually(beNil())\n            }\n\n            it(\"should succeed\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should return the right value\") {\n              expect(result).toEventually(equal(value as NSString))\n            }\n          }\n\n          context(\"when calling get on the standard user defaults\") {\n            beforeEach {\n              result = standardCache.object(forKey: key) as? NSString\n            }\n\n            it(\"should succeed\") {\n              expect(result).toEventuallyNot(beNil())\n            }\n\n            it(\"should return the right value\") {\n              expect(result).toEventually(equal(value as NSString))\n            }\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/NetworkFetcherTests.swift",
    "content": "//\n//  NetworkFetcherTests.swift\n//  Carlos\n//\n//  Created by Esad Hajdarevic on 30/07/15.\n//  Copyright (c) 2015 WeltN24. All rights reserved.\n//\n\nimport Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nfinal class NetworkFetcherTests: QuickSpec {\n  override func spec() {\n    describe(\"NetworkFetcher\") {\n      var sut: NetworkFetcher!\n      var cancellables: Set<AnyCancellable>!\n\n      beforeEach {\n        cancellables = Set<AnyCancellable>()\n        sut = NetworkFetcher()\n      }\n\n      afterEach {\n        cancellables = nil\n      }\n\n      context(\"simultaneous requests\") {\n        var finished = 0\n        let simultaneousRequests = 3\n\n        beforeEach {\n          let url = URL(string: \"http://www.google.com/images/logos/google_logo_41.png\")!\n          let lockQueue = DispatchQueue(label: \"com.carlos.test\")\n\n          for _ in 0..<simultaneousRequests {\n            sut.get(url).sink(receiveCompletion: { _ in }, receiveValue: { _ in\n              lockQueue.sync {\n                finished += 1\n              }\n            }).store(in: &cancellables)\n          }\n        }\n\n        it(\"should complete all requests\") {\n          expect(finished).toEventually(equal(simultaneousRequests), timeout: .seconds(10))\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/NormalizationTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nstruct NormalizedCacheSharedExamplesContext {\n  static let CacheToTest = \"normalizedCache\"\n  static let OriginalCache = \"originalCache\"\n}\n\nfinal class NormalizationSharedExamplesConfiguration: QuickConfiguration {\n  override class func configure(_: Configuration) {\n    sharedExamples(\"no-op if the original cache is a BasicCache\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cacheToTest: BasicCache<String, Int>!\n      var originalCache: BasicCache<String, Int>!\n\n      beforeEach {\n        cacheToTest = sharedExampleContext()[NormalizedCacheSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n        originalCache = sharedExampleContext()[NormalizedCacheSharedExamplesContext.OriginalCache] as? BasicCache<String, Int>\n      }\n\n      it(\"should have a valid cache to test\") {\n        expect(cacheToTest).notTo(beNil())\n      }\n\n      it(\"should return the same value for the normalized cache\") {\n        expect(cacheToTest) === originalCache\n      }\n    }\n\n    sharedExamples(\"wrap the original cache into a BasicCache\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cacheToTest: BasicCache<String, Int>!\n      var originalCache: CacheLevelFake<String, Int>!\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        cacheToTest = sharedExampleContext()[NormalizedCacheSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n        originalCache = sharedExampleContext()[NormalizedCacheSharedExamplesContext.OriginalCache] as? CacheLevelFake<String, Int>\n      }\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n      }\n\n      context(\"when calling get\") {\n        let key = \"key to test\"\n        var expectedRequest: PassthroughSubject<Int, Error>!\n\n        beforeEach {\n          expectedRequest = PassthroughSubject()\n          originalCache.getSubject = expectedRequest\n          cancellable = cacheToTest.get(key).sink(receiveCompletion: { _ in }, receiveValue: { _ in })\n        }\n\n        it(\"should call the closure\") {\n          expect(originalCache.numberOfTimesCalledGet) == 1\n        }\n\n        it(\"should pass the right key\") {\n          expect(originalCache.didGetKey) == key\n        }\n      }\n\n      context(\"when calling set\") {\n        let key = \"test key\"\n        let value = 101\n\n        beforeEach {\n          _ = cacheToTest.set(value, forKey: key)\n        }\n\n        it(\"should call the closure\") {\n          expect(originalCache.numberOfTimesCalledSet) == 1\n        }\n\n        it(\"should pass the right key\") {\n          expect(originalCache.didSetKey) == key\n        }\n\n        it(\"should pass the right value\") {\n          expect(originalCache.didSetValue) == value\n        }\n      }\n\n      context(\"when calling clear\") {\n        beforeEach {\n          cacheToTest.clear()\n        }\n\n        it(\"should call the closure\") {\n          expect(originalCache.numberOfTimesCalledClear) == 1\n        }\n      }\n\n      context(\"when calling onMemoryWarning\") {\n        beforeEach {\n          cacheToTest.onMemoryWarning()\n        }\n\n        it(\"should call the closure\") {\n          expect(originalCache.numberOfTimesCalledOnMemoryWarning) == 1\n        }\n      }\n    }\n  }\n}\n\nfinal class NormalizationTests: QuickSpec {\n  override func spec() {\n    var cacheToTest: BasicCache<String, Int>!\n\n    describe(\"Normalization through the protocol extension\") {\n      context(\"when normalizing a BasicCache\") {\n        var originalCache: BasicCache<String, Int>!\n        var keyTransformer: OneWayTransformationBox<String, String>!\n\n        beforeEach {\n          keyTransformer = OneWayTransformationBox(transform: { Just($0).setFailureType(to: Error.self).eraseToAnyPublisher() })\n          originalCache = CacheLevelFake<String, Int>().transformKeys(keyTransformer)\n          cacheToTest = originalCache.normalize()\n        }\n\n        itBehavesLike(\"no-op if the original cache is a BasicCache\") {\n          [\n            NormalizedCacheSharedExamplesContext.OriginalCache: originalCache as Any,\n            NormalizedCacheSharedExamplesContext.CacheToTest: cacheToTest as Any\n          ]\n        }\n      }\n\n      context(\"when normalizing another type of cache\") {\n        var originalCache: CacheLevelFake<String, Int>!\n\n        beforeEach {\n          originalCache = CacheLevelFake()\n          cacheToTest = originalCache.normalize()\n        }\n\n        itBehavesLike(\"wrap the original cache into a BasicCache\") {\n          [\n            NormalizedCacheSharedExamplesContext.OriginalCache: originalCache as Any,\n            NormalizedCacheSharedExamplesContext.CacheToTest: cacheToTest as Any\n          ]\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/OneWayTransformationBoxTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nfinal class OneWayTransformationBoxTests: QuickSpec {\n  override func spec() {\n    describe(\"OneWayTransformationBox\") {\n      var box: OneWayTransformationBox<String, Int>!\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        box = OneWayTransformationBox(transform: { value in\n          guard let intValue = Int(value) else {\n            return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n          }\n\n          return Just(intValue).setFailureType(to: Error.self).eraseToAnyPublisher()\n        })\n      }\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n      }\n\n      context(\"when using the transformation\") {\n        var result: Int!\n        var error: Error!\n\n        beforeEach {\n          result = nil\n          error = nil\n        }\n\n        context(\"if the transformation is possible\") {\n          let originString = \"102\"\n\n          beforeEach {\n            cancellable = box.transform(originString)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(e) = completion {\n                  error = e\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          it(\"should call the success closure\") {\n            expect(result).notTo(beNil())\n          }\n\n          it(\"should not call the failure closure\") {\n            expect(error).to(beNil())\n          }\n\n          it(\"should return the expected result\") {\n            expect(result) == Int(originString)\n          }\n        }\n\n        context(\"if the transformation is not possible\") {\n          let originString = \"10asd2\"\n\n          beforeEach {\n            cancellable = box.transform(originString)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(e) = completion {\n                  error = e\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          it(\"should not call the success closure\") {\n            expect(result).to(beNil())\n          }\n\n          it(\"should call the failure closure\") {\n            expect(error).notTo(beNil())\n          }\n\n          it(\"should pass the right error\") {\n            expect(error as? TestError) == TestError.simpleError\n          }\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/OneWayTransformerCompositionTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nstruct ComposedOneWayTransformerSharedExamplesContext {\n  static let TransformerToTest = \"composedTransformer\"\n}\n\nfinal class OneWayTransformerCompositionSharedExamplesConfiguration: QuickConfiguration {\n  override class func configure(_: Configuration) {\n    sharedExamples(\"a composed one-way transformer\") {\n      (sharedExampleContext: @escaping SharedExampleContext) in\n      var composedTransformer: OneWayTransformationBox<String, Int>!\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        composedTransformer = sharedExampleContext()[ComposedOneWayTransformerSharedExamplesContext.TransformerToTest] as? OneWayTransformationBox<String, Int>\n      }\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n      }\n\n      context(\"when transforming a value\") {\n        var result: Int!\n\n        beforeEach {\n          result = nil\n        }\n\n        context(\"if the transformation is possible\") {\n          beforeEach {\n            cancellable = composedTransformer.transform(\"13.2\")\n              .sink(receiveCompletion: { _ in }, receiveValue: { result = $0 })\n          }\n\n          it(\"should not return nil\") {\n            expect(result).toEventuallyNot(beNil())\n          }\n\n          it(\"should return the expected result\") {\n            expect(result).toEventually(equal(13))\n          }\n        }\n\n        context(\"if the transformation fails in the first transformer\") {\n          beforeEach {\n            cancellable = composedTransformer.transform(\"13hallo\")\n              .sink(receiveCompletion: { _ in }, receiveValue: { result = $0 })\n          }\n\n          it(\"should return nil\") {\n            expect(result).toEventually(beNil())\n          }\n        }\n\n        context(\"if the transformation fails in the second transformer\") {\n          beforeEach {\n            cancellable = composedTransformer.transform(\"-13\")\n              .sink(receiveCompletion: { _ in }, receiveValue: { result = $0 })\n          }\n\n          it(\"should return nil\") {\n            expect(result).toEventually(beNil())\n          }\n        }\n      }\n    }\n  }\n}\n\nfinal class OneWayTransformerCompositionTests: QuickSpec {\n  override func spec() {\n    var transformer1: OneWayTransformationBox<String, Float>!\n    var transformer2: OneWayTransformationBox<Float, Int>!\n    var composedTransformer: OneWayTransformationBox<String, Int>!\n\n    beforeEach {\n      transformer1 = OneWayTransformationBox(transform: {\n        guard let value = Float($0) else {\n          return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n        }\n\n        return Just(value).setFailureType(to: Error.self).eraseToAnyPublisher()\n      })\n      transformer2 = OneWayTransformationBox(transform: {\n        guard $0 > 0 else {\n          return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n        }\n\n        return Just(Int($0)).setFailureType(to: Error.self).eraseToAnyPublisher()\n      })\n    }\n\n    describe(\"Transformer composition using two transformers with the instance function\") {\n      beforeEach {\n        composedTransformer = transformer1.compose(transformer2)\n      }\n\n      itBehavesLike(\"a composed one-way transformer\") {\n        [\n          ComposedOneWayTransformerSharedExamplesContext.TransformerToTest: composedTransformer as Any\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/PoolCacheTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nstruct PoolCacheSharedExamplesContext {\n  static let CacheToTest = \"cache\"\n  static let InternalCache = \"internalCache\"\n}\n\nfinal class PoolCacheSharedExamplesConfiguration: QuickConfiguration {\n  override class func configure(_: Configuration) {\n    sharedExamples(\"a pooled cache\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache: PoolCache<CacheLevelFake<String, Int>>!\n      var internalCache: CacheLevelFake<String, Int>!\n      var cancellables: Set<AnyCancellable>!\n\n      beforeEach {\n        cancellables = Set()\n        cache = sharedExampleContext()[PoolCacheSharedExamplesContext.CacheToTest] as? PoolCache<CacheLevelFake<String, Int>>\n        internalCache = sharedExampleContext()[PoolCacheSharedExamplesContext.InternalCache] as? CacheLevelFake<String, Int>\n      }\n\n      afterEach {\n        cancellables = nil\n      }\n\n      context(\"when calling get\") {\n        var fakeRequest: PassthroughSubject<Int, Error>!\n        let key = \"key_test\"\n        var successSentinel: Bool?\n        var failureSentinel: Bool?\n        var successValue: Int?\n\n        beforeEach {\n          successSentinel = nil\n          failureSentinel = nil\n          successValue = nil\n\n          fakeRequest = PassthroughSubject()\n          internalCache.getSubject = fakeRequest\n\n          cache.get(key).sink(receiveCompletion: { completion in\n            if case .failure = completion {\n              failureSentinel = true\n            }\n          }, receiveValue: { value in\n            successSentinel = true\n            successValue = value\n          })\n            .store(in: &cancellables)\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledGet).toEventually(equal(1))\n        }\n\n        it(\"should pass the right key\") {\n          expect(internalCache.didGetKey).toEventually(equal(key))\n        }\n\n        context(\"as long as the request doesn't succeed or fail, when other requests with different keys are made\") {\n          var fakeRequest2: PassthroughSubject<Int, Error>!\n          let otherKey = \"key_test_2\"\n\n          beforeEach {\n            fakeRequest2 = PassthroughSubject()\n            internalCache.getSubject = fakeRequest2\n\n            cache.get(otherKey)\n              .sink(receiveCompletion: { _ in }, receiveValue: { _ in })\n              .store(in: &cancellables)\n          }\n\n          it(\"should forward the call to the internal cache\") {\n            expect(internalCache.numberOfTimesCalledGet).toEventually(equal(2))\n          }\n\n          it(\"should pass the right key\") {\n            expect(internalCache.didGetKey).toEventually(equal(otherKey))\n          }\n\n          context(\"as long as the request doesn't succeed or fail, when other requests with the same key are made\") {\n            beforeEach {\n              cache.get(otherKey)\n                .sink(receiveCompletion: { _ in }, receiveValue: { _ in })\n                .store(in: &cancellables)\n            }\n\n            it(\"should not forward the call to the internal cache\") {\n              expect(internalCache.numberOfTimesCalledGet).toEventually(equal(2))\n            }\n          }\n        }\n\n        context(\"as long as the request doesn't succeed or fail, when other requests with the same key are made\") {\n          var otherSuccessSentinels: [Bool?]!\n          var otherFailureSentinels: [Bool?]!\n          var otherSuccessValues: [Int?]!\n          let numberOfOtherRequests = 2\n\n          beforeEach {\n            otherSuccessSentinels = []\n            otherFailureSentinels = []\n            otherSuccessValues = []\n\n            for _ in 0..<numberOfOtherRequests {\n              otherSuccessSentinels.append(nil)\n              otherFailureSentinels.append(nil)\n              otherSuccessValues.append(nil)\n              let currentIndex = otherSuccessValues.count - 1\n              cache.get(key).sink(receiveCompletion: { completion in\n                if case .failure = completion {\n                  otherFailureSentinels[currentIndex] = true\n                }\n              }, receiveValue: { value in\n                otherSuccessSentinels[currentIndex] = true\n                otherSuccessValues[currentIndex] = value\n              }).store(in: &cancellables)\n            }\n          }\n\n          it(\"should not forward the call to the internal cache\") {\n            expect(internalCache.numberOfTimesCalledGet).toEventually(equal(1))\n          }\n\n          context(\"when the first request succeeds\") {\n            let successValuePassed = 10\n\n            beforeEach {\n              fakeRequest.send(successValuePassed)\n            }\n\n            it(\"should call the closure on the first request\") {\n              expect(successSentinel).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the right value on the first request\") {\n              expect(successValue).toEventually(equal(successValuePassed))\n            }\n\n            it(\"should call the closure on the other requests\") {\n              expect(otherSuccessSentinels).toEventually(allPass { $0 != nil })\n            }\n\n            it(\"should pass the right value on the other requests\") {\n              expect(otherSuccessValues).toEventually(allPass { $0! == successValuePassed })\n            }\n\n            it(\"should not call get on the internal cache\") {\n              expect(internalCache.numberOfTimesCalledGet).toEventually(equal(1))\n            }\n          }\n\n          context(\"when the first request fails\") {\n            beforeEach {\n              fakeRequest.send(completion: .failure(TestError.simpleError))\n            }\n\n            it(\"should call the closure on the first request\") {\n              expect(failureSentinel).toEventuallyNot(beNil())\n            }\n\n            it(\"should call the closure on the other requests\") {\n              expect(otherFailureSentinels).toEventually(allPass { $0 != nil })\n            }\n\n            it(\"should not call get on the internal cache\") {\n              expect(internalCache.numberOfTimesCalledGet).toEventually(equal(1))\n            }\n\n            context(\"when other requests are done\") {\n              beforeEach {\n                cache.get(key)\n                  .sink(receiveCompletion: { _ in }, receiveValue: { _ in })\n                  .store(in: &cancellables)\n              }\n\n              it(\"should forward the call to the internal cache\") {\n                expect(internalCache.numberOfTimesCalledGet).toEventually(equal(2))\n              }\n            }\n          }\n        }\n      }\n\n      context(\"when calling set\") {\n        let key = \"test_key\"\n        let value = 30\n        var setSucceeded: Bool!\n        var setError: Error?\n\n        beforeEach {\n          setSucceeded = false\n          setError = nil\n\n          cache.set(value, forKey: key)\n            .sink(receiveCompletion: { completion in\n              if case let .failure(error) = completion {\n                setError = error\n              }\n            }, receiveValue: { setSucceeded = true })\n            .store(in: &cancellables)\n        }\n\n        it(\"should forward it to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledSet).toEventually(equal(1))\n        }\n\n        it(\"should set the right key\") {\n          expect(internalCache.didSetKey).toEventually(equal(key))\n        }\n\n        it(\"should set the right value\") {\n          expect(internalCache.didSetValue).toEventually(equal(value))\n        }\n\n        context(\"when set succeeds\") {\n          beforeEach {\n            internalCache.setPublishers[key]?.send()\n          }\n\n          it(\"should succeed\") {\n            expect(setSucceeded).toEventually(beTrue())\n          }\n        }\n\n        context(\"when set fails\") {\n          let setFailure = TestError.anotherError\n\n          beforeEach {\n            internalCache.setPublishers[key]?.send(completion: .failure(setFailure))\n          }\n\n          it(\"should fail\") {\n            expect(setError).toEventuallyNot(beNil())\n          }\n\n          it(\"should pass the error through\") {\n            expect(setError as? TestError).toEventually(equal(setFailure))\n          }\n        }\n\n        context(\"when calling it multiple times\") {\n          beforeEach {\n            cache.set(value, forKey: key)\n              .sink(receiveCompletion: { _ in }, receiveValue: { _ in })\n              .store(in: &cancellables)\n            cache.set(value, forKey: key)\n              .sink(receiveCompletion: { _ in }, receiveValue: { _ in })\n              .store(in: &cancellables)\n          }\n\n          it(\"should not pool these calls\") {\n            expect(internalCache.numberOfTimesCalledSet).toEventually(equal(3))\n          }\n        }\n      }\n\n      context(\"when calling clear\") {\n        beforeEach {\n          cache.clear()\n        }\n\n        it(\"should forward it to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledClear).toEventually(equal(1))\n        }\n\n        context(\"when calling it multiple times\") {\n          beforeEach {\n            cache.clear()\n            cache.clear()\n          }\n\n          it(\"should not pool these calls\") {\n            expect(internalCache.numberOfTimesCalledClear).toEventually(equal(3))\n          }\n        }\n      }\n\n      context(\"when calling onMemoryWarning\") {\n        beforeEach {\n          cache.onMemoryWarning()\n        }\n\n        it(\"should forward it to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledOnMemoryWarning).toEventually(equal(1))\n        }\n\n        context(\"when calling it multiple times\") {\n          beforeEach {\n            cache.onMemoryWarning()\n            cache.onMemoryWarning()\n          }\n\n          it(\"should not pool these calls\") {\n            expect(internalCache.numberOfTimesCalledOnMemoryWarning).toEventually(equal(3))\n          }\n        }\n      }\n    }\n  }\n}\n\nfinal class PoolCacheTests: QuickSpec {\n  override func spec() {\n    var cache: PoolCache<CacheLevelFake<String, Int>>!\n    var internalCache: CacheLevelFake<String, Int>!\n\n    describe(\"PoolCache\") {\n      beforeEach {\n        internalCache = CacheLevelFake<String, Int>()\n        cache = PoolCache<CacheLevelFake<String, Int>>(internalCache: internalCache)\n      }\n\n      itBehavesLike(\"a pooled cache\") {\n        [\n          PoolCacheSharedExamplesContext.CacheToTest: cache as Any,\n          PoolCacheSharedExamplesContext.InternalCache: internalCache as Any\n        ]\n      }\n    }\n\n    describe(\"The pooled instance function, applied to a cache level\") {\n      beforeEach {\n        internalCache = CacheLevelFake<String, Int>()\n        cache = internalCache.pooled()\n      }\n\n      itBehavesLike(\"a pooled cache\") {\n        [\n          PoolCacheSharedExamplesContext.CacheToTest: cache as Any,\n          PoolCacheSharedExamplesContext.InternalCache: internalCache as Any\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/PostProcessTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nstruct PostProcessSharedExamplesContext {\n  static let CacheToTest = \"cache\"\n  static let InternalCache = \"internalCache\"\n  static let Transformer = \"transformer\"\n}\n\nfinal class PostProcessSharedExamplesConfiguration: QuickConfiguration {\n  override class func configure(_: Configuration) {\n    sharedExamples(\"a fetch closure with post-processing step\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache: BasicCache<String, Int>!\n      var internalCache: CacheLevelFake<String, Int>!\n      var transformer: OneWayTransformationBox<Int, Int>!\n      var cancellables: Set<AnyCancellable>!\n\n      beforeEach {\n        cancellables = Set<AnyCancellable>()\n\n        cache = sharedExampleContext()[PostProcessSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n        internalCache = sharedExampleContext()[PostProcessSharedExamplesContext.InternalCache] as? CacheLevelFake<String, Int>\n        transformer = sharedExampleContext()[PostProcessSharedExamplesContext.Transformer] as? OneWayTransformationBox<Int, Int>\n      }\n\n      afterEach {\n        cancellables = nil\n      }\n\n      context(\"when calling get\") {\n        let key = \"12\"\n        var successValue: Int?\n        var failureValue: Error?\n        var fakeRequest: PassthroughSubject<Int, Error>!\n\n        beforeEach {\n          fakeRequest = PassthroughSubject()\n          internalCache.getSubject = fakeRequest\n          successValue = nil\n          failureValue = nil\n\n          cache.get(key).sink(receiveCompletion: { completion in\n            if case let .failure(error) = completion {\n              failureValue = error\n            }\n          }, receiveValue: { successValue = $0 })\n            .store(in: &cancellables)\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledGet).toEventually(equal(1))\n        }\n\n        it(\"should forward the key\") {\n          expect(internalCache.didGetKey).toEventually(equal(key))\n        }\n\n        context(\"when the request succeeds\") {\n          context(\"when the transformation closure returns a value\") {\n            let value = 101\n\n            beforeEach {\n              fakeRequest.send(value)\n            }\n\n            it(\"should call the transformer with the success value\") {\n              var expected: Int!\n              transformer.transform(value)\n                .sink(receiveCompletion: { _ in }, receiveValue: { expected = $0 })\n                .store(in: &cancellables)\n\n              expect(successValue).toEventually(equal(expected))\n            }\n          }\n\n          context(\"when the transformation closure returns nil\") {\n            let value = -101\n\n            beforeEach {\n              fakeRequest.send(value)\n            }\n\n            it(\"should not call the original success closure\") {\n              expect(successValue).toEventually(beNil())\n            }\n\n            it(\"should call the original failure closure\") {\n              expect(failureValue).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the right error code\") {\n              expect(failureValue as? TestError).toEventually(equal(TestError.simpleError))\n            }\n          }\n        }\n\n        context(\"when the request fails\") {\n          let errorCode = TestError.anotherError\n\n          beforeEach {\n            fakeRequest.send(completion: .failure(errorCode))\n          }\n\n          it(\"should call the original failure closure\") {\n            expect(failureValue as? TestError).toEventually(equal(errorCode))\n          }\n        }\n      }\n    }\n\n    sharedExamples(\"a cache with post-processing step\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache: BasicCache<String, Int>!\n      var internalCache: CacheLevelFake<String, Int>!\n      var transformer: OneWayTransformationBox<Int, Int>!\n      var cancellables: Set<AnyCancellable>!\n\n      beforeEach {\n        cancellables = Set()\n        cache = sharedExampleContext()[PostProcessSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n        internalCache = sharedExampleContext()[PostProcessSharedExamplesContext.InternalCache] as? CacheLevelFake<String, Int>\n        transformer = sharedExampleContext()[PostProcessSharedExamplesContext.Transformer] as? OneWayTransformationBox<Int, Int>\n      }\n\n      afterEach {\n        cancellables = nil\n      }\n\n      itBehavesLike(\"a fetch closure with post-processing step\") {\n        [\n          PostProcessSharedExamplesContext.CacheToTest: cache as Any,\n          PostProcessSharedExamplesContext.InternalCache: internalCache as Any,\n          PostProcessSharedExamplesContext.Transformer: transformer as Any\n        ]\n      }\n\n      context(\"when calling set\") {\n        let key = \"10\"\n        let value = 222\n\n        beforeEach {\n          cache.set(value, forKey: key)\n            .sink(receiveCompletion: { _ in }, receiveValue: { _ in })\n            .store(in: &cancellables)\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledSet).toEventually(equal(1))\n        }\n\n        it(\"should forward the key\") {\n          expect(internalCache.didSetKey).toEventually(equal(key))\n        }\n\n        it(\"should pass the right value\") {\n          expect(internalCache.didSetValue).toEventually(equal(value))\n        }\n      }\n\n      context(\"when calling clear\") {\n        beforeEach {\n          cache.clear()\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledClear).toEventually(equal(1))\n        }\n      }\n\n      context(\"when calling onMemoryWarning\") {\n        beforeEach {\n          cache.onMemoryWarning()\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledOnMemoryWarning).toEventually(equal(1))\n        }\n      }\n    }\n  }\n}\n\nfinal class PostProcessTests: QuickSpec {\n  override func spec() {\n    var cache: BasicCache<String, Int>!\n    var internalCache: CacheLevelFake<String, Int>!\n    var transformer: OneWayTransformationBox<Int, Int>!\n    let transformationClosure: (Int) -> AnyPublisher<Int, Error> = {\n      if $0 > 0 {\n        return Just($0 + 1).setFailureType(to: Error.self).eraseToAnyPublisher()\n      }\n\n      return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n    }\n\n    describe(\"Post processing using a transformer and a cache, with the instance function\") {\n      beforeEach {\n        internalCache = CacheLevelFake<String, Int>()\n        transformer = OneWayTransformationBox(transform: transformationClosure)\n        cache = internalCache.postProcess(transformer)\n      }\n\n      itBehavesLike(\"a cache with post-processing step\") {\n        [\n          PostProcessSharedExamplesContext.CacheToTest: cache as Any,\n          PostProcessSharedExamplesContext.InternalCache: internalCache as Any,\n          PostProcessSharedExamplesContext.Transformer: transformer as Any\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/StringConvertibleTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\n\nfinal class StringConvertibleTests: QuickSpec {\n  override func spec() {\n    describe(\"String values\") {\n      let value = \"this is the value\"\n\n      it(\"should return self\") {\n        expect(value.toString()) == value\n      }\n    }\n\n    describe(\"NSString values\") {\n      let value = \"this is the value\"\n\n      it(\"should return self\") {\n        expect(value.toString()) == value\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/StringTransformerTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nfinal class StringTransformerTests: QuickSpec {\n  override func spec() {\n    describe(\"String transformer\") {\n      var transformer: StringTransformer!\n      var error: Error!\n\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        transformer = StringTransformer(encoding: .utf8)\n      }\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n      }\n\n      context(\"when transforming NSData to String\") {\n        var result: String!\n\n        context(\"when the NSData is a valid string\") {\n          let stringSample = \"this is a sample string\"\n\n          beforeEach {\n            cancellable = transformer.transform((stringSample.data(using: .utf8) as NSData?)!)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(e) = completion {\n                  error = e\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          it(\"should not return nil\") {\n            expect(result).toEventuallyNot(beNil())\n          }\n\n          it(\"should not call the failure closure\") {\n            expect(error).toEventually(beNil())\n          }\n\n          it(\"should return the expected String\") {\n            expect(result).toEventually(equal(stringSample))\n          }\n        }\n      }\n\n      context(\"when transforming String to NSData\") {\n        var result: NSData?\n        let expectedString = \"this is the expected string value\"\n\n        beforeEach {\n          cancellable = transformer.inverseTransform(expectedString)\n            .sink(receiveCompletion: { completion in\n              if case let .failure(e) = completion {\n                error = e\n              }\n            }, receiveValue: { result = $0 })\n        }\n\n        it(\"should call the success closure\") {\n          expect(result).toEventuallyNot(beNil())\n        }\n\n        it(\"should return the expected data\") {\n          expect(result).toEventually(equal(expectedString.data(using: .utf8) as NSData?))\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/SwitchCacheTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nlet switchClosure: (String) -> CacheLevelSwitchResult = { str in\n  if str.count > 5 {\n    return .cacheA\n  } else {\n    return .cacheB\n  }\n}\n\nstruct SwitchCacheSharedExamplesContext {\n  static let CacheA = \"cacheA\"\n  static let CacheB = \"cacheB\"\n  static let CacheToTest = \"sutCache\"\n}\n\nfinal class SwitchCacheSharedExamplesConfiguration: QuickConfiguration {\n  override class func configure(_: Configuration) {\n    sharedExamples(\"should correctly get\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cacheA: CacheLevelFake<String, Int>!\n      var cacheB: CacheLevelFake<String, Int>!\n      var finalCache: BasicCache<String, Int>!\n      var cancellables: Set<AnyCancellable>!\n\n      beforeEach {\n        cancellables = Set()\n\n        cacheA = sharedExampleContext()[SwitchCacheSharedExamplesContext.CacheA] as? CacheLevelFake<String, Int>\n        cacheB = sharedExampleContext()[SwitchCacheSharedExamplesContext.CacheB] as? CacheLevelFake<String, Int>\n        finalCache = sharedExampleContext()[SwitchCacheSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n      }\n\n      afterEach {\n        cancellables = nil\n      }\n\n      context(\"when calling get\") {\n        var fakeRequest: PassthroughSubject<Int, Error>!\n        var successValue: Int?\n        var errorValue: Error?\n\n        beforeEach {\n          fakeRequest = PassthroughSubject()\n          cacheA.getSubject = fakeRequest\n          cacheB.getSubject = fakeRequest\n\n          successValue = nil\n          errorValue = nil\n        }\n\n        context(\"when the switch closure returns cacheA\") {\n          let key = \"quite long key\"\n\n          beforeEach {\n            finalCache.get(key)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  errorValue = error\n                }\n              }, receiveValue: { successValue = $0 })\n              .store(in: &cancellables)\n          }\n\n          it(\"should not dispatch the call to the second cache\") {\n            expect(cacheB.numberOfTimesCalledGet).toEventually(equal(0))\n          }\n\n          it(\"should dispatch the call to the first cache\") {\n            expect(cacheA.numberOfTimesCalledGet).toEventually(equal(1))\n          }\n\n          it(\"should pass the right key\") {\n            expect(cacheA.didGetKey).toEventually(equal(key))\n          }\n\n          context(\"when the request succeeds\") {\n            let value = 2010\n\n            beforeEach {\n              fakeRequest.send(value)\n            }\n\n            it(\"should call the original success closure\") {\n              expect(successValue).toEventually(equal(value))\n            }\n\n            it(\"should not call the original failure closure\") {\n              expect(errorValue).toEventually(beNil())\n            }\n          }\n\n          context(\"when the request fails\") {\n            let errorCode = TestError.simpleError\n\n            beforeEach {\n              fakeRequest.send(completion: .failure(errorCode))\n            }\n\n            it(\"should call the original failure closure\") {\n              expect(errorValue as? TestError).toEventually(equal(errorCode))\n            }\n\n            it(\"should not call the original success closure\") {\n              expect(successValue).toEventually(beNil())\n            }\n          }\n        }\n\n        context(\"when the switch closure returns cacheB\") {\n          let key = \"short\"\n\n          beforeEach {\n            finalCache.get(key)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  errorValue = error\n                }\n              }, receiveValue: { successValue = $0 })\n              .store(in: &cancellables)\n          }\n\n          it(\"should not dispatch the call to the first cache\") {\n            expect(cacheA.numberOfTimesCalledGet).toEventually(equal(0))\n          }\n\n          it(\"should dispatch the call to the second cache\") {\n            expect(cacheB.numberOfTimesCalledGet).toEventually(equal(1))\n          }\n\n          it(\"should pass the right key\") {\n            expect(cacheB.didGetKey).toEventually(equal(key))\n          }\n\n          context(\"when the request succeeds\") {\n            let value = 2010\n\n            beforeEach {\n              fakeRequest.send(value)\n            }\n\n            it(\"should call the original success closure\") {\n              expect(successValue).toEventually(equal(value))\n            }\n\n            it(\"should not call the original failure closure\") {\n              expect(errorValue).toEventually(beNil())\n            }\n          }\n\n          context(\"when the request fails\") {\n            let errorCode = TestError.anotherError\n\n            beforeEach {\n              fakeRequest.send(completion: .failure(errorCode))\n            }\n\n            it(\"should call the original failure closure\") {\n              expect(errorValue as? TestError).toEventually(equal(errorCode))\n            }\n\n            it(\"should not call the original success closure\") {\n              expect(successValue).toEventually(beNil())\n            }\n          }\n        }\n      }\n    }\n\n    sharedExamples(\"a switched cache with 2 fetch closures\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cacheA: CacheLevelFake<String, Int>!\n      var cacheB: CacheLevelFake<String, Int>!\n      var finalCache: BasicCache<String, Int>!\n\n      beforeEach {\n        cacheA = sharedExampleContext()[SwitchCacheSharedExamplesContext.CacheA] as? CacheLevelFake<String, Int>\n        cacheB = sharedExampleContext()[SwitchCacheSharedExamplesContext.CacheB] as? CacheLevelFake<String, Int>\n        finalCache = sharedExampleContext()[SwitchCacheSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n      }\n\n      itBehavesLike(\"should correctly get\") {\n        [\n          SwitchCacheSharedExamplesContext.CacheA: cacheA as Any,\n          SwitchCacheSharedExamplesContext.CacheB: cacheB as Any,\n          SwitchCacheSharedExamplesContext.CacheToTest: finalCache as Any\n        ]\n      }\n    }\n\n    sharedExamples(\"a switched cache with 2 cache levels\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cacheA: CacheLevelFake<String, Int>!\n      var cacheB: CacheLevelFake<String, Int>!\n      var finalCache: BasicCache<String, Int>!\n      var cancellables: Set<AnyCancellable>!\n\n      beforeEach {\n        cancellables = Set()\n        cacheA = sharedExampleContext()[SwitchCacheSharedExamplesContext.CacheA] as? CacheLevelFake<String, Int>\n        cacheB = sharedExampleContext()[SwitchCacheSharedExamplesContext.CacheB] as? CacheLevelFake<String, Int>\n        finalCache = sharedExampleContext()[SwitchCacheSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n      }\n\n      afterEach {\n        cancellables = nil\n      }\n\n      itBehavesLike(\"should correctly get\") {\n        [\n          SwitchCacheSharedExamplesContext.CacheA: cacheA as Any,\n          SwitchCacheSharedExamplesContext.CacheB: cacheB as Any,\n          SwitchCacheSharedExamplesContext.CacheToTest: finalCache as Any\n        ]\n      }\n\n      context(\"when calling set\") {\n        let value = 30\n        var setSucceeded: Bool!\n        var setError: Error?\n\n        beforeEach {\n          setSucceeded = false\n          setError = nil\n        }\n\n        context(\"when the switch closure returns cacheA\") {\n          let key = \"quite long key\"\n\n          beforeEach {\n            finalCache.set(value, forKey: key)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  setError = error\n                }\n              }, receiveValue: { setSucceeded = true })\n              .store(in: &cancellables)\n          }\n\n          it(\"should not dispatch the call to the second cache\") {\n            expect(cacheB.numberOfTimesCalledSet).toEventually(equal(0))\n          }\n\n          it(\"should dispatch the call to the first cache\") {\n            expect(cacheA.numberOfTimesCalledSet).toEventually(equal(1))\n          }\n\n          it(\"should pass the right key\") {\n            expect(cacheA.didSetKey).toEventually(equal(key))\n          }\n\n          it(\"should pass the right value\") {\n            expect(cacheA.didSetValue).toEventually(equal(value))\n          }\n\n          context(\"when set succeeds\") {\n            beforeEach {\n              cacheA.setPublishers[key]?.send()\n            }\n\n            it(\"should succeed\") {\n              expect(setSucceeded).toEventually(beTrue())\n            }\n          }\n\n          context(\"when set fails\") {\n            let setFailure = TestError.anotherError\n\n            beforeEach {\n              cacheA.setPublishers[key]?.send(completion: .failure(setFailure))\n            }\n\n            it(\"should fail\") {\n              expect(setError).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the error through\") {\n              expect(setError as? TestError).toEventually(equal(setFailure))\n            }\n          }\n        }\n\n        context(\"when the switch closure returns cacheB\") {\n          let key = \"short\"\n\n          beforeEach {\n            finalCache.set(value, forKey: key)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  setError = error\n                }\n              }, receiveValue: { setSucceeded = true })\n              .store(in: &cancellables)\n          }\n\n          it(\"should not dispatch the call to the first cache\") {\n            expect(cacheA.numberOfTimesCalledSet).toEventually(equal(0))\n          }\n\n          it(\"should dispatch the call to the second cache\") {\n            expect(cacheB.numberOfTimesCalledSet).toEventually(equal(1))\n          }\n\n          it(\"should pass the right key\") {\n            expect(cacheB.didSetKey).toEventually(equal(key))\n          }\n\n          it(\"should pass the right value\") {\n            expect(cacheB.didSetValue).toEventually(equal(value))\n          }\n\n          context(\"when set succeeds\") {\n            beforeEach {\n              cacheB.setPublishers[key]?.send()\n            }\n\n            it(\"should succeed\") {\n              expect(setSucceeded).toEventually(beTrue())\n            }\n          }\n\n          context(\"when set fails\") {\n            let setFailure = TestError.anotherError\n\n            beforeEach {\n              cacheB.setPublishers[key]?.send(completion: .failure(setFailure))\n            }\n\n            it(\"should fail\") {\n              expect(setError).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the error through\") {\n              expect(setError as? TestError).toEventually(equal(setFailure))\n            }\n          }\n        }\n      }\n\n      context(\"when calling clear\") {\n        beforeEach {\n          finalCache.clear()\n        }\n\n        it(\"should dispatch the call to the first cache\") {\n          expect(cacheA.numberOfTimesCalledClear).toEventually(equal(1))\n        }\n\n        it(\"should dispatch the call to the second cache\") {\n          expect(cacheB.numberOfTimesCalledClear).toEventually(equal(1))\n        }\n      }\n\n      context(\"when calling onMemoryWarning\") {\n        beforeEach {\n          finalCache.onMemoryWarning()\n        }\n\n        it(\"should dispatch the call to the first cache\") {\n          expect(cacheA.numberOfTimesCalledOnMemoryWarning).toEventually(equal(1))\n        }\n\n        it(\"should dispatch the call to the second cache\") {\n          expect(cacheB.numberOfTimesCalledOnMemoryWarning).toEventually(equal(1))\n        }\n      }\n    }\n\n    sharedExamples(\"a switched cache with a cache level and a fetch closure\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cacheA: CacheLevelFake<String, Int>!\n      var cacheB: CacheLevelFake<String, Int>!\n      var finalCache: BasicCache<String, Int>!\n      var cancellables: Set<AnyCancellable>!\n\n      beforeEach {\n        cancellables = Set()\n        cacheA = sharedExampleContext()[SwitchCacheSharedExamplesContext.CacheA] as? CacheLevelFake<String, Int>\n        cacheB = sharedExampleContext()[SwitchCacheSharedExamplesContext.CacheB] as? CacheLevelFake<String, Int>\n        finalCache = sharedExampleContext()[SwitchCacheSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n      }\n\n      afterEach {\n        cancellables = nil\n      }\n\n      itBehavesLike(\"should correctly get\") {\n        [\n          SwitchCacheSharedExamplesContext.CacheA: cacheA as Any,\n          SwitchCacheSharedExamplesContext.CacheB: cacheB as Any,\n          SwitchCacheSharedExamplesContext.CacheToTest: finalCache as Any\n        ]\n      }\n\n      context(\"when calling set\") {\n        let value = 30\n        var setSucceeded: Bool!\n        var setError: Error?\n\n        beforeEach {\n          setSucceeded = false\n          setError = nil\n        }\n\n        context(\"when the switch closure returns cacheA\") {\n          let key = \"quite long key\"\n\n          beforeEach {\n            finalCache.set(value, forKey: key)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  setError = error\n                }\n              }, receiveValue: { setSucceeded = true })\n              .store(in: &cancellables)\n          }\n\n          it(\"should not dispatch the call to the second cache\") {\n            expect(cacheB.numberOfTimesCalledSet).toEventually(equal(0))\n          }\n\n          it(\"should dispatch the call to the first cache\") {\n            expect(cacheA.numberOfTimesCalledSet).toEventually(equal(1))\n          }\n\n          it(\"should pass the right key\") {\n            expect(cacheA.didSetKey).toEventually(equal(key))\n          }\n\n          it(\"should pass the right value\") {\n            expect(cacheA.didSetValue).toEventually(equal(value))\n          }\n\n          context(\"when set succeeds\") {\n            beforeEach {\n              cacheA.setPublishers[key]?.send()\n            }\n\n            it(\"should succeed\") {\n              expect(setSucceeded).toEventually(beTrue())\n            }\n          }\n\n          context(\"when set fails\") {\n            let setFailure = TestError.anotherError\n\n            beforeEach {\n              cacheA.setPublishers[key]?.send(completion: .failure(setFailure))\n            }\n\n            it(\"should fail\") {\n              expect(setError).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the error through\") {\n              expect(setError as? TestError).toEventually(equal(setFailure))\n            }\n          }\n        }\n\n        context(\"when the switch closure returns cacheB\") {\n          let key = \"short\"\n\n          beforeEach {\n            _ = finalCache.set(value, forKey: key)\n          }\n\n          it(\"should not dispatch the call to the first cache\") {\n            expect(cacheA.numberOfTimesCalledSet).toEventually(equal(0))\n          }\n\n          it(\"should not dispatch the call to the second cache\") {\n            expect(cacheB.numberOfTimesCalledSet).toEventually(equal(0))\n          }\n        }\n      }\n\n      context(\"when calling clear\") {\n        beforeEach {\n          finalCache.clear()\n        }\n\n        it(\"should dispatch the call to the first cache\") {\n          expect(cacheA.numberOfTimesCalledClear).toEventually(equal(1))\n        }\n\n        it(\"should not dispatch the call to the second cache\") {\n          expect(cacheB.numberOfTimesCalledClear).toEventually(equal(0))\n        }\n      }\n\n      context(\"when calling onMemoryWarning\") {\n        beforeEach {\n          finalCache.onMemoryWarning()\n        }\n\n        it(\"should dispatch the call to the first cache\") {\n          expect(cacheA.numberOfTimesCalledOnMemoryWarning).toEventually(equal(1))\n        }\n\n        it(\"should not dispatch the call to the second cache\") {\n          expect(cacheB.numberOfTimesCalledOnMemoryWarning).toEventually(equal(0))\n        }\n      }\n    }\n\n    sharedExamples(\"a switched cache with a fetch closure and a cache level\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cacheA: CacheLevelFake<String, Int>!\n      var cacheB: CacheLevelFake<String, Int>!\n      var finalCache: BasicCache<String, Int>!\n      var cancellables: Set<AnyCancellable>!\n\n      beforeEach {\n        cancellables = Set()\n\n        cacheA = sharedExampleContext()[SwitchCacheSharedExamplesContext.CacheA] as? CacheLevelFake<String, Int>\n        cacheB = sharedExampleContext()[SwitchCacheSharedExamplesContext.CacheB] as? CacheLevelFake<String, Int>\n        finalCache = sharedExampleContext()[SwitchCacheSharedExamplesContext.CacheToTest] as? BasicCache<String, Int>\n      }\n\n      afterEach {\n        cancellables = nil\n      }\n\n      itBehavesLike(\"should correctly get\") {\n        [\n          SwitchCacheSharedExamplesContext.CacheA: cacheA as Any,\n          SwitchCacheSharedExamplesContext.CacheB: cacheB as Any,\n          SwitchCacheSharedExamplesContext.CacheToTest: finalCache as Any\n        ]\n      }\n\n      context(\"when calling set\") {\n        let value = 30\n        var setSucceeded: Bool!\n        var setError: Error?\n\n        beforeEach {\n          setSucceeded = false\n          setError = nil\n        }\n\n        context(\"when the switch closure returns cacheA\") {\n          let key = \"quite long key\"\n\n          beforeEach {\n            _ = finalCache.set(value, forKey: key)\n          }\n\n          it(\"should not dispatch the call to the second cache\") {\n            expect(cacheB.numberOfTimesCalledSet).toEventually(equal(0))\n          }\n\n          it(\"should not dispatch the call to the first cache\") {\n            expect(cacheA.numberOfTimesCalledSet).toEventually(equal(0))\n          }\n        }\n\n        context(\"when the switch closure returns cacheB\") {\n          let key = \"short\"\n\n          beforeEach {\n            finalCache.set(value, forKey: key)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  setError = error\n                }\n              }, receiveValue: { setSucceeded = true })\n              .store(in: &cancellables)\n          }\n\n          it(\"should not dispatch the call to the first cache\") {\n            expect(cacheA.numberOfTimesCalledSet).toEventually(equal(0))\n          }\n\n          it(\"should dispatch the call to the second cache\") {\n            expect(cacheB.numberOfTimesCalledSet).toEventually(equal(1))\n          }\n\n          it(\"should pass the right key\") {\n            expect(cacheB.didSetKey).toEventually(equal(key))\n          }\n\n          it(\"should pass the right value\") {\n            expect(cacheB.didSetValue).toEventually(equal(value))\n          }\n\n          context(\"when set succeeds\") {\n            beforeEach {\n              cacheB.setPublishers[key]?.send()\n            }\n\n            it(\"should succeed\") {\n              expect(setSucceeded).toEventually(beTrue())\n            }\n          }\n\n          context(\"when set fails\") {\n            let setFailure = TestError.anotherError\n\n            beforeEach {\n              cacheB.setPublishers[key]?.send(completion: .failure(setFailure))\n            }\n\n            it(\"should fail\") {\n              expect(setError).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the error through\") {\n              expect(setError as? TestError).toEventually(equal(setFailure))\n            }\n          }\n        }\n      }\n\n      context(\"when calling clear\") {\n        beforeEach {\n          finalCache.clear()\n        }\n\n        it(\"should not dispatch the call to the first cache\") {\n          expect(cacheA.numberOfTimesCalledClear).toEventually(equal(0))\n        }\n\n        it(\"should dispatch the call to the second cache\") {\n          expect(cacheB.numberOfTimesCalledClear).toEventually(equal(1))\n        }\n      }\n\n      context(\"when calling onMemoryWarning\") {\n        beforeEach {\n          finalCache.onMemoryWarning()\n        }\n\n        it(\"should not dispatch the call to the first cache\") {\n          expect(cacheA.numberOfTimesCalledOnMemoryWarning).toEventually(equal(0))\n        }\n\n        it(\"should dispatch the call to the second cache\") {\n          expect(cacheB.numberOfTimesCalledOnMemoryWarning).toEventually(equal(1))\n        }\n      }\n    }\n  }\n}\n\nfinal class SwitchCacheTests: QuickSpec {\n  override func spec() {\n    var cacheA: CacheLevelFake<String, Int>!\n    var cacheB: CacheLevelFake<String, Int>!\n    var finalCache: BasicCache<String, Int>!\n\n    describe(\"Switching two cache levels\") {\n      beforeEach {\n        cacheA = CacheLevelFake<String, Int>()\n        cacheB = CacheLevelFake<String, Int>()\n        finalCache = switchLevels(cacheA: cacheA, cacheB: cacheB, switchClosure: switchClosure)\n      }\n\n      itBehavesLike(\"a switched cache with 2 cache levels\") {\n        [\n          SwitchCacheSharedExamplesContext.CacheA: cacheA as Any,\n          SwitchCacheSharedExamplesContext.CacheB: cacheB as Any,\n          SwitchCacheSharedExamplesContext.CacheToTest: finalCache as Any\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/TwoWayTransformationBoxTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nstruct TwoWayTransformationBoxSharedExamplesContext {\n  static let TransformerToTest = \"transformer\"\n}\n\nfinal class TwoWayTransformationBoxSharedExamplesConfiguration: QuickConfiguration {\n  override class func configure(_: Configuration) {\n    sharedExamples(\"an inverted two-way transformation box\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var invertedBox: TwoWayTransformationBox<String, NSURL>!\n      var error: Error!\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        error = nil\n\n        invertedBox = sharedExampleContext()[TwoWayTransformationBoxSharedExamplesContext.TransformerToTest] as? TwoWayTransformationBox<String, NSURL>\n      }\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n      }\n\n      context(\"when using the transformation\") {\n        var result: NSURL!\n\n        beforeEach {\n          result = nil\n        }\n\n        context(\"if the transformation is possible\") {\n          let originString = \"http://github.com/WeltN24/Carlos\"\n\n          beforeEach {\n            cancellable = invertedBox.transform(originString)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(e) = completion {\n                  error = e\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          it(\"should call the success closure\") {\n            expect(result).notTo(beNil())\n          }\n\n          it(\"should not call the failure closure\") {\n            expect(error).to(beNil())\n          }\n\n          it(\"should return the expected result\") {\n            expect(result?.absoluteString) == originString\n          }\n        }\n\n        context(\"if the transformation is not possible\") {\n          beforeEach {\n            cancellable = invertedBox.transform(\"not an URL\")\n              .sink(receiveCompletion: { completion in\n                if case let .failure(e) = completion {\n                  error = e\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          it(\"should call the error closure\") {\n            expect(error).notTo(beNil())\n          }\n\n          it(\"should not call the success closure\") {\n            expect(result).to(beNil())\n          }\n\n          it(\"should pass the right error\") {\n            expect(error as? TestError) == TestError.anotherError\n          }\n        }\n      }\n\n      context(\"when using the inverse transformation\") {\n        var result: String!\n\n        beforeEach {\n          result = nil\n        }\n\n        context(\"when the transformation is possible\") {\n          let originURL = NSURL(string: \"http://github.com/WeltN24/Carlos\")!\n\n          beforeEach {\n            cancellable = invertedBox.inverseTransform(originURL)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(e) = completion {\n                  error = e\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          it(\"should call the success closure\") {\n            expect(result).notTo(beNil())\n          }\n\n          it(\"should not call the failure closure\") {\n            expect(error).to(beNil())\n          }\n\n          it(\"should return the expected result\") {\n            expect(result) == originURL.absoluteString\n          }\n        }\n\n        context(\"when the transformation is not possible\") {\n          beforeEach {\n            cancellable = invertedBox.inverseTransform(NSURL(string: \"ftp://test\")!)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(e) = completion {\n                  error = e\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          it(\"should call the error closure\") {\n            expect(error).notTo(beNil())\n          }\n\n          it(\"should not call the success closure\") {\n            expect(result).to(beNil())\n          }\n\n          it(\"should pass the right error\") {\n            expect(error as? TestError) == TestError.anotherError\n          }\n        }\n      }\n    }\n  }\n}\n\nfinal class TwoWayTransformationBoxTests: QuickSpec {\n  override func spec() {\n    describe(\"TwoWayTransformationBox\") {\n      var box: TwoWayTransformationBox<NSURL, String>!\n      var error: Error!\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        error = nil\n\n        box = TwoWayTransformationBox<NSURL, String>(transform: {\n          guard $0.scheme == \"http\", let stringValue = $0.absoluteString else {\n            return Fail(error: TestError.anotherError).eraseToAnyPublisher()\n          }\n\n          return Just(stringValue).setFailureType(to: Error.self).eraseToAnyPublisher()\n        }, inverseTransform: {\n          guard let value = NSURL(string: $0) else {\n            return Fail(error: TestError.anotherError).eraseToAnyPublisher()\n          }\n\n          return Just(value).setFailureType(to: Error.self).eraseToAnyPublisher()\n        })\n      }\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n      }\n\n      context(\"when using the transformation\") {\n        var result: String!\n\n        beforeEach {\n          result = nil\n        }\n\n        context(\"when the transformation is possible\") {\n          let originURL = NSURL(string: \"http://github.com/WeltN24/Carlos\")!\n\n          beforeEach {\n            cancellable = box.transform(originURL)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(e) = completion {\n                  error = e\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          it(\"should call the success closure\") {\n            expect(result).toEventuallyNot(beNil())\n          }\n\n          it(\"should not call the failure closure\") {\n            expect(error).toEventually(beNil())\n          }\n\n          it(\"should return the expected result\") {\n            expect(result).toEventually(equal(originURL.absoluteString))\n          }\n        }\n\n        context(\"when the transformation is not possible\") {\n          beforeEach {\n            cancellable = box.transform(NSURL(string: \"ftp://whatever\")!)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(e) = completion {\n                  error = e\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          it(\"should not call the success closure\") {\n            expect(result).toEventually(beNil())\n          }\n\n          it(\"should call the error closure\") {\n            expect(error).toEventuallyNot(beNil())\n          }\n\n          it(\"should pass the right error\") {\n            expect(error as? TestError).toEventually(equal(TestError.anotherError))\n          }\n        }\n      }\n\n      context(\"when using the inverse transformation\") {\n        var result: NSURL!\n\n        beforeEach {\n          result = nil\n        }\n\n        context(\"when the transformation is possible\") {\n          let originString = \"http://github.com/WeltN24/Carlos\"\n\n          beforeEach {\n            cancellable = box.inverseTransform(originString)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(e) = completion {\n                  error = e\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          it(\"should call the success closure\") {\n            expect(result).toEventuallyNot(beNil())\n          }\n\n          it(\"should not call the failure closure\") {\n            expect(error).toEventually(beNil())\n          }\n\n          it(\"should return the expected result\") {\n            expect(result).toEventually(equal(NSURL(string: originString)!))\n          }\n        }\n\n        context(\"when the transformation is not possible\") {\n          beforeEach {\n            cancellable = box.inverseTransform(\"not an URL\")\n              .sink(receiveCompletion: { completion in\n                if case let .failure(e) = completion {\n                  error = e\n                }\n              }, receiveValue: { result = $0 })\n          }\n\n          it(\"should not call the success closure\") {\n            expect(result).toEventually(beNil())\n          }\n\n          it(\"should call the error closure\") {\n            expect(error).toEventuallyNot(beNil())\n          }\n\n          it(\"should pass the right error\") {\n            expect(error as? TestError) == TestError.anotherError\n          }\n        }\n      }\n\n      context(\"when inverting the transformer\") {\n        var invertedBox: TwoWayTransformationBox<String, NSURL>!\n\n        beforeEach {\n          invertedBox = box.invert()\n        }\n\n        itBehavesLike(\"an inverted two-way transformation box\") {\n          [\n            TwoWayTransformationBoxSharedExamplesContext.TransformerToTest: invertedBox as Any\n          ]\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/TwoWayTransformerCompositionTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nstruct ComposedTwoWayTransformerSharedExamplesContext {\n  static let TransformerToTest = \"composedTransformer\"\n}\n\nfinal class TwoWayTransformerCompositionSharedExamplesConfiguration: QuickConfiguration {\n  override class func configure(_: Configuration) {\n    sharedExamples(\"a composed two-way transformer\") {\n      (sharedExampleContext: @escaping SharedExampleContext) in\n      var composedTransformer: TwoWayTransformationBox<String, Int>!\n      var cancellable: AnyCancellable?\n\n      beforeEach {\n        composedTransformer = sharedExampleContext()[ComposedTwoWayTransformerSharedExamplesContext.TransformerToTest] as? TwoWayTransformationBox<String, Int>\n      }\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n      }\n\n      context(\"when transforming a value\") {\n        var result: Int?\n\n        beforeEach {\n          result = nil\n        }\n\n        context(\"if the transformation is possible\") {\n          beforeEach {\n            cancellable = composedTransformer.transform(\"12.15\")\n              .sink(receiveCompletion: { _ in }, receiveValue: { result = $0 })\n          }\n\n          it(\"should not return nil\") {\n            expect(result).toEventuallyNot(beNil())\n          }\n\n          it(\"should return the expected result\") {\n            expect(result).toEventually(equal(12))\n          }\n        }\n\n        context(\"if the transformation fails in the first transformer\") {\n          beforeEach {\n            cancellable = composedTransformer.transform(\"hallo world\")\n              .sink(receiveCompletion: { _ in }, receiveValue: { result = $0 })\n          }\n\n          it(\"should return nil\") {\n            expect(result).toEventually(beNil())\n          }\n        }\n\n        context(\"if the transformation fails in the second transformer\") {\n          beforeEach {\n            cancellable = composedTransformer.transform(\"-13.2\")\n              .sink(receiveCompletion: { _ in }, receiveValue: { result = $0 })\n          }\n\n          it(\"should return nil\") {\n            expect(result).toEventually(beNil())\n          }\n        }\n      }\n\n      context(\"when doing the inverse transform\") {\n        var result: String?\n\n        beforeEach {\n          result = nil\n        }\n\n        context(\"when the transformation is possible\") {\n          beforeEach {\n            cancellable = composedTransformer.inverseTransform(31)\n              .sink(receiveCompletion: { _ in }, receiveValue: { result = $0 })\n          }\n\n          it(\"should not return nil\") {\n            expect(result).toEventuallyNot(beNil())\n          }\n\n          it(\"should return the expected result\") {\n            expect(result).toEventually(equal(\"31.0\"))\n          }\n        }\n\n        context(\"if the transformation fails in the first transformer\") {\n          beforeEach {\n            cancellable = composedTransformer.inverseTransform(-4)\n              .sink(receiveCompletion: { _ in }, receiveValue: { result = $0 })\n          }\n\n          it(\"should return nil\") {\n            expect(result).toEventually(beNil())\n          }\n        }\n\n        context(\"if the transformation fails in the second transformer\") {\n          beforeEach {\n            cancellable = composedTransformer.inverseTransform(105)\n              .sink(receiveCompletion: { _ in }, receiveValue: { result = $0 })\n          }\n\n          it(\"should return nil\") {\n            expect(result).toEventually(beNil())\n          }\n        }\n      }\n    }\n  }\n}\n\nfinal class TwoWayTransformerCompositionTests: QuickSpec {\n  override func spec() {\n    var transformer1: TwoWayTransformationBox<String, Float>!\n    var transformer2: TwoWayTransformationBox<Float, Int>!\n    var composedTransformer: TwoWayTransformationBox<String, Int>!\n\n    beforeEach {\n      transformer1 = TwoWayTransformationBox(transform: {\n        guard let value = Float($0) else {\n          return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n        }\n\n        return Just(value).setFailureType(to: Error.self).eraseToAnyPublisher()\n      }, inverseTransform: {\n        guard $0 < 100 else {\n          return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n        }\n\n        return Just(\"\\($0)\").setFailureType(to: Error.self).eraseToAnyPublisher()\n      })\n      transformer2 = TwoWayTransformationBox(transform: {\n        guard $0 > 0 else {\n          return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n        }\n\n        return Just(Int($0)).setFailureType(to: Error.self).eraseToAnyPublisher()\n      }, inverseTransform: {\n        guard $0 > 0 else {\n          return Fail(error: TestError.simpleError).eraseToAnyPublisher()\n        }\n\n        return Just(Float($0)).setFailureType(to: Error.self).eraseToAnyPublisher()\n      })\n    }\n\n    describe(\"Transformer composition using the instance function\") {\n      beforeEach {\n        composedTransformer = transformer1.compose(transformer2)\n      }\n\n      itBehavesLike(\"a composed two-way transformer\") {\n        [\n          ComposedTwoWayTransformerSharedExamplesContext.TransformerToTest: composedTransformer as Any\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "Tests/CarlosTests/ValueTransformationTests.swift",
    "content": "import Foundation\n\nimport Nimble\nimport Quick\n\nimport Carlos\nimport Combine\n\nstruct ValueTransformationsSharedExamplesContext {\n  static let CacheToTest = \"cache\"\n  static let InternalCache = \"internalCache\"\n  static let Transformer = \"transformer\"\n}\n\nfinal class ValueTransformationSharedExamplesConfiguration: QuickConfiguration {\n  override class func configure(_: Configuration) {\n    sharedExamples(\"a cache with transformed values\") { (sharedExampleContext: @escaping SharedExampleContext) in\n      var cache: BasicCache<String, String>!\n      var internalCache: CacheLevelFake<String, Int>!\n      var transformer: TwoWayTransformationBox<Int, String>!\n      var cancellable: AnyCancellable?\n\n      var cancellables: Set<AnyCancellable>!\n\n      beforeEach {\n        cancellables = Set()\n\n        cache = sharedExampleContext()[ValueTransformationsSharedExamplesContext.CacheToTest] as? BasicCache<String, String>\n        internalCache = sharedExampleContext()[ValueTransformationsSharedExamplesContext.InternalCache] as? CacheLevelFake<String, Int>\n        transformer = sharedExampleContext()[ValueTransformationsSharedExamplesContext.Transformer] as? TwoWayTransformationBox<Int, String>\n      }\n\n      afterEach {\n        cancellable?.cancel()\n        cancellable = nil\n\n        cancellables = nil\n      }\n\n      context(\"when calling get\") {\n        let key = \"12\"\n        var successValue: String?\n        var failureValue: Error?\n        var fakeRequest: PassthroughSubject<Int, Error>!\n        var canceled: Bool!\n\n        beforeEach {\n          canceled = false\n          failureValue = nil\n          successValue = nil\n\n          fakeRequest = PassthroughSubject()\n          internalCache.getSubject = fakeRequest\n\n          cancellable = cache.get(key)\n            .handleEvents(receiveCancel: {\n              canceled = true\n\n            })\n            .sink(receiveCompletion: { completion in\n              if case let .failure(error) = completion {\n                failureValue = error\n              }\n            }, receiveValue: { successValue = $0 })\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledGet).toEventually(equal(1))\n        }\n\n        it(\"should pass the right key\") {\n          expect(internalCache.didGetKey).toEventually(equal(key))\n        }\n\n        context(\"when the request succeeds\") {\n          context(\"when the value can be successfully transformed\") {\n            let value = 101\n\n            beforeEach {\n              fakeRequest.send(value)\n            }\n\n            it(\"should call the original success closure\") {\n              expect(successValue).toEventuallyNot(beNil())\n            }\n\n            it(\"should transform the value\") {\n              var expected: String!\n              transformer.transform(value)\n                .sink(receiveCompletion: { _ in }, receiveValue: { expected = $0 })\n                .store(in: &cancellables)\n\n              expect(successValue).toEventually(equal(expected))\n            }\n\n            it(\"should not call the original cancel closure\") {\n              expect(canceled).toEventually(beFalse())\n            }\n\n            it(\"should not call the original failure closure\") {\n              expect(failureValue).toEventually(beNil())\n            }\n          }\n\n          context(\"when the value transformation returns nil\") {\n            let value = -101\n\n            beforeEach {\n              successValue = nil\n              fakeRequest.send(value)\n            }\n\n            it(\"should not call the original success closure\") {\n              expect(successValue).toEventually(beNil())\n            }\n\n            it(\"should call the original failure closure\") {\n              expect(failureValue).toEventuallyNot(beNil())\n            }\n\n            it(\"should fail with the right code\") {\n              expect(failureValue as? TestError).toEventually(equal(TestError.anotherError))\n            }\n          }\n        }\n\n        context(\"when the request fails\") {\n          let errorCode = TestError.anotherError\n\n          beforeEach {\n            fakeRequest.send(completion: .failure(errorCode))\n          }\n\n          it(\"should call the original failure closure\") {\n            expect(failureValue).toEventuallyNot(beNil())\n          }\n\n          it(\"should fail with the right code\") {\n            expect(failureValue as? TestError).toEventually(equal(errorCode))\n          }\n\n          it(\"should not call the original success closure\") {\n            expect(successValue).toEventually(beNil())\n          }\n\n          it(\"should not call the original cancel closure\") {\n            expect(canceled).toEventually(beFalse())\n          }\n        }\n\n        context(\"when the request is canceled\") {\n          beforeEach {\n            cancellable?.cancel()\n          }\n\n          it(\"should call the original cancel closure\") {\n            expect(canceled).toEventually(beTrue())\n          }\n\n          it(\"should not call the original failure closure\") {\n            expect(failureValue).toEventually(beNil())\n          }\n\n          it(\"should not call the original success closure\") {\n            expect(successValue).toEventually(beNil())\n          }\n        }\n      }\n\n      context(\"when calling set\") {\n        var setSucceeded: Bool!\n        var setError: Error?\n\n        beforeEach {\n          setSucceeded = false\n          setError = nil\n        }\n\n        context(\"when the inverse transformation succeeds\") {\n          let key = \"test key to set\"\n          let value = \"199\"\n\n          beforeEach {\n            cancellable = cache.set(value, forKey: key)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  setError = error\n                }\n              }, receiveValue: { setSucceeded = true })\n          }\n\n          it(\"should forward the call to the internal cache\") {\n            expect(internalCache.numberOfTimesCalledSet).toEventually(equal(1))\n          }\n\n          it(\"should pass the key\") {\n            expect(internalCache.didSetKey).toEventually(equal(key))\n          }\n\n          it(\"should transform the value first\") {\n            var expected: Int!\n            transformer.inverseTransform(value)\n              .sink(receiveCompletion: { _ in }, receiveValue: { expected = $0 })\n              .store(in: &cancellables)\n            expect(internalCache.didSetValue).toEventually(equal(expected))\n          }\n\n          context(\"when the set succeeds\") {\n            beforeEach {\n              internalCache.setPublishers[key]?.send()\n            }\n\n            it(\"should succeed\") {\n              expect(setSucceeded).toEventually(beTrue())\n            }\n          }\n\n          context(\"when the set fails\") {\n            beforeEach {\n              internalCache.setPublishers[key]?.send(completion: .failure(TestError.anotherError))\n            }\n\n            it(\"should fail\") {\n              expect(setError).toEventuallyNot(beNil())\n            }\n\n            it(\"should pass the error through\") {\n              expect(setError as? TestError).toEventually(equal(TestError.anotherError))\n            }\n          }\n        }\n\n        context(\"when the inverse transformation fails\") {\n          let key = \"test key to set\"\n          let value = \"will fail\"\n\n          beforeEach {\n            cancellable = cache.set(value, forKey: key)\n              .sink(receiveCompletion: { completion in\n                if case let .failure(error) = completion {\n                  setError = error\n                }\n              }, receiveValue: {\n                setSucceeded = true\n              })\n          }\n\n          it(\"should not forward the call to the internal cache\") {\n            expect(internalCache.numberOfTimesCalledSet).toEventually(equal(0))\n          }\n\n          it(\"should fail\") {\n            expect(setError).toEventuallyNot(beNil())\n          }\n\n          it(\"should pass the transformation error\") {\n            expect(setError as? TestError).toEventually(equal(TestError.anotherError))\n          }\n        }\n      }\n\n      context(\"when calling clear\") {\n        beforeEach {\n          cache.clear()\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledClear).toEventually(equal(1))\n        }\n      }\n\n      context(\"when calling onMemoryWarning\") {\n        beforeEach {\n          cache.onMemoryWarning()\n        }\n\n        it(\"should forward the call to the internal cache\") {\n          expect(internalCache.numberOfTimesCalledOnMemoryWarning).toEventually(equal(1))\n        }\n      }\n    }\n  }\n}\n\nfinal class ValueTransformationTests: QuickSpec {\n  override func spec() {\n    var cache: BasicCache<String, String>!\n    var internalCache: CacheLevelFake<String, Int>!\n    var transformer: TwoWayTransformationBox<Int, String>!\n    let forwardTransformationClosure: (Int) -> AnyPublisher<String, Error> = {\n      if $0 > 0 {\n        return Just(\"\\($0 + 1)\").setFailureType(to: Error.self).eraseToAnyPublisher()\n      }\n\n      return Fail(error: TestError.anotherError).eraseToAnyPublisher()\n    }\n    let inverseTransformationClosure: (String) -> AnyPublisher<Int, Error> = {\n      guard let intValue = Int($0) else {\n        return Fail(error: TestError.anotherError).eraseToAnyPublisher()\n      }\n\n      return Just(intValue).setFailureType(to: Error.self).eraseToAnyPublisher()\n    }\n\n    describe(\"Value transformation using a transformer and a cache, with the instance function\") {\n      beforeEach {\n        internalCache = CacheLevelFake<String, Int>()\n        transformer = TwoWayTransformationBox(transform: forwardTransformationClosure, inverseTransform: inverseTransformationClosure)\n        cache = internalCache.transformValues(transformer)\n      }\n\n      itBehavesLike(\"a cache with transformed values\") {\n        [\n          ValueTransformationsSharedExamplesContext.CacheToTest: cache as Any,\n          ValueTransformationsSharedExamplesContext.InternalCache: internalCache as Any,\n          ValueTransformationsSharedExamplesContext.Transformer: transformer as Any\n        ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "fastlane/Fastfile",
    "content": "# https://github.com/KrauseFx/fastlane/tree/master/docs\n# All available actions: https://github.com/KrauseFx/fastlane/blob/master/docs/Actions.md\n\nfastlane_version \"2.140\"\n\ndesc \"Runs all the tests\"\nlane :test do\n  ENV[\"FASTLANE_XCODE_LIST_TIMEOUT\"] = \"30\"\n  clear_derived_data\n  spm(command: \"test\", configuration: \"release\")\nend\n"
  },
  {
    "path": "fastlane/README.md",
    "content": "fastlane documentation\n================\n# Installation\n\nMake sure you have the latest version of the Xcode command line tools installed:\n\n```\nxcode-select --install\n```\n\nInstall _fastlane_ using\n```\n[sudo] gem install fastlane -NV\n```\nor alternatively using `brew install fastlane`\n\n# Available Actions\n### test\n```\nfastlane test\n```\nRuns all the tests\n\n----\n\nThis README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run.\nMore information about fastlane can be found on [fastlane.tools](https://fastlane.tools).\nThe documentation of fastlane can be found on [docs.fastlane.tools](https://docs.fastlane.tools).\n"
  },
  {
    "path": "fastlane/Scanfile",
    "content": "# https://github.com/fastlane/scan#scanfile\n\nclean true\n"
  }
]