diff --git a/Cartfile b/Cartfile index 776202d..abffdbb 100644 --- a/Cartfile +++ b/Cartfile @@ -1 +1,2 @@ -github "LlamaKit/LlamaKit" ~> 0.5 +github "felixjendrusch/ValueTransformer" ~> 2.2 +github "robb/Monocle" ~> 0.0.1 diff --git a/Cartfile.private b/Cartfile.private index 18c847a..9fb520c 100644 --- a/Cartfile.private +++ b/Cartfile.private @@ -1,2 +1,2 @@ -github "Quick/Quick" ~> 0.2 -github "Quick/Nimble" ~> 0.3 +github "Quick/Quick" ~> 0.3 +github "Quick/Nimble" ~> 0.4 diff --git a/Cartfile.resolved b/Cartfile.resolved index 16868fa..5e5ee96 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1,3 +1,6 @@ -github "LlamaKit/LlamaKit" "v0.5.0" -github "Quick/Nimble" "v0.3.1" -github "Quick/Quick" "v0.2.3" +github "robrix/Box" "1.2.1" +github "robb/Monocle" "0.0.1" +github "Quick/Nimble" "v0.4.2" +github "Quick/Quick" "v0.3.1" +github "antitypical/Result" "0.4" +github "felixjendrusch/ValueTransformer" "2.2.0" diff --git a/LICENSE b/LICENSE index c167815..cabcd2c 100644 --- a/LICENSE +++ b/LICENSE @@ -19,26 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - ---- - -This project uses portions of code written by Robert Böhnke, -copyright (c) 2015 Robert Böhnke - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Pistachio.xcodeproj/project.pbxproj b/Pistachio.xcodeproj/project.pbxproj index 71a5104..d968d52 100644 --- a/Pistachio.xcodeproj/project.pbxproj +++ b/Pistachio.xcodeproj/project.pbxproj @@ -7,40 +7,61 @@ objects = { /* Begin PBXBuildFile section */ - DC071B9F1A8810BE00DE471C /* NSNumberValueTransformers.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC071B9E1A8810BE00DE471C /* NSNumberValueTransformers.swift */; }; - DC13E2411A87D3F9006DC3CA /* AdapterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC13E2401A87D3F9006DC3CA /* AdapterSpec.swift */; }; - DC2077CF1A8544D7005A9CF2 /* Adapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC2077CE1A8544D7005A9CF2 /* Adapter.swift */; }; + DC13E2411A87D3F9006DC3CA /* LazyAdapterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC13E2401A87D3F9006DC3CA /* LazyAdapterSpec.swift */; }; + DC2077CF1A8544D7005A9CF2 /* AdapterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC2077CE1A8544D7005A9CF2 /* AdapterType.swift */; }; DC20783B1A868B00005A9CF2 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC2078391A868B00005A9CF2 /* Nimble.framework */; }; DC20783C1A868B00005A9CF2 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC20783A1A868B00005A9CF2 /* Quick.framework */; }; - DC2078401A868C25005A9CF2 /* LensSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC20783F1A868C25005A9CF2 /* LensSpec.swift */; }; - DC2078441A87C08A005A9CF2 /* UtilsSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC2078431A87C08A005A9CF2 /* UtilsSpec.swift */; }; - DC2078461A87CCC5005A9CF2 /* ValueTransformerSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC2078451A87CCC5005A9CF2 /* ValueTransformerSpec.swift */; }; - DC3927E41A85365C00982AC1 /* LlamaKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC3927E31A85365C00982AC1 /* LlamaKit.framework */; }; + DC374CDA1AE5B71E00A37122 /* LensExtensionsSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC374CD91AE5B71E00A37122 /* LensExtensionsSpec.swift */; }; + DC374CDB1AE5B71E00A37122 /* LensExtensionsSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC374CD91AE5B71E00A37122 /* LensExtensionsSpec.swift */; }; DC492A121A83BB59007B52D6 /* Pistachio.h in Headers */ = {isa = PBXBuildFile; fileRef = DC492A111A83BB59007B52D6 /* Pistachio.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC492A181A83BB59007B52D6 /* Pistachio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC492A0C1A83BB59007B52D6 /* Pistachio.framework */; }; - DC492A291A83BB73007B52D6 /* Lens.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC492A281A83BB73007B52D6 /* Lens.swift */; }; - DC492A2E1A83BD33007B52D6 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC492A2D1A83BD33007B52D6 /* Utils.swift */; }; - DC492A361A84096D007B52D6 /* ValueTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC492A351A84096D007B52D6 /* ValueTransformer.swift */; }; - DCA767831ACEAB73007E4C12 /* Quick.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DC20783A1A868B00005A9CF2 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - DCA767841ACEAB73007E4C12 /* Nimble.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DC2078391A868B00005A9CF2 /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - DCA767851ACEAB73007E4C12 /* LlamaKit.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DC3927E31A85365C00982AC1 /* LlamaKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + DC516CCE1ADAEDAC006112F2 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC516CCD1ADAEDAC006112F2 /* Result.framework */; }; + DC516CCF1ADAEE00006112F2 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC516CCD1ADAEDAC006112F2 /* Result.framework */; }; + DC516CD01ADAEE08006112F2 /* Result.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DC516CCD1ADAEDAC006112F2 /* Result.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + DC516CD91ADAEE58006112F2 /* Monocle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC516CD31ADAEE27006112F2 /* Monocle.framework */; }; + DC516CDA1ADAEE74006112F2 /* Monocle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC516CD31ADAEE27006112F2 /* Monocle.framework */; }; + DC516CDD1ADAEEA3006112F2 /* Monocle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DC516CD31ADAEE27006112F2 /* Monocle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + DC516CDE1ADAEEAE006112F2 /* Quick.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DC20783A1A868B00005A9CF2 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + DC516CDF1ADAEEAE006112F2 /* Nimble.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DC2078391A868B00005A9CF2 /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + DC516CE51ADAEF14006112F2 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC516CE41ADAEED7006112F2 /* Result.framework */; }; + DC516CE61ADAEF17006112F2 /* Monocle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC516CE21ADAEED7006112F2 /* Monocle.framework */; }; + DC516CE71ADAEF2B006112F2 /* Quick.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DCA767A71ACEAD38007E4C12 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + DC516CE81ADAEF2B006112F2 /* Nimble.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DCA767A61ACEAD38007E4C12 /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + DC516CEC1ADAEF2B006112F2 /* Result.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DC516CE41ADAEED7006112F2 /* Result.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + DC516CED1ADAEF2B006112F2 /* ValueTransformer.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DCA767BB1ACEAF35007E4C12 /* ValueTransformer.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + DC516CEE1ADAEF2B006112F2 /* Monocle.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DC516CE21ADAEED7006112F2 /* Monocle.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + DC516CEF1ADAEF39006112F2 /* Result.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC516CE41ADAEED7006112F2 /* Result.framework */; }; + DC516CF01ADAEF3C006112F2 /* Monocle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC516CE21ADAEED7006112F2 /* Monocle.framework */; }; + DC7CEA191AE28B2F0049F077 /* LensExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7CEA161AE28B2F0049F077 /* LensExtensions.swift */; }; + DC7CEA1A1AE28B2F0049F077 /* LensExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7CEA161AE28B2F0049F077 /* LensExtensions.swift */; }; + DC7CEA1B1AE28B2F0049F077 /* NSNumberValueTransformers.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7CEA181AE28B2F0049F077 /* NSNumberValueTransformers.swift */; }; + DC7CEA1C1AE28B2F0049F077 /* NSNumberValueTransformers.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7CEA181AE28B2F0049F077 /* NSNumberValueTransformers.swift */; }; + DC7CEA1E1AE28D830049F077 /* LazyAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7CEA1D1AE28D830049F077 /* LazyAdapter.swift */; }; + DC7CEA1F1AE28D830049F077 /* LazyAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC7CEA1D1AE28D830049F077 /* LazyAdapter.swift */; }; DCA767961ACEAC7D007E4C12 /* Pistachio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCA7678B1ACEAC7C007E4C12 /* Pistachio.framework */; }; - DCA767A51ACEACF9007E4C12 /* LlamaKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCA767A41ACEACF9007E4C12 /* LlamaKit.framework */; }; DCA767A81ACEAD38007E4C12 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCA767A61ACEAD38007E4C12 /* Nimble.framework */; }; DCA767A91ACEAD38007E4C12 /* Quick.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCA767A71ACEAD38007E4C12 /* Quick.framework */; }; - DCA767AB1ACEAD4B007E4C12 /* Nimble.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DCA767A61ACEAD38007E4C12 /* Nimble.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - DCA767AC1ACEAD4B007E4C12 /* Quick.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DCA767A71ACEAD38007E4C12 /* Quick.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - DCA767AD1ACEAD4B007E4C12 /* LlamaKit.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DCA767A41ACEACF9007E4C12 /* LlamaKit.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - DCA767AF1ACEADA4007E4C12 /* AdapterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC13E2401A87D3F9006DC3CA /* AdapterSpec.swift */; }; - DCA767B01ACEADA4007E4C12 /* LensSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC20783F1A868C25005A9CF2 /* LensSpec.swift */; }; - DCA767B11ACEADA4007E4C12 /* UtilsSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC2078431A87C08A005A9CF2 /* UtilsSpec.swift */; }; - DCA767B21ACEADA4007E4C12 /* ValueTransformerSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC2078451A87CCC5005A9CF2 /* ValueTransformerSpec.swift */; }; - DCA767B31ACEADAB007E4C12 /* NSNumberValueTransformers.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC071B9E1A8810BE00DE471C /* NSNumberValueTransformers.swift */; }; - DCA767B41ACEADB1007E4C12 /* Adapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC2077CE1A8544D7005A9CF2 /* Adapter.swift */; }; - DCA767B51ACEADB1007E4C12 /* Lens.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC492A281A83BB73007B52D6 /* Lens.swift */; }; - DCA767B61ACEADB1007E4C12 /* Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC492A2D1A83BD33007B52D6 /* Utils.swift */; }; - DCA767B71ACEADB1007E4C12 /* ValueTransformer.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC492A351A84096D007B52D6 /* ValueTransformer.swift */; }; + DCA767AF1ACEADA4007E4C12 /* LazyAdapterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC13E2401A87D3F9006DC3CA /* LazyAdapterSpec.swift */; }; + DCA767B41ACEADB1007E4C12 /* AdapterType.swift in Sources */ = {isa = PBXBuildFile; fileRef = DC2077CE1A8544D7005A9CF2 /* AdapterType.swift */; }; DCA767B81ACEADB4007E4C12 /* Pistachio.h in Headers */ = {isa = PBXBuildFile; fileRef = DC492A111A83BB59007B52D6 /* Pistachio.h */; settings = {ATTRIBUTES = (Public, ); }; }; + DCA767BA1ACEAF17007E4C12 /* ValueTransformer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCA767B91ACEAF17007E4C12 /* ValueTransformer.framework */; }; + DCA767BC1ACEAF35007E4C12 /* ValueTransformer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCA767BB1ACEAF35007E4C12 /* ValueTransformer.framework */; }; + DCA767BD1ACEAF52007E4C12 /* ValueTransformer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCA767B91ACEAF17007E4C12 /* ValueTransformer.framework */; }; + DCA767BE1ACEAF5A007E4C12 /* ValueTransformer.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DCA767B91ACEAF17007E4C12 /* ValueTransformer.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + DCA767BF1ACEAF6A007E4C12 /* ValueTransformer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCA767BB1ACEAF35007E4C12 /* ValueTransformer.framework */; }; + DCCF43DD1AE29E43009E0012 /* DictionaryAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCF43DC1AE29E43009E0012 /* DictionaryAdapter.swift */; }; + DCCF43DE1AE29E43009E0012 /* DictionaryAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCF43DC1AE29E43009E0012 /* DictionaryAdapter.swift */; }; + DCCF43E11AE2C82E009E0012 /* Node.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCF43E01AE2C82E009E0012 /* Node.swift */; }; + DCCF43E21AE2C82E009E0012 /* Node.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCF43E01AE2C82E009E0012 /* Node.swift */; }; + DCCF43E51AE2E770009E0012 /* AnyObjectValueTransformers.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCF43E41AE2E770009E0012 /* AnyObjectValueTransformers.swift */; }; + DCCF43E61AE2E770009E0012 /* AnyObjectValueTransformers.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCF43E41AE2E770009E0012 /* AnyObjectValueTransformers.swift */; }; + DCCF43E81AE461E1009E0012 /* Counter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCF43E71AE461E1009E0012 /* Counter.swift */; }; + DCCF43E91AE461E1009E0012 /* Counter.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCF43E71AE461E1009E0012 /* Counter.swift */; }; + DCCF43EB1AE46775009E0012 /* DictionaryAdapterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCF43EA1AE46775009E0012 /* DictionaryAdapterSpec.swift */; }; + DCCF43EC1AE46775009E0012 /* DictionaryAdapterSpec.swift in Sources */ = {isa = PBXBuildFile; fileRef = DCCF43EA1AE46775009E0012 /* DictionaryAdapterSpec.swift */; }; + DCE2DDE31AF1A4340075FF3B /* Box.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DCE2DDE21AF1A4340075FF3B /* Box.framework */; }; + DCE2DDE41AF1A43C0075FF3B /* Box.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DCE2DDE11AF1A42A0075FF3B /* Box.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + DCE2DDE51AF1A4420075FF3B /* Box.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = DCE2DDE21AF1A4340075FF3B /* Box.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -67,9 +88,12 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - DCA767831ACEAB73007E4C12 /* Quick.framework in CopyFiles */, - DCA767841ACEAB73007E4C12 /* Nimble.framework in CopyFiles */, - DCA767851ACEAB73007E4C12 /* LlamaKit.framework in CopyFiles */, + DC516CDE1ADAEEAE006112F2 /* Quick.framework in CopyFiles */, + DC516CDF1ADAEEAE006112F2 /* Nimble.framework in CopyFiles */, + DCE2DDE41AF1A43C0075FF3B /* Box.framework in CopyFiles */, + DC516CD01ADAEE08006112F2 /* Result.framework in CopyFiles */, + DCA767BE1ACEAF5A007E4C12 /* ValueTransformer.framework in CopyFiles */, + DC516CDD1ADAEEA3006112F2 /* Monocle.framework in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -79,37 +103,48 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - DCA767AB1ACEAD4B007E4C12 /* Nimble.framework in CopyFiles */, - DCA767AC1ACEAD4B007E4C12 /* Quick.framework in CopyFiles */, - DCA767AD1ACEAD4B007E4C12 /* LlamaKit.framework in CopyFiles */, + DC516CE71ADAEF2B006112F2 /* Quick.framework in CopyFiles */, + DC516CE81ADAEF2B006112F2 /* Nimble.framework in CopyFiles */, + DCE2DDE51AF1A4420075FF3B /* Box.framework in CopyFiles */, + DC516CEC1ADAEF2B006112F2 /* Result.framework in CopyFiles */, + DC516CED1ADAEF2B006112F2 /* ValueTransformer.framework in CopyFiles */, + DC516CEE1ADAEF2B006112F2 /* Monocle.framework in CopyFiles */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - DC071B9E1A8810BE00DE471C /* NSNumberValueTransformers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSNumberValueTransformers.swift; sourceTree = ""; }; - DC13E2401A87D3F9006DC3CA /* AdapterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdapterSpec.swift; sourceTree = ""; }; - DC2077CE1A8544D7005A9CF2 /* Adapter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Adapter.swift; sourceTree = ""; }; + DC13E2401A87D3F9006DC3CA /* LazyAdapterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LazyAdapterSpec.swift; sourceTree = ""; }; + DC2077CE1A8544D7005A9CF2 /* AdapterType.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdapterType.swift; sourceTree = ""; }; DC2078391A868B00005A9CF2 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/iOS/Nimble.framework; sourceTree = ""; }; DC20783A1A868B00005A9CF2 /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = Carthage/Build/iOS/Quick.framework; sourceTree = ""; }; - DC20783F1A868C25005A9CF2 /* LensSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LensSpec.swift; sourceTree = ""; }; - DC2078431A87C08A005A9CF2 /* UtilsSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilsSpec.swift; sourceTree = ""; }; - DC2078451A87CCC5005A9CF2 /* ValueTransformerSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValueTransformerSpec.swift; sourceTree = ""; }; - DC3927E31A85365C00982AC1 /* LlamaKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = LlamaKit.framework; path = Carthage/Build/iOS/LlamaKit.framework; sourceTree = ""; }; + DC374CD91AE5B71E00A37122 /* LensExtensionsSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LensExtensionsSpec.swift; sourceTree = ""; }; DC492A0C1A83BB59007B52D6 /* Pistachio.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pistachio.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DC492A101A83BB59007B52D6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; DC492A111A83BB59007B52D6 /* Pistachio.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Pistachio.h; sourceTree = ""; }; DC492A171A83BB59007B52D6 /* PistachioTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PistachioTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; DC492A1D1A83BB59007B52D6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - DC492A281A83BB73007B52D6 /* Lens.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Lens.swift; sourceTree = ""; }; - DC492A2D1A83BD33007B52D6 /* Utils.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utils.swift; sourceTree = ""; }; - DC492A351A84096D007B52D6 /* ValueTransformer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ValueTransformer.swift; sourceTree = ""; }; + DC516CCD1ADAEDAC006112F2 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Result.framework; path = Carthage/Build/iOS/Result.framework; sourceTree = ""; }; + DC516CD31ADAEE27006112F2 /* Monocle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Monocle.framework; path = Carthage/Build/iOS/Monocle.framework; sourceTree = ""; }; + DC516CE21ADAEED7006112F2 /* Monocle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Monocle.framework; path = Carthage/Build/Mac/Monocle.framework; sourceTree = ""; }; + DC516CE41ADAEED7006112F2 /* Result.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Result.framework; path = Carthage/Build/Mac/Result.framework; sourceTree = ""; }; + DC7CEA161AE28B2F0049F077 /* LensExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LensExtensions.swift; sourceTree = ""; }; + DC7CEA181AE28B2F0049F077 /* NSNumberValueTransformers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSNumberValueTransformers.swift; sourceTree = ""; }; + DC7CEA1D1AE28D830049F077 /* LazyAdapter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LazyAdapter.swift; sourceTree = ""; }; DCA7678B1ACEAC7C007E4C12 /* Pistachio.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pistachio.framework; sourceTree = BUILT_PRODUCTS_DIR; }; DCA767951ACEAC7D007E4C12 /* PistachioTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PistachioTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - DCA767A41ACEACF9007E4C12 /* LlamaKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = LlamaKit.framework; path = Carthage/Build/Mac/LlamaKit.framework; sourceTree = ""; }; DCA767A61ACEAD38007E4C12 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/Mac/Nimble.framework; sourceTree = ""; }; DCA767A71ACEAD38007E4C12 /* Quick.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Quick.framework; path = Carthage/Build/Mac/Quick.framework; sourceTree = ""; }; + DCA767B91ACEAF17007E4C12 /* ValueTransformer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ValueTransformer.framework; path = Carthage/Build/iOS/ValueTransformer.framework; sourceTree = ""; }; + DCA767BB1ACEAF35007E4C12 /* ValueTransformer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ValueTransformer.framework; path = Carthage/Build/Mac/ValueTransformer.framework; sourceTree = ""; }; + DCCF43DC1AE29E43009E0012 /* DictionaryAdapter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DictionaryAdapter.swift; sourceTree = ""; }; + DCCF43E01AE2C82E009E0012 /* Node.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Node.swift; sourceTree = ""; }; + DCCF43E41AE2E770009E0012 /* AnyObjectValueTransformers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnyObjectValueTransformers.swift; sourceTree = ""; }; + DCCF43E71AE461E1009E0012 /* Counter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Counter.swift; sourceTree = ""; }; + DCCF43EA1AE46775009E0012 /* DictionaryAdapterSpec.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DictionaryAdapterSpec.swift; sourceTree = ""; }; + DCE2DDE11AF1A42A0075FF3B /* Box.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Box.framework; path = Carthage/Build/iOS/Box.framework; sourceTree = ""; }; + DCE2DDE21AF1A4340075FF3B /* Box.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Box.framework; path = Carthage/Build/Mac/Box.framework; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -117,7 +152,10 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DC3927E41A85365C00982AC1 /* LlamaKit.framework in Frameworks */, + DC516CCE1ADAEDAC006112F2 /* Result.framework in Frameworks */, + DCA767BA1ACEAF17007E4C12 /* ValueTransformer.framework in Frameworks */, + DCE2DDE31AF1A4340075FF3B /* Box.framework in Frameworks */, + DC516CD91ADAEE58006112F2 /* Monocle.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -127,6 +165,9 @@ files = ( DC20783C1A868B00005A9CF2 /* Quick.framework in Frameworks */, DC20783B1A868B00005A9CF2 /* Nimble.framework in Frameworks */, + DC516CCF1ADAEE00006112F2 /* Result.framework in Frameworks */, + DCA767BD1ACEAF52007E4C12 /* ValueTransformer.framework in Frameworks */, + DC516CDA1ADAEE74006112F2 /* Monocle.framework in Frameworks */, DC492A181A83BB59007B52D6 /* Pistachio.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -135,7 +176,9 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DCA767A51ACEACF9007E4C12 /* LlamaKit.framework in Frameworks */, + DC516CE51ADAEF14006112F2 /* Result.framework in Frameworks */, + DCA767BC1ACEAF35007E4C12 /* ValueTransformer.framework in Frameworks */, + DC516CE61ADAEF17006112F2 /* Monocle.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -145,6 +188,9 @@ files = ( DCA767A91ACEAD38007E4C12 /* Quick.framework in Frameworks */, DCA767A81ACEAD38007E4C12 /* Nimble.framework in Frameworks */, + DC516CEF1ADAEF39006112F2 /* Result.framework in Frameworks */, + DCA767BF1ACEAF6A007E4C12 /* ValueTransformer.framework in Frameworks */, + DC516CF01ADAEF3C006112F2 /* Monocle.framework in Frameworks */, DCA767961ACEAC7D007E4C12 /* Pistachio.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -152,13 +198,14 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - DC071B9D1A8810AC00DE471C /* Value Transformers */ = { + DC374CD81AE5B71E00A37122 /* Extensions */ = { isa = PBXGroup; children = ( - DC071B9E1A8810BE00DE471C /* NSNumberValueTransformers.swift */, + DC374CD91AE5B71E00A37122 /* LensExtensionsSpec.swift */, ); - name = "Value Transformers"; - sourceTree = ""; + name = Extensions; + path = PistachioTests/Extensions; + sourceTree = SOURCE_ROOT; }; DC492A021A83BB59007B52D6 = { isa = PBXGroup; @@ -184,12 +231,12 @@ DC492A0E1A83BB59007B52D6 /* Pistachio */ = { isa = PBXGroup; children = ( + DC2077CE1A8544D7005A9CF2 /* AdapterType.swift */, + DCCF43DC1AE29E43009E0012 /* DictionaryAdapter.swift */, + DC7CEA1D1AE28D830049F077 /* LazyAdapter.swift */, DC492A111A83BB59007B52D6 /* Pistachio.h */, - DC2077CE1A8544D7005A9CF2 /* Adapter.swift */, - DC492A281A83BB73007B52D6 /* Lens.swift */, - DC492A2D1A83BD33007B52D6 /* Utils.swift */, - DC492A351A84096D007B52D6 /* ValueTransformer.swift */, - DC071B9D1A8810AC00DE471C /* Value Transformers */, + DC7CEA151AE28B2F0049F077 /* Extensions */, + DC7CEA171AE28B2F0049F077 /* Value Transformers */, DC492A0F1A83BB59007B52D6 /* Supporting Files */, ); path = Pistachio; @@ -206,10 +253,10 @@ DC492A1B1A83BB59007B52D6 /* PistachioTests */ = { isa = PBXGroup; children = ( - DC13E2401A87D3F9006DC3CA /* AdapterSpec.swift */, - DC20783F1A868C25005A9CF2 /* LensSpec.swift */, - DC2078431A87C08A005A9CF2 /* UtilsSpec.swift */, - DC2078451A87CCC5005A9CF2 /* ValueTransformerSpec.swift */, + DCCF43EA1AE46775009E0012 /* DictionaryAdapterSpec.swift */, + DC13E2401A87D3F9006DC3CA /* LazyAdapterSpec.swift */, + DC374CD81AE5B71E00A37122 /* Extensions */, + DCCF43DF1AE2C807009E0012 /* Fixtures */, DC492A1C1A83BB59007B52D6 /* Supporting Files */, ); path = PistachioTests; @@ -223,12 +270,31 @@ name = "Supporting Files"; sourceTree = ""; }; + DC7CEA151AE28B2F0049F077 /* Extensions */ = { + isa = PBXGroup; + children = ( + DC7CEA161AE28B2F0049F077 /* LensExtensions.swift */, + ); + path = Extensions; + sourceTree = ""; + }; + DC7CEA171AE28B2F0049F077 /* Value Transformers */ = { + isa = PBXGroup; + children = ( + DC7CEA181AE28B2F0049F077 /* NSNumberValueTransformers.swift */, + ); + path = "Value Transformers"; + sourceTree = ""; + }; DCA767811ACEAB40007E4C12 /* iOS */ = { isa = PBXGroup; children = ( DC20783A1A868B00005A9CF2 /* Quick.framework */, DC2078391A868B00005A9CF2 /* Nimble.framework */, - DC3927E31A85365C00982AC1 /* LlamaKit.framework */, + DCE2DDE11AF1A42A0075FF3B /* Box.framework */, + DC516CCD1ADAEDAC006112F2 /* Result.framework */, + DCA767B91ACEAF17007E4C12 /* ValueTransformer.framework */, + DC516CD31ADAEE27006112F2 /* Monocle.framework */, ); name = iOS; sourceTree = ""; @@ -238,11 +304,32 @@ children = ( DCA767A71ACEAD38007E4C12 /* Quick.framework */, DCA767A61ACEAD38007E4C12 /* Nimble.framework */, - DCA767A41ACEACF9007E4C12 /* LlamaKit.framework */, + DCE2DDE21AF1A4340075FF3B /* Box.framework */, + DC516CE41ADAEED7006112F2 /* Result.framework */, + DCA767BB1ACEAF35007E4C12 /* ValueTransformer.framework */, + DC516CE21ADAEED7006112F2 /* Monocle.framework */, ); name = Mac; sourceTree = ""; }; + DCCF43DF1AE2C807009E0012 /* Fixtures */ = { + isa = PBXGroup; + children = ( + DCCF43E71AE461E1009E0012 /* Counter.swift */, + DCCF43E01AE2C82E009E0012 /* Node.swift */, + DCCF43E31AE2E770009E0012 /* Value Transformers */, + ); + path = Fixtures; + sourceTree = ""; + }; + DCCF43E31AE2E770009E0012 /* Value Transformers */ = { + isa = PBXGroup; + children = ( + DCCF43E41AE2E770009E0012 /* AnyObjectValueTransformers.swift */, + ); + path = "Value Transformers"; + sourceTree = ""; + }; DCDA378D1A93F6AB00C55699 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -427,11 +514,11 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - DC071B9F1A8810BE00DE471C /* NSNumberValueTransformers.swift in Sources */, - DC2077CF1A8544D7005A9CF2 /* Adapter.swift in Sources */, - DC492A361A84096D007B52D6 /* ValueTransformer.swift in Sources */, - DC492A291A83BB73007B52D6 /* Lens.swift in Sources */, - DC492A2E1A83BD33007B52D6 /* Utils.swift in Sources */, + DC7CEA1B1AE28B2F0049F077 /* NSNumberValueTransformers.swift in Sources */, + DC7CEA1E1AE28D830049F077 /* LazyAdapter.swift in Sources */, + DC2077CF1A8544D7005A9CF2 /* AdapterType.swift in Sources */, + DC7CEA191AE28B2F0049F077 /* LensExtensions.swift in Sources */, + DCCF43DD1AE29E43009E0012 /* DictionaryAdapter.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -439,10 +526,12 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - DC13E2411A87D3F9006DC3CA /* AdapterSpec.swift in Sources */, - DC2078461A87CCC5005A9CF2 /* ValueTransformerSpec.swift in Sources */, - DC2078441A87C08A005A9CF2 /* UtilsSpec.swift in Sources */, - DC2078401A868C25005A9CF2 /* LensSpec.swift in Sources */, + DCCF43EB1AE46775009E0012 /* DictionaryAdapterSpec.swift in Sources */, + DC13E2411A87D3F9006DC3CA /* LazyAdapterSpec.swift in Sources */, + DCCF43E11AE2C82E009E0012 /* Node.swift in Sources */, + DCCF43E81AE461E1009E0012 /* Counter.swift in Sources */, + DC374CDA1AE5B71E00A37122 /* LensExtensionsSpec.swift in Sources */, + DCCF43E51AE2E770009E0012 /* AnyObjectValueTransformers.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -450,11 +539,11 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - DCA767B71ACEADB1007E4C12 /* ValueTransformer.swift in Sources */, - DCA767B31ACEADAB007E4C12 /* NSNumberValueTransformers.swift in Sources */, - DCA767B41ACEADB1007E4C12 /* Adapter.swift in Sources */, - DCA767B51ACEADB1007E4C12 /* Lens.swift in Sources */, - DCA767B61ACEADB1007E4C12 /* Utils.swift in Sources */, + DC7CEA1C1AE28B2F0049F077 /* NSNumberValueTransformers.swift in Sources */, + DC7CEA1F1AE28D830049F077 /* LazyAdapter.swift in Sources */, + DCA767B41ACEADB1007E4C12 /* AdapterType.swift in Sources */, + DC7CEA1A1AE28B2F0049F077 /* LensExtensions.swift in Sources */, + DCCF43DE1AE29E43009E0012 /* DictionaryAdapter.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -462,10 +551,12 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - DCA767B21ACEADA4007E4C12 /* ValueTransformerSpec.swift in Sources */, - DCA767B01ACEADA4007E4C12 /* LensSpec.swift in Sources */, - DCA767B11ACEADA4007E4C12 /* UtilsSpec.swift in Sources */, - DCA767AF1ACEADA4007E4C12 /* AdapterSpec.swift in Sources */, + DCCF43EC1AE46775009E0012 /* DictionaryAdapterSpec.swift in Sources */, + DCA767AF1ACEADA4007E4C12 /* LazyAdapterSpec.swift in Sources */, + DCCF43E21AE2C82E009E0012 /* Node.swift in Sources */, + DCCF43E91AE461E1009E0012 /* Counter.swift in Sources */, + DC374CDB1AE5B71E00A37122 /* LensExtensionsSpec.swift in Sources */, + DCCF43E61AE2E770009E0012 /* AnyObjectValueTransformers.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -520,7 +611,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; @@ -562,7 +653,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; MACOSX_DEPLOYMENT_TARGET = 10.10; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_NAME = "$(PROJECT_NAME)"; @@ -582,7 +673,10 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Carthage/Build/iOS"; + FRAMEWORK_SEARCH_PATHS = ( + "$(PROJECT_DIR)/Carthage/Build/iOS", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); INFOPLIST_FILE = Pistachio/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -600,7 +694,10 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Carthage/Build/iOS"; + FRAMEWORK_SEARCH_PATHS = ( + "$(PROJECT_DIR)/Carthage/Build/iOS", + "$(PROJECT_DIR)/Carthage/Build/Mac", + ); INFOPLIST_FILE = Pistachio/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; @@ -760,6 +857,7 @@ DCA767A01ACEAC7D007E4C12 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; DCA767A11ACEAC7D007E4C12 /* Build configuration list for PBXNativeTarget "Pistachio-MacTests" */ = { isa = XCConfigurationList; @@ -768,6 +866,7 @@ DCA767A31ACEAC7D007E4C12 /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/Pistachio/Adapter.swift b/Pistachio/Adapter.swift deleted file mode 100644 index 26b2801..0000000 --- a/Pistachio/Adapter.swift +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) 2015 Felix Jendrusch. All rights reserved. - -import LlamaKit - -public protocol Adapter { - typealias Model - typealias Data - typealias Error - - func encode(model: Model) -> Result - func decode(model: Model, from data: Data) -> Result -} - -public struct LazyAdapter: Adapter { - private let adapter: () -> T - - public init(adapter: @autoclosure () -> T) { - self.adapter = adapter - } - - public func encode(model: Model) -> Result { - return adapter().encode(model) - } - - public func decode(model: Model, from data: Data) -> Result { - return adapter().decode(model, from: data) - } -} - -public struct DictionaryAdapter: Adapter { - private let specification: [String: Lens, Result>] - private let dictionaryTansformer: ValueTransformer<[String: Data], Data, Error> - - public init(specification: [String: Lens, Result>], dictionaryTansformer: ValueTransformer<[String: Data], Data, Error>) { - self.specification = specification - self.dictionaryTansformer = dictionaryTansformer - } - - public func encode(model: Model) -> Result { - var dictionary = [String: Data]() - for (key, lens) in specification { - switch get(lens, success(model)) { - case .Success(let value): - dictionary[key] = value.unbox - case .Failure(let error): - return failure(error.unbox) - } - } - - return dictionaryTansformer.transformedValue(dictionary) - } - - public func decode(model: Model, from data: Data) -> Result { - return dictionaryTansformer.reverseTransformedValue(data).flatMap { dictionary in - var result: Result = success(model) - for (key, lens) in self.specification { - if let value = dictionary[key] { - result = set(lens, result, success(value)) - if !result.isSuccess { break } - } - } - - return result - } - } -} - -// MARK: - Fix - -public func fix(f: LazyAdapter -> T) -> T { - return f(LazyAdapter(adapter: fix(f))) -} - -// MARK: - Lift - -public func lift(adapter: T, model: @autoclosure () -> Model) -> ValueTransformer { - let transformClosure: Model -> Result = { model in - return adapter.encode(model) - } - - let reverseTransformClosure: Data -> Result = { data in - return adapter.decode(model(), from: data) - } - - return ValueTransformer(transformClosure: transformClosure, reverseTransformClosure: reverseTransformClosure) -} diff --git a/Pistachio/AdapterType.swift b/Pistachio/AdapterType.swift new file mode 100644 index 0000000..446e1b8 --- /dev/null +++ b/Pistachio/AdapterType.swift @@ -0,0 +1,7 @@ +// Copyright (c) 2015 Felix Jendrusch. All rights reserved. + +import ValueTransformer + +public protocol AdapterType: ReversibleValueTransformerType { + +} diff --git a/Pistachio/DictionaryAdapter.swift b/Pistachio/DictionaryAdapter.swift new file mode 100644 index 0000000..10b53b3 --- /dev/null +++ b/Pistachio/DictionaryAdapter.swift @@ -0,0 +1,53 @@ +// Copyright (c) 2015 Felix Jendrusch. All rights reserved. + +import Result +import ValueTransformer +import Monocle + +public struct DictionaryAdapter: AdapterType { + public typealias Specification = [Key: Lens, Result>] + private let specification: Specification + + public typealias DictionaryTransformer = ReversibleValueTransformer<[Key: TransformedValue], TransformedValue, Error> + private let dictionaryTransformer: DictionaryTransformer + + public typealias ValueClosure = TransformedValue -> Result + private let valueClosure: ValueClosure + + public init(specification: Specification, dictionaryTransformer: DictionaryTransformer, valueClosure: ValueClosure) { + self.specification = specification + self.dictionaryTransformer = dictionaryTransformer + self.valueClosure = valueClosure + } + + public init(specification: Specification, dictionaryTransformer: DictionaryTransformer, @autoclosure(escaping) value: () -> Value) { + self.init(specification: specification, dictionaryTransformer: dictionaryTransformer, valueClosure: { _ in + return Result.success(value()) + }) + } + + public func transform(value: Value) -> Result { + return reduce(specification, Result.success([:])) { (result, element) in + let (key, lens) = element + return result.flatMap { (var dictionary) in + return get(lens, Result.success(value)).map { value in + dictionary[key] = value + return dictionary + } + } + }.flatMap { dictionary in + return dictionaryTransformer.transform(dictionary) + } + } + + public func reverseTransform(transformedValue: TransformedValue) -> Result { + return dictionaryTransformer.reverseTransform(transformedValue).flatMap { dictionary in + return reduce(self.specification, self.valueClosure(transformedValue)) { (result, element) in + let (key, lens) = element + return map(dictionary[key]) { value in + return set(lens, result, Result.success(value)) + } ?? result + } + } + } +} diff --git a/Pistachio/Extensions/LensExtensions.swift b/Pistachio/Extensions/LensExtensions.swift new file mode 100644 index 0000000..f4ea982 --- /dev/null +++ b/Pistachio/Extensions/LensExtensions.swift @@ -0,0 +1,37 @@ +// Copyright (c) 2015 Felix Jendrusch. All rights reserved. + +import Result +import ValueTransformer +import Monocle + +// MARK: - Lift + +public func lift(lens: Lens) -> Lens, Result> { + let get: Result -> Result = { a in + return a.map(Monocle.get(lens)) + } + + let set: (Result, Result) -> Result = { a, b in + return a.flatMap { a in b.map { b in Monocle.set(lens, a, b) } } + } + + return Lens(get: get, set: set) +} + +// MARK: - Map + +public func map(lens: Lens, reversibleValueTransformer: V) -> Lens, Result> { + return map(lift(lens), reversibleValueTransformer) +} + +public func map(lens: Lens, Result>, reversibleValueTransformer: V) -> Lens, Result> { + let get: Result -> Result = { a in + return Monocle.get(lens, a).flatMap(transform(reversibleValueTransformer)) + } + + let set: (Result, Result) -> Result = { a, c in + return Monocle.set(lens, a, c.flatMap(reverseTransform(reversibleValueTransformer))) + } + + return Lens(get: get, set: set) +} diff --git a/Pistachio/LazyAdapter.swift b/Pistachio/LazyAdapter.swift new file mode 100644 index 0000000..6916c13 --- /dev/null +++ b/Pistachio/LazyAdapter.swift @@ -0,0 +1,25 @@ +// Copyright (c) 2015 Felix Jendrusch. All rights reserved. + +import Result + +public struct LazyAdapter: AdapterType { + private let adapter: () -> A + + public init(@autoclosure(escaping) adapter: () -> A) { + self.adapter = adapter + } + + public func transform(value: A.ValueType) -> Result { + return adapter().transform(value) + } + + public func reverseTransform(transformedValue: A.TransformedValueType) -> Result { + return adapter().reverseTransform(transformedValue) + } +} + +// MARK: - Fix + +public func fix(f: LazyAdapter -> A) -> A { + return f(LazyAdapter(adapter: fix(f))) +} diff --git a/Pistachio/Lens.swift b/Pistachio/Lens.swift deleted file mode 100644 index 14dd287..0000000 --- a/Pistachio/Lens.swift +++ /dev/null @@ -1,172 +0,0 @@ -// Copyright (c) 2015 Robert Böhnke. All rights reserved. - -import LlamaKit - -public struct Lens { - private let get: A -> B - private let set: (A, B) -> A - - public init(get: A -> B, set: (A, B) -> A) { - self.get = get - self.set = set - } - - public init(get: A -> B, set: (inout A, B) -> ()) { - self.get = get - self.set = { - var copy = $0; set(©, $1); return copy - } - } -} - -// MARK: - Basics - -public func get(lens: Lens, a: A) -> B { - return lens.get(a) -} - -public func get(lens: Lens)(a: A) -> B { - return lens.get(a) -} - -public func get(lens: Lens, a: A?) -> B? { - return map(a, lens.get) -} - -public func get(lens: Lens)(a: A?) -> B? { - return map(a, lens.get) -} - -public func set(lens: Lens, a: A, b: B) -> A { - return lens.set(a, b) -} - -public func set(lens: Lens, a: A)(b: B) -> A { - return lens.set(a, b) -} - -public func mod(lens: Lens, a: A, f: B -> B) -> A { - return set(lens, a, f(get(lens, a))) -} - -// MARK: - Compose - -public func compose(left: Lens, right: Lens) -> Lens { - let get: A -> C = { a in - return right.get(left.get(a)) - } - - let set: (A, C) -> A = { a, c in - return left.set(a, right.set(left.get(a), c)) - } - - return Lens(get: get, set: set) -} - -infix operator >>> { - associativity right - precedence 170 -} - -public func >>> (lhs: Lens, rhs: Lens) -> Lens { - return compose(lhs, rhs) -} - -infix operator <<< { - associativity right - precedence 170 -} - -public func <<< (lhs: Lens, rhs: Lens) -> Lens { - return compose(rhs, lhs) -} - -// MARK: - Lift - -public func lift(lens: Lens) -> Lens<[A], [B]> { - let get: [A] -> [B] = { xs in - return map(xs, lens.get) - } - - let set: ([A], [B]) -> [A] = { xs, ys in - return map(zip(xs, ys), lens.set) - } - - return Lens(get: get, set: set) -} - -public func lift(lens: Lens) -> Lens, Result> { - let get: Result -> Result = { a in - return a.map(lens.get) - } - - let set: (Result, Result) -> Result = { a, b in - return a.flatMap { a in b.map { b in lens.set(a, b) } } - } - - return Lens(get: get, set: set) -} - -// MARK: - Transform - -public func transform(lens: Lens, valueTransformer: ValueTransformer) -> Lens, Result> { - return transform(lift(lens), valueTransformer) -} - -public func transform(lens: Lens, Result>, valueTransformer: ValueTransformer) -> Lens, Result> { - let get: Result -> Result = { a in - return lens.get(a).flatMap { valueTransformer.transformedValue($0) } - } - - let set: (Result, Result) -> Result = { a, c in - return lens.set(a, c.flatMap { valueTransformer.reverseTransformedValue($0) }) - } - - return Lens(get: get, set: set) -} - -// MARK: - Split - -public func split(left: Lens, right: Lens) -> Lens<(A, C), (B, D)> { - let get: (A, C) -> (B, D) = { (a, c) in - return (left.get(a), right.get(c)) - } - - let set: ((A, C), (B, D)) -> (A, C) = { (fst, snd) in - return (left.set(fst.0, snd.0), right.set(fst.1, snd.1)) - } - - return Lens(get: get, set: set) -} - -infix operator *** { - associativity left - precedence 150 -} - -public func *** (lhs: Lens, rhs: Lens) -> Lens<(A, C), (B, D)> { - return split(lhs, rhs) -} - -// MARK: - Fanout - -public func fanout(left: Lens, right: Lens) -> Lens { - let get: A -> (B, C) = { a in - return (left.get(a), right.get(a)) - } - - let set: (A, (B, C)) -> A = { (a, input) in - return right.set(left.set(a, input.0), input.1) - } - - return Lens(get: get, set: set) -} - -infix operator &&& { - associativity left - precedence 120 -} - -public func &&& (lhs: Lens, rhs: Lens) -> Lens { - return fanout(lhs, rhs) -} diff --git a/Pistachio/NSNumberValueTransformers.swift b/Pistachio/NSNumberValueTransformers.swift deleted file mode 100644 index 7e9f802..0000000 --- a/Pistachio/NSNumberValueTransformers.swift +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright (c) 2015 Felix Jendrusch. All rights reserved. - -import LlamaKit - -public struct NSNumberValueTransformers { - public static func char() -> ValueTransformer { - return ValueTransformer(transformClosure: { value in - return success(value.charValue) - }, reverseTransformClosure: { value in - return success(NSNumber(char: value)) - }) - } - - public static func unsignedChar() -> ValueTransformer { - return ValueTransformer(transformClosure: { value in - return success(value.unsignedCharValue) - }, reverseTransformClosure: { value in - return success(NSNumber(unsignedChar: value)) - }) - } - - public static func short() -> ValueTransformer { - return ValueTransformer(transformClosure: { value in - return success(value.shortValue) - }, reverseTransformClosure: { value in - return success(NSNumber(short: value)) - }) - } - - public static func unsignedShort() -> ValueTransformer { - return ValueTransformer(transformClosure: { value in - return success(value.unsignedShortValue) - }, reverseTransformClosure: { value in - return success(NSNumber(unsignedShort: value)) - }) - } - - public static func int() -> ValueTransformer { - return ValueTransformer(transformClosure: { value in - return success(value.intValue) - }, reverseTransformClosure: { value in - return success(NSNumber(int: value)) - }) - } - - public static func unsignedInt() -> ValueTransformer { - return ValueTransformer(transformClosure: { value in - return success(value.unsignedIntValue) - }, reverseTransformClosure: { value in - return success(NSNumber(unsignedInt: value)) - }) - } - - public static func long() -> ValueTransformer { - return ValueTransformer(transformClosure: { value in - return success(value.longValue) - }, reverseTransformClosure: { value in - return success(NSNumber(long: value)) - }) - } - - public static func unsignedLong() -> ValueTransformer { - return ValueTransformer(transformClosure: { value in - return success(value.unsignedLongValue) - }, reverseTransformClosure: { value in - return success(NSNumber(unsignedLong: value)) - }) - } - - public static func longLong() -> ValueTransformer { - return ValueTransformer(transformClosure: { value in - return success(value.longLongValue) - }, reverseTransformClosure: { value in - return success(NSNumber(longLong: value)) - }) - } - - public static func unsignedLongLong() -> ValueTransformer { - return ValueTransformer(transformClosure: { value in - return success(value.unsignedLongLongValue) - }, reverseTransformClosure: { value in - return success(NSNumber(unsignedLongLong: value)) - }) - } - - public static func float() -> ValueTransformer { - return ValueTransformer(transformClosure: { value in - return success(value.floatValue) - }, reverseTransformClosure: { value in - return success(NSNumber(float: value)) - }) - } - - public static func double() -> ValueTransformer { - return ValueTransformer(transformClosure: { value in - return success(value.doubleValue) - }, reverseTransformClosure: { value in - return success(NSNumber(double: value)) - }) - } - - public static func bool() -> ValueTransformer { - return ValueTransformer(transformClosure: { value in - return success(value.boolValue) - }, reverseTransformClosure: { value in - return success(NSNumber(bool: value)) - }) - } - - public static func integer() -> ValueTransformer { - return ValueTransformer(transformClosure: { value in - return success(value.integerValue) - }, reverseTransformClosure: { value in - return success(NSNumber(integer: value)) - }) - } - - public static func unsignedInteger() -> ValueTransformer { - return ValueTransformer(transformClosure: { value in - return success(value.unsignedIntegerValue) - }, reverseTransformClosure: { value in - return success(NSNumber(unsignedInteger: value)) - }) - } -} diff --git a/Pistachio/Utils.swift b/Pistachio/Utils.swift deleted file mode 100644 index 7d2771a..0000000 --- a/Pistachio/Utils.swift +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) 2015 Felix Jendrusch. All rights reserved. - -import Foundation - -// MARK: - Zip - -public func zip(a: [A], b: [B]) -> [(A, B)] { - var x = [(A, B)]() - for i in 0 ..< min(a.count, b.count) { - x.append((a[i], b[i])) - } - - return x -} - -// MARK: - Unzip - -public func unzip(x: [(A, B)]) -> ([A], [B]) { - var xs = [A](), ys = [B]() - for (a, b) in x { - xs.append(a) - ys.append(b) - } - - return (xs, ys) -} diff --git a/Pistachio/Value Transformers/NSNumberValueTransformers.swift b/Pistachio/Value Transformers/NSNumberValueTransformers.swift new file mode 100644 index 0000000..0a8914b --- /dev/null +++ b/Pistachio/Value Transformers/NSNumberValueTransformers.swift @@ -0,0 +1,126 @@ +// Copyright (c) 2015 Felix Jendrusch. All rights reserved. + +import Result +import ValueTransformer + +public struct NSNumberValueTransformers { + public static func char() -> ReversibleValueTransformer { + return ReversibleValueTransformer(transformClosure: { value in + return Result.success(NSNumber(char: value)) + }, reverseTransformClosure: { transformedValue in + return Result.success(transformedValue.charValue) + }) + } + + public static func unsignedChar() -> ReversibleValueTransformer { + return ReversibleValueTransformer(transformClosure: { value in + return Result.success(NSNumber(unsignedChar: value)) + }, reverseTransformClosure: { transformedValue in + return Result.success(transformedValue.unsignedCharValue) + }) + } + + public static func short() -> ReversibleValueTransformer { + return ReversibleValueTransformer(transformClosure: { value in + return Result.success(NSNumber(short: value)) + }, reverseTransformClosure: { transformedValue in + return Result.success(transformedValue.shortValue) + }) + } + + public static func unsignedShort() -> ReversibleValueTransformer { + return ReversibleValueTransformer(transformClosure: { value in + return Result.success(NSNumber(unsignedShort: value)) + }, reverseTransformClosure: { transformedValue in + return Result.success(transformedValue.unsignedShortValue) + }) + } + + public static func int() -> ReversibleValueTransformer { + return ReversibleValueTransformer(transformClosure: { value in + return Result.success(NSNumber(int: value)) + }, reverseTransformClosure: { transformedValue in + return Result.success(transformedValue.intValue) + }) + } + + public static func unsignedInt() -> ReversibleValueTransformer { + return ReversibleValueTransformer(transformClosure: { value in + return Result.success(NSNumber(unsignedInt: value)) + }, reverseTransformClosure: { transformedValue in + return Result.success(transformedValue.unsignedIntValue) + }) + } + + public static func long() -> ReversibleValueTransformer { + return ReversibleValueTransformer(transformClosure: { value in + return Result.success(NSNumber(long: value)) + }, reverseTransformClosure: { transformedValue in + return Result.success(transformedValue.longValue) + }) + } + + public static func unsignedLong() -> ReversibleValueTransformer { + return ReversibleValueTransformer(transformClosure: { value in + return Result.success(NSNumber(unsignedLong: value)) + }, reverseTransformClosure: { transformedValue in + return Result.success(transformedValue.unsignedLongValue) + }) + } + + public static func longLong() -> ReversibleValueTransformer { + return ReversibleValueTransformer(transformClosure: { value in + return Result.success(NSNumber(longLong: value)) + }, reverseTransformClosure: { transformedValue in + return Result.success(transformedValue.longLongValue) + }) + } + + public static func unsignedLongLong() -> ReversibleValueTransformer { + return ReversibleValueTransformer(transformClosure: { value in + return Result.success(NSNumber(unsignedLongLong: value)) + }, reverseTransformClosure: { transformedValue in + return Result.success(transformedValue.unsignedLongLongValue) + }) + } + + public static func float() -> ReversibleValueTransformer { + return ReversibleValueTransformer(transformClosure: { value in + return Result.success(NSNumber(float: value)) + }, reverseTransformClosure: { transformedValue in + return Result.success(transformedValue.floatValue) + }) + } + + public static func double() -> ReversibleValueTransformer { + return ReversibleValueTransformer(transformClosure: { value in + return Result.success(NSNumber(double: value)) + }, reverseTransformClosure: { transformedValue in + return Result.success(transformedValue.doubleValue) + }) + } + + public static func bool() -> ReversibleValueTransformer { + return ReversibleValueTransformer(transformClosure: { value in + return Result.success(NSNumber(bool: value)) + }, reverseTransformClosure: { transformedValue in + return Result.success(transformedValue.boolValue) + }) + } + + public static func integer() -> ReversibleValueTransformer { + return ReversibleValueTransformer(transformClosure: { value in + return Result.success(NSNumber(integer: value)) + }, reverseTransformClosure: { transformedValue in + return Result.success(transformedValue.integerValue) + }) + } + + public static func unsignedInteger() -> ReversibleValueTransformer { + return ReversibleValueTransformer(transformClosure: { value in + return Result.success(NSNumber(unsignedInteger: value)) + }, reverseTransformClosure: { transformedValue in + return Result.success(transformedValue.unsignedIntegerValue) + }) + } +} diff --git a/Pistachio/ValueTransformer.swift b/Pistachio/ValueTransformer.swift deleted file mode 100644 index 118c278..0000000 --- a/Pistachio/ValueTransformer.swift +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright (c) 2015 Felix Jendrusch. All rights reserved. - -import LlamaKit - -public struct ValueTransformer { - private let transformClosure: A -> Result - private let reverseTransformClosure: B -> Result - - public init(transformClosure: A -> Result, reverseTransformClosure: B -> Result) { - self.transformClosure = transformClosure - self.reverseTransformClosure = reverseTransformClosure - } - - public func transformedValue(value: A) -> Result { - return transformClosure(value) - } - - public func reverseTransformedValue(value: B) -> Result { - return reverseTransformClosure(value) - } -} - -// MARK: - Flip - -public func flip(valueTransformer: ValueTransformer) -> ValueTransformer { - return ValueTransformer(transformClosure: valueTransformer.reverseTransformClosure, reverseTransformClosure: valueTransformer.transformClosure) -} - -// MARK: - Compose - -public func compose(left: ValueTransformer, right: ValueTransformer) -> ValueTransformer { - let transformClosure: A -> Result = { a in - return left.transformedValue(a).flatMap { b in right.transformedValue(b) } - } - - let reverseTransformClosure: C -> Result = { c in - return right.reverseTransformedValue(c).flatMap { b in left.reverseTransformedValue(b) } - } - - return ValueTransformer(transformClosure: transformClosure, reverseTransformClosure: reverseTransformClosure) -} - -infix operator >>> { - associativity right - precedence 170 -} - -public func >>> (lhs: ValueTransformer, rhs: ValueTransformer) -> ValueTransformer { - return compose(lhs, rhs) -} - -infix operator <<< { - associativity right - precedence 170 -} - -public func <<< (lhs: ValueTransformer, rhs: ValueTransformer) -> ValueTransformer { - return compose(rhs, lhs) -} - -// MARK: - Lift - -public func lift(dictionary: [A: B], defaultTransformedValue: @autoclosure () -> B, defaultReverseTransformedValue: @autoclosure () -> A) -> ValueTransformer { - let transformClosure: A -> Result = { value in - if let transformedValue = dictionary[value] { - return success(transformedValue) - } else { - return success(defaultTransformedValue()) - } - } - - var reverseDictionary = [B: A]() - for (key, value) in dictionary { - reverseDictionary[value] = key - } - - let reverseTransformClosure: B -> Result = { value in - if let reverseTransformedValue = reverseDictionary[value] { - return success(reverseTransformedValue) - } else { - return success(defaultReverseTransformedValue()) - } - } - - return ValueTransformer(transformClosure: transformClosure, reverseTransformClosure: reverseTransformClosure) -} - -public func lift(valueTransformer: ValueTransformer, defaultTransformedValue: @autoclosure () -> B) -> ValueTransformer { - let transformClosure: A? -> Result = { value in - if let value = value { - return valueTransformer.transformedValue(value) - } else { - return success(defaultTransformedValue()) - } - } - - let reverseTransformClosure: B -> Result = { value in - if value == defaultTransformedValue() { - return success(nil) - } else { - return valueTransformer.reverseTransformedValue(value).map { $0 } - } - } - - return ValueTransformer(transformClosure: transformClosure, reverseTransformClosure: reverseTransformClosure) -} - -public func lift(valueTransformer: ValueTransformer) -> ValueTransformer<[A], [B], E> { - let transformClosure: [A] -> Result<[B], E> = { values in - var result = [B]() - for element in values { - switch valueTransformer.transformedValue(element) { - case .Success(let value): - result.append(value.unbox) - case .Failure(let error): - return failure(error.unbox) - } - } - - return success(result) - } - - let reverseTransformClosure: [B] -> Result<[A], E> = { values in - var result = [A]() - for element in values { - switch valueTransformer.reverseTransformedValue(element) { - case .Success(let value): - result.append(value.unbox) - case .Failure(let error): - return failure(error.unbox) - } - } - - return success(result) - } - - return ValueTransformer(transformClosure: transformClosure, reverseTransformClosure: reverseTransformClosure) -} diff --git a/PistachioTests/AdapterSpec.swift b/PistachioTests/AdapterSpec.swift deleted file mode 100644 index 844dbb2..0000000 --- a/PistachioTests/AdapterSpec.swift +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) 2015 Felix Jendrusch. All rights reserved. - -import Quick -import Nimble - -import LlamaKit -import Pistachio - -extension ValueTransformers { - static let int: ValueTransformer = ValueTransformer(transformClosure: { value in - return success(value) - }, reverseTransformClosure: { value in - switch value { - case let value as Int: - return success(value) - default: - return failure(NSError()) - } - }) - - static let array: ValueTransformer<[AnyObject], AnyObject, NSError> = ValueTransformer(transformClosure: { value in - return success(value) - }, reverseTransformClosure: { value in - switch value { - case let value as [AnyObject]: - return success(value) - default: - return failure(NSError()) - } - }) - - static let dictionary: ValueTransformer<[String: AnyObject], AnyObject, NSError> = ValueTransformer(transformClosure: { value in - return success(value) - }, reverseTransformClosure: { value in - switch value { - case let value as [String: AnyObject]: - return success(value) - default: - return failure(NSError()) - } - }) -} - -struct Node { - var children: [Node] - - init(children: [Node]) { - self.children = children - } -} - -struct NodeLenses { - static let children = Lens(get: { $0.children }, set: { (inout node: Node, children) in - node.children = children - }) -} - -struct Adapters { - static let inner = DictionaryAdapter(specification: [ - "count": transform(InnerLenses.count, ValueTransformers.int) - ], dictionaryTansformer: ValueTransformers.dictionary) - - static let outer = DictionaryAdapter(specification: [ - "count": transform(OuterLenses.count, ValueTransformers.int), - "inner": transform(OuterLenses.inner, lift(inner, Inner(count: 0))) - ], dictionaryTansformer: ValueTransformers.dictionary) - - static let node: DictionaryAdapter = fix { adapter in - return DictionaryAdapter(specification: [ - "children": transform(NodeLenses.children, lift(lift(adapter, Node(children: []))) >>> ValueTransformers.array) - ], dictionaryTansformer: ValueTransformers.dictionary) - } -} - -class AdapterSpec: QuickSpec { - override func spec() { - describe("A DictionaryAdapter") { - let adapter = Adapters.inner - - it("should encode a model") { - let result = adapter.encode(Inner(count: 1)) - - expect(result.value as? [String: Int]).to(equal([ "count": 1 ])) - } - - it("should decode a model from data") { - let result = adapter.decode(Inner(count: 2), from: [ "count": 3 ]) - - expect(result.value?.count).to(equal(3)) - } - } - - describe("Fixed adapters") { - let adapter = Adapters.node - - it("should encode a model") { - let result = adapter.encode(Node(children: [ Node(children: []), Node(children: []) ])) - - expect((result.value as? [String: [AnyObject]])?["children"]?.count).to(equal(2)) - } - - it("should decode a model from data") { - let result = adapter.decode(Node(children: []), from: [ "children": [ [ "children": [] ], [ "children": [] ] ] ]) - - expect(result.value?.children.count).to(equal(2)) - } - } - - describe("Lifted adapters") { - let adapter = lift(Adapters.inner, Inner(count: 3)) - - it("should transform a value") { - let result = adapter.transformedValue(Inner(count: 4)) - - expect(result.value as? [String: Int]).to(equal([ "count": 4 ])) - } - - it("should reverse transform a value") { - let result = adapter.reverseTransformedValue([ "count": 5 ]) - - expect(result.value?.count).to(equal(5)) - } - - it("should use the default structure") { - let result = adapter.reverseTransformedValue([String: AnyObject]()) - - expect(result.value?.count).to(equal(3)) - } - } - } -} diff --git a/PistachioTests/DictionaryAdapterSpec.swift b/PistachioTests/DictionaryAdapterSpec.swift new file mode 100644 index 0000000..7e2cd1f --- /dev/null +++ b/PistachioTests/DictionaryAdapterSpec.swift @@ -0,0 +1,26 @@ +// Copyright (c) 2015 Felix Jendrusch. All rights reserved. + +import Quick +import Nimble + +import Pistachio + +class DictionaryAdapterSpec: QuickSpec { + override func spec() { + describe("A DictionaryAdapter") { + var adapter = CounterAdapters.anyObject + + it("should transform a value") { + let result = adapter.transform(Counter(count: 1)) + + expect((result.value as? [String: AnyObject])?["count"] as? Int).to(equal(1)) + } + + it("should reverse transform a value") { + let result = adapter.reverseTransform([ "count": 1 ]) + + expect(result.value).to(equal(Counter(count: 1))) + } + } + } +} diff --git a/PistachioTests/Extensions/LensExtensionsSpec.swift b/PistachioTests/Extensions/LensExtensionsSpec.swift new file mode 100644 index 0000000..086a8bf --- /dev/null +++ b/PistachioTests/Extensions/LensExtensionsSpec.swift @@ -0,0 +1,69 @@ +// Copyright (c) 2015 Felix Jendrusch. All rights reserved. + +import Quick +import Nimble + +import Result +import Monocle +import Pistachio + +class LensExtensionsSpec: QuickSpec { + override func spec() { + describe("Lifted lenses") { + context("for results") { + let counter = Counter(count: 1) + let error = NSError() + + let lifted: Lens, Result> = lift(CounterLenses.count) + + it("should get values") { + let result = get(lifted, Result.success(counter)) + + expect(result.value).to(equal(1)) + } + + it("should return structure failures on get") { + let result = get(lifted, Result.failure(error)) + + expect(result.error).to(beIdenticalTo(error)) + } + + it("should set values") { + let result = set(lifted, Result.success(counter), Result.success(1)) + + expect(result.value?.count).to(equal(1)) + } + + it("should return structure failures on set") { + let result = set(lifted, Result.failure(error), Result.success(1)) + + expect(result.error).to(beIdenticalTo(error)) + } + + it("should return value failures on set") { + let result = set(lifted, Result.success(counter), Result.failure(error)) + + expect(result.error).to(beIdenticalTo(error)) + } + } + } + + describe("Mapped lenses") { + let counter = Counter(count: 0) + + let mapped = map(CounterLenses.count, AnyObjectValueTransformers.int) + + it("should get values") { + let result = get(mapped, Result.success(counter)) + + expect(result.value as? Int).to(equal(0)) + } + + it("should set values") { + let result = set(mapped, Result.success(counter), Result.success(2)) + + expect(result.value?.count).to(equal(2)) + } + } + } +} diff --git a/PistachioTests/Fixtures/Counter.swift b/PistachioTests/Fixtures/Counter.swift new file mode 100644 index 0000000..e48c29d --- /dev/null +++ b/PistachioTests/Fixtures/Counter.swift @@ -0,0 +1,25 @@ +// Copyright (c) 2015 Felix Jendrusch. All rights reserved. + +import ValueTransformer +import Monocle +import Pistachio + +struct Counter: Equatable { + var count: Int +} + +func == (lhs: Counter, rhs: Counter) -> Bool { + return lhs.count == rhs.count +} + +struct CounterLenses { + static let count = Lens(get: { $0.count }, set: { (inout counter: Counter, count) in + counter.count = count + }) +} + +struct CounterAdapters { + static let anyObject = DictionaryAdapter(specification: [ + "count": map(CounterLenses.count, AnyObjectValueTransformers.int) + ], dictionaryTransformer: AnyObjectValueTransformers.dictionary, value: Counter(count: 0)) +} diff --git a/PistachioTests/Fixtures/Node.swift b/PistachioTests/Fixtures/Node.swift new file mode 100644 index 0000000..43fa8b4 --- /dev/null +++ b/PistachioTests/Fixtures/Node.swift @@ -0,0 +1,27 @@ +// Copyright (c) 2015 Felix Jendrusch. All rights reserved. + +import ValueTransformer +import Monocle +import Pistachio + +struct Node: Equatable { + var children: [Node] +} + +func == (lhs: Node, rhs: Node) -> Bool { + return lhs.children == rhs.children +} + +struct NodeLenses { + static let children = Lens(get: { $0.children }, set: { (inout node: Node, children) in + node.children = children + }) +} + +struct NodeAdapters { + static let anyObject = fix { adapter in + return DictionaryAdapter(specification: [ + "children": map(NodeLenses.children, lift(adapter) >>> AnyObjectValueTransformers.array) + ], dictionaryTransformer: AnyObjectValueTransformers.dictionary, value: Node(children: [])) + } +} diff --git a/PistachioTests/Fixtures/Value Transformers/AnyObjectValueTransformers.swift b/PistachioTests/Fixtures/Value Transformers/AnyObjectValueTransformers.swift new file mode 100644 index 0000000..15861e5 --- /dev/null +++ b/PistachioTests/Fixtures/Value Transformers/AnyObjectValueTransformers.swift @@ -0,0 +1,39 @@ +// Copyright (c) 2015 Felix Jendrusch. All rights reserved. + +import Result +import ValueTransformer + +struct AnyObjectValueTransformers { + static let int = ReversibleValueTransformer(transformClosure: { value in + return Result.success(value) + }, reverseTransformClosure: { transformedValue in + switch transformedValue { + case let transformedValue as Int: + return Result.success(transformedValue) + default: + return Result.failure(NSError()) + } + }) + + static let array = ReversibleValueTransformer<[AnyObject], AnyObject, NSError>(transformClosure: { value in + return Result.success(value) + }, reverseTransformClosure: { transformedValue in + switch transformedValue { + case let transformedValue as [AnyObject]: + return Result.success(transformedValue) + default: + return Result.failure(NSError()) + } + }) + + static let dictionary = ReversibleValueTransformer<[String: AnyObject], AnyObject, NSError>(transformClosure: { value in + return Result.success(value) + }, reverseTransformClosure: { transformedValue in + switch transformedValue { + case let transformedValue as [String: AnyObject]: + return Result.success(transformedValue) + default: + return Result.failure(NSError()) + } + }) +} diff --git a/PistachioTests/LazyAdapterSpec.swift b/PistachioTests/LazyAdapterSpec.swift new file mode 100644 index 0000000..7d22eb5 --- /dev/null +++ b/PistachioTests/LazyAdapterSpec.swift @@ -0,0 +1,26 @@ +// Copyright (c) 2015 Felix Jendrusch. All rights reserved. + +import Quick +import Nimble + +import Pistachio + +class LazyAdapterSpec: QuickSpec { + override func spec() { + describe("A LazyAdapter") { + let adapter = NodeAdapters.anyObject + + it("should transform a value") { + let result = adapter.transform(Node(children: [ Node(children: []) ])) + + expect(((result.value as? [String: AnyObject])?["children"] as? [AnyObject])?.count).to(equal(1)) + } + + it("should reverse transform a value") { + let result = adapter.reverseTransform([ "children": [ [ "children": [] ] ] ]) + + expect(result.value).to(equal(Node(children: [ Node(children: []) ]))) + } + } + } +} diff --git a/PistachioTests/LensSpec.swift b/PistachioTests/LensSpec.swift deleted file mode 100644 index 077ebd4..0000000 --- a/PistachioTests/LensSpec.swift +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright (c) 2015 Robert Böhnke. All rights reserved. - -import Quick -import Nimble - -import LlamaKit -import Pistachio - -struct Inner: Equatable { - var count: Int -} - -func == (lhs: Inner, rhs: Inner) -> Bool { - return lhs.count == rhs.count -} - -struct Outer: Equatable { - var count: Int - - var inner: Inner - - init(count: Int = 0, inner: Inner = Inner(count: 0)) { - self.count = count - self.inner = inner - } -} - -func == (lhs: Outer, rhs: Outer) -> Bool { - return lhs.count == rhs.count && lhs.inner == rhs.inner -} - -struct OuterLenses { - static let count = Lens(get: { $0.count }, set: { (inout outer: Outer, count) in - outer.count = count - }) - - static let inner = Lens(get: { $0.inner }, set: { (inout outer: Outer, inner) in - outer.inner = inner - }) -} - -struct InnerLenses { - static let count = Lens(get: { $0.count }, set: { (inout inner: Inner, count) in - inner.count = count - }) -} - -class LensSpec: QuickSpec { - override func spec() { - describe("A Lens") { - let example: Outer = Outer(count: 2) - - let count = OuterLenses.count - - it("should get values") { - expect(get(count, example)!).to(equal(2)) - } - - it("should set values") { - expect(set(count, example, 4)).to(equal(Outer(count: 4))) - } - - it("should modify values") { - expect(mod(count, example, { $0 + 2 })).to(equal(Outer(count: 4))) - } - } - - describe("A composed Lens") { - let example = Outer(count: 0, inner: Inner(count: 2)) - - let innerCount = OuterLenses.inner >>> InnerLenses.count - - it("should get values") { - expect(get(innerCount, example)!).to(equal(2)) - } - - it("should set values") { - expect(set(innerCount, example, 4)).to(equal(Outer(count: 0, inner: Inner(count: 4)))) - } - - it("should modify values") { - expect(mod(innerCount, example, { $0 + 2 })).to(equal(Outer(count: 0, inner: Inner(count: 4)))) - } - } - - describe("Lifted lenses") { - context("for arrays") { - let inner = [ - Inner(count: 1), - Inner(count: 2), - Inner(count: 3), - Inner(count: 4) - ] - - let lifted = lift(InnerLenses.count) - - it("should get values") { - let result = get(lifted, inner) - - expect(result).to(equal([ 1, 2, 3, 4 ])) - } - - it("should set values") { - let result = set(lifted, inner, [ 2, 4, 6, 8 ]) - - expect(result).to(equal([ - Inner(count: 2), - Inner(count: 4), - Inner(count: 6), - Inner(count: 8) - ])) - } - - it("should reduce the resulting array size accordingly") { - // Does this make sense? - let result = set(lifted, inner, [ 42 ]) - - expect(result).to(equal([ - Inner(count: 42) - ])) - } - } - - context("for results") { - let inner = Inner(count: 5) - let error = NSError() - - let lifted: Lens, Result> = lift(InnerLenses.count) - - it("should get values") { - let result = get(lifted, success(inner)) - - expect(result.value).to(equal(5)) - } - - it("should return structure failures on get") { - let result = get(lifted, failure(error)) - - expect(result.error).to(beIdenticalTo(error)) - } - - it("should set values") { - let result = set(lifted, success(inner), success(3)) - - expect(result.value?.count).to(equal(3)) - } - - it("should return structure failures on set") { - let result = set(lifted, failure(error), success(3)) - - expect(result.error).to(beIdenticalTo(error)) - } - - it("should return value failures on set") { - let result = set(lifted, success(inner), failure(error)) - - expect(result.error).to(beIdenticalTo(error)) - } - } - } - - describe("Transformed lenses") { - let outer = Outer(count: 0) - - let transformed = transform(lift(OuterLenses.count), ValueTransformers.string) - - it("should get values") { - let result = get(transformed, success(outer)) - - expect(result.value).to(equal("0")) - } - - it("should set values") { - let result = set(transformed, success(outer), success("2")) - - expect(result.value?.count).to(equal(2)) - } - } - - describe("Split lenses") { - let outer = Outer(count: 2, inner: Inner(count: 4)) - let inner = Inner(count: 9) - - let both = OuterLenses.count *** InnerLenses.count - - it("should get values") { - let result = get(both, (outer, inner)) - - expect(result.0).to(equal(2)) - expect(result.1).to(equal(9)) - } - - it("should set values") { - let result = set(both, (outer, inner), (12, 34)) - - expect(result.0.count).to(equal(12)) - expect(result.0.inner.count).to(equal(4)) - expect(result.1.count).to(equal(34)) - } - } - - describe("Fanned out lenses") { - let example = Outer(count: 0, inner: Inner(count: 2)) - - let both = OuterLenses.count &&& (OuterLenses.inner >>> InnerLenses.count) - - it("should get values") { - let result = get(both, example) - - expect(result.0).to(equal(0)) - expect(result.1).to(equal(2)) - } - - it("should set values") { - let result = set(both, example, (12, 34)) - - expect(result.count).to(equal(12)) - expect(result.inner.count).to(equal(34)) - } - } - } -} diff --git a/PistachioTests/UtilsSpec.swift b/PistachioTests/UtilsSpec.swift deleted file mode 100644 index 6e7f094..0000000 --- a/PistachioTests/UtilsSpec.swift +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) 2015 Felix Jendrusch. All rights reserved. - -import Quick -import Nimble - -import Pistachio - -class UtilsSpec: QuickSpec { - override func spec() { - describe("zip") { - it("should zip two arrays") { - // Tuples do not conform to Equatable. - let result = zip([ 1, 2 ], [ 2, 4, 6 ]).map { (a, b) in [ a, b ] } - - expect(result).to(equal([ [ 1, 2 ], [ 2, 4 ] ])) - } - } - - describe("unzip") { - it("should unzip an array of tuples") { - let (a, b) = unzip([ (1, 2), (2, 4) ]) - - expect(a).to(equal([ 1, 2 ])) - expect(b).to(equal([ 2, 4 ])) - } - } - } -} diff --git a/PistachioTests/ValueTransformerSpec.swift b/PistachioTests/ValueTransformerSpec.swift deleted file mode 100644 index 7630cd1..0000000 --- a/PistachioTests/ValueTransformerSpec.swift +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright (c) 2015 Felix Jendrusch. All rights reserved. - -import Quick -import Nimble - -import LlamaKit -import Pistachio - -struct ValueTransformers { - static let string: ValueTransformer = ValueTransformer(transformClosure: { value in - return success(String(value)) - }, reverseTransformClosure: { value in - if let value = value.toInt() { - return success(value) - } else { - return failure(NSError()) - } - }) -} - -class ValueTransformerSpec: QuickSpec { - override func spec() { - describe("A ValueTransformer") { - let valueTransformer = ValueTransformers.string - - it("should transform a value") { - let result = valueTransformer.transformedValue(1) - - expect(result.value).to(equal("1")) - } - - it("should reverse transform a value") { - let result = valueTransformer.reverseTransformedValue("2") - - expect(result.value).to(equal(2)) - } - - it("should fail if its value transformation fails") { - let result = valueTransformer.reverseTransformedValue("2.5") - - expect(result.isSuccess).to(beFalse()) - } - } - - describe("A flipped ValueTransformer") { - let valueTransformer = flip(ValueTransformers.string) - - it("should transform a value") { - let result = valueTransformer.transformedValue("3") - - expect(result.value).to(equal(3)) - } - - it("should fail if its value transformation fails") { - let result = valueTransformer.transformedValue("3.5") - - expect(result.isSuccess).to(beFalse()) - } - - it("should reverse transform a value") { - let result = valueTransformer.reverseTransformedValue(4) - - expect(result.value).to(equal("4")) - } - } - - describe("A composed ValueTransformer") { - let valueTransformer = ValueTransformers.string >>> flip(ValueTransformers.string) - - it("should transform a value") { - let result = valueTransformer.transformedValue(5) - - expect(result.value).to(equal(5)) - } - - it("should reverse transform a value") { - let result = valueTransformer.reverseTransformedValue(6) - - expect(result.value).to(equal(6)) - } - } - - describe("Lifted value transformers") { - context("for dictionaries") { - let valueTransformer: ValueTransformer = lift([ "one": 1, "two": 2 ], 0, "null") - - it("should transform a value") { - let result = valueTransformer.transformedValue("one") - - expect(result.value).to(equal(1)) - } - - it("should return the default transformed value if the input is not mapped") { - let result = valueTransformer.transformedValue("three") - - expect(result.value).to(equal(0)) - } - - it("should reverse transform a value") { - let result = valueTransformer.reverseTransformedValue(2) - - expect(result.value).to(equal("two")) - } - - it("should return the default reverse transformed value if the input is not reverse mapped") { - let result = valueTransformer.reverseTransformedValue(3) - - expect(result.value).to(equal("null")) - } - } - - context("for optionals") { - let valueTransformer = lift(ValueTransformers.string, "default") - - it("should transform a value") { - let result = valueTransformer.transformedValue(7) - - expect(result.value).to(equal("7")) - } - - it("should return the default transformed value if the input is nil") { - let result = valueTransformer.transformedValue(nil) - - expect(result.value).to(equal("default")) - } - - it("should reverse transform a value") { - let result = valueTransformer.reverseTransformedValue("8") - - expect(result.value!).to(equal(8)) - } - - it("should return nil if the input is the default transformed value") { - let result = valueTransformer.reverseTransformedValue("default") - - expect(result.value!).to(beNil()) - } - } - - context("for arrays") { - let valueTransformer = lift(ValueTransformers.string) - - it("should transform a value") { - let result = valueTransformer.transformedValue([ 9, 10 ]) - - expect(result.value).to(equal([ "9", "10" ])) - } - - it("should reverse transform a value") { - let result = valueTransformer.reverseTransformedValue([ "11", "12" ]) - - expect(result.value).to(equal([ 11, 12 ])) - } - - it("should fail if any of its value transformations fail") { - let result = valueTransformer.reverseTransformedValue([ "13", "13.5" ]) - - expect(result.isSuccess).to(beFalse()) - } - } - } - } -} diff --git a/README.md b/README.md index 67b52e8..fa6087f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Pistachio -Pistachio is a generic model framework for Swift. By leveraging [lenses](http://chris.eidhof.nl/posts/lenses-in-swift.html) and value transformers, it allows you to create type safe adapters for any recursive data structure, be it JSON, YAML or XML. +Pistachio is a generic model framework. By leveraging [lenses](http://chris.eidhof.nl/posts/lenses-in-swift.html) and value transformers, it allows you to create type safe adapters for any recursive data structure, be it JSON, YAML or XML. If you are already familiar with [Argo](https://github.com/thoughtbot/Argo), take a look at [Pistachiargo](https://github.com/felixjendrusch/Pistachiargo). @@ -8,37 +8,21 @@ If you are already familiar with [Argo](https://github.com/thoughtbot/Argo), tak ### Carthage -[Carthage](https://github.com/Carthage/Carthage) is a simple, decentralized dependency manager for Cocoa. You can install it with [Homebrew](http://brew.sh) using the following commands: - -``` -$ brew update -$ brew install carthage -``` +[Carthage](https://github.com/Carthage/Carthage) is a simple, decentralized dependency manager for Cocoa. 1. Add Pistachio to your [Cartfile](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#cartfile): + ``` - github "felixjendrusch/Pistachio" ~> 0.1 + github "felixjendrusch/Pistachio" ~> 0.2 ``` 2. Run `carthage update` to fetch and build Pistachio and its dependencies. -3. On your application target's "General" settings tab, in the "Linked Frameworks and Libraries" section, add the following frameworks from the [Carthage/Build](https://github.com/Carthage/Carthage/blob/master/Documentation/Artifacts.md#carthagebuild) folder on disk: - - `Pistachio.framework` - -4. On your application target's "Build Phases" settings tab, click the "+" icon and choose "New Run Script Phase". Create a Run Script with the following contents: - ``` - /usr/local/bin/carthage copy-frameworks - ``` - and add the following paths to the frameworks under "Input Files": - ``` - $(SRCROOT)/Carthage/Build/iOS/LlamaKit.framework - $(SRCROOT)/Carthage/Build/iOS/Pistachio.framework - ``` - This script works around an [App Store submission bug](http://www.openradar.me/radar?id=6409498411401216) triggered by universal binaries. +3. [Make sure your application's target links against `Pistachio.framework` and copies all relevant frameworks into its application bundle (iOS); or embeds the binaries of all relevant frameworks (Mac).](https://github.com/carthage/carthage#getting-started) ## Usage -Let's start with defining a simple model: +Let's start by defining a very simple model: ```swift struct Origin { @@ -84,7 +68,7 @@ struct PersonLenses { } ``` -They can be used to access and modify your model: +It can be used to access and modify your model: ```swift var person = Person(name: "Felix", origin: Origin(city: "Berlin")) @@ -92,7 +76,7 @@ person = set(PersonLenses.name, person, "Robb") get(PersonLenses.name, person) // == "Robb" ``` -And you can compose, lift, transform, [...](https://github.com/felixjendrusch/Pistachio/blob/master/Pistachio/Lens.swift) them: +And you can [compose, lift, etc.](https://github.com/robb/Monocle/blob/master/Monocle/Lens.swift) them: ```swift let composed = PersonLenses.origin >>> OriginLenses.city @@ -100,102 +84,43 @@ person = set(composed, person, "New York") get(composed, person) // == "New York" ``` -```swift -var persons = [ person ] - -let arrayLifted: Lens<[Person], [String]> = lift(composed) -persons = set(arrayLifted, [ person ], [ "San Francisco" ]) -get(arrayLifted, persons) // == [ "San Francisco" ] -``` - -```swift -var result: Result<[Person], NSError> = success(persons) - -let resultLifted: Lens, Result<[String], NSError>> = lift(arrayLifted) -result = set(resultLifted, result, success([ "London" ])) -get(resultLifted, result) // == .Success(Box([ "London" ])) -``` - -```swift -let valueTransformer: ValueTransformer = SocialSecurityNumberValueTransformer - -let transformed = transform(PersonLenses.name, valueTransformer) -person = set(transformed, person, 1234567890) -get(PersonLenses.name, person) // == "Felix" -``` - -Value transformers can be flipped, composed and lifted: - -```swift -let flipped = flip(valueTransformer) -flipped.transformedValue(1234567890) // == "Felix" -``` - -```swift -let composed = flipped >>> UppercaseValueTransformer -flipped.transformedValue(1234567890) // == "FELIX" -``` - -```swift -let dictionaryLifted = lift([ "Felix": 1234567890 ], 0, "Unknown") -dictionaryLifted.transformedValue("Felix") // == 1234567890 -dictionaryLifted.transformedValue("Hans") // == 0 -dictionaryLifted.reverseTransformedValue(1234567890) // == "Felix" -dictionaryLifted.reverseTransformedValue(0) // == "Unknown" -``` - -```swift -let optionalLifted = lift(UppercaseValueTransformer, "") -optionalLifted.transformedValue("Felix") // == "FELIX" -optionalLifted.transformedValue(nil) // == "" -optionalLifted.reverseTransformedValue("FELIX") // == "felix" -optionalLifted.reverseTransformedValue("") // == nil -``` - -```swift -let arrayLifted = lift(UppercaseValueTransformer) -arrayLifted.transformedValue([ "Felix", "Robb" ]) // == [ "FELIX", "ROBB" ] -``` - With lenses and value transformers, you can create adapters for your models: ```swift struct Adapters { static let origin = DictionaryAdapter(specification: [ - "city_name": transform(OriginLenses.city, StringToAnyObjectValueTransformers) - ], dictionaryTansformer: DictionaryToAnyObjectValueTransformers) + "city_name": map(OriginLenses.city, StringToAnyObjectValueTransformers) + ], dictionaryTansformer: DictionaryToAnyObjectValueTransformers, value: Origin()) static let person = DictionaryAdapter(specification: [ - "name": transform(PersonLenses.name, StringToAnyObjectValueTransformers), - "origin": transform(PersonLenses.origin, lift(origin, Origin())) - ], dictionaryTansformer: DictionaryToAnyObjectValueTransformers) + "name": map(PersonLenses.name, StringToAnyObjectValueTransformers), + "origin": map(PersonLenses.origin, origin) + ], dictionaryTansformer: DictionaryToAnyObjectValueTransformers, value: Person()) } ``` -Uh, what was that? Right, the `origin` adapter was lifted into a value transformer. - Use `fix` to create adapters for recursive models: ```swift -let adapter: DictionaryAdapter = fix { adapter in +let adapter: DictionaryAdapter = fix { adapter in // use `adapter` to reference the currently created adapter } ``` -Adapters handle encoding to and decoding from data: +Adapters handle transforming and reverse transforming your models: ```swift let adapter = Adapters.person var person = Person(name: "Seb", origin: Origin(city: "Berlin")) -var data = adapter.encode(person) +var data = adapter.transform(person) // == .Success(Box([ "name": "Seb", "origin": [ "city_name": "Berlin" ] ])) -adapter.decode(Person(), from: data.value!) +adapter.reverseTransform(data.value!) // == .Success(Box(person)) ``` -Both `encode` and `decode` return a [`LlamaKit.Result`](https://github.com/LlamaKit/LlamaKit/blob/master/LlamaKit/Result.swift), which either holds the encoded/decoded value or an error. This enables you to gracefully handle coding errors. +Both `transform` and `reverseTransform` return a [`Result`](https://github.com/antitypical/Result/blob/master/Result/Result.swift), which either holds the (reverse) transformed value or an error. This enables you to gracefully handle transformation errors. ## Posts