diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index 33106e2..babc0c3 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -26,13 +26,14 @@ 67EA2EAAA69C58771FCE840407E412A0 /* ModelUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4905AE6432A13C6CB3BF8EE61B4B27DE /* ModelUpdate.swift */; }; 6AAFB6DE0190A7724B69761422D79781 /* GridCollectionViewController+DataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = B88CF909A27C81A9EB3C42BD41C0F73F /* GridCollectionViewController+DataSource.swift */; }; 6BFD435302B95F467423026B791A20F9 /* BinderDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0B864FB590DA1068C03C7921CDEC419 /* BinderDataSource.swift */; }; - 6F2A1C3C62783CFAA537D48AEF482661 /* ThrottlePipe.swift in Sources */ = {isa = PBXBuildFile; fileRef = B511E6D087F10FB99816BAD75DCD59DB /* ThrottlePipe.swift */; }; 7BBFD595AC0FA8B1B508442922C10F77 /* GridCollectionViewController+CellRegistration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DB44C95A4AB76BEAE15BCB899C37E7E /* GridCollectionViewController+CellRegistration.swift */; }; 7EAF52876E64115CCA4EDDC59FC0F616 /* GridCollectionDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26AA0D9C22D96CF87BD5FE2FA9780DA7 /* GridCollectionDataSource.swift */; }; 81D9810791F3629818DA5D23F0F30B5A /* PromisePipe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2BE3D9394B557B319D8C36657743A2DC /* PromisePipe.swift */; }; 856DEDFB8D967A4A3321266DD82DDCCB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB4607EFCA7C5F75397649E792E2AFCB /* Foundation.framework */; }; 92039126B8CDD22842D4CBECD31C5E34 /* PowerTools-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C7F1AF36D9EFBAF6A61672AB39EB9811 /* PowerTools-dummy.m */; }; 95ACE188B09C59D65BDD30BF752D13C3 /* Pipeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = C481C5EA10F3A7C6B27A038D4812F320 /* Pipeline.swift */; }; + 9705FDD922B633C700F890D7 /* AbstractPipeline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9705FDD822B633C700F890D7 /* AbstractPipeline.swift */; }; + 9705FDDB22B6341300F890D7 /* AsyncPromisePipe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9705FDDA22B6341300F890D7 /* AsyncPromisePipe.swift */; }; 98122E3910A9B38435FB5844B8092ACA /* InteractionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83363268CD7A88D8172E497AAFDDA8BE /* InteractionDelegate.swift */; }; 9DC69517E1D84A04FEB205842466F491 /* Array.swift in Sources */ = {isa = PBXBuildFile; fileRef = 35253A7C6EB669A6F954B6FE387B30C3 /* Array.swift */; }; A0E46AC8BCB3EC0E65D0EF78CA9C1470 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB4607EFCA7C5F75397649E792E2AFCB /* Foundation.framework */; }; @@ -77,10 +78,10 @@ 2B490396361FE22A1977EF93EF893E69 /* Pods-PowerTools_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-PowerTools_Tests.modulemap"; sourceTree = ""; }; 2BE3D9394B557B319D8C36657743A2DC /* PromisePipe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = PromisePipe.swift; sourceTree = ""; }; 2EEF1616FCA18CF593E1E76AA5C92405 /* InteractionFactory.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InteractionFactory.swift; sourceTree = ""; }; - 30D99FAAF339E8F913685366FD9ED18D /* PowerTools.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = PowerTools.framework; path = PowerTools.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 30D99FAAF339E8F913685366FD9ED18D /* PowerTools.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PowerTools.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 32248BF2B85D9F1007668FDD63AEBCAD /* Pods-PowerTools_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PowerTools_Tests.release.xcconfig"; sourceTree = ""; }; 35253A7C6EB669A6F954B6FE387B30C3 /* Array.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Array.swift; sourceTree = ""; }; - 3CE855517B3478C70F01410802E9A459 /* Pods_PowerTools_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_PowerTools_Example.framework; path = "Pods-PowerTools_Example.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 3CE855517B3478C70F01410802E9A459 /* Pods_PowerTools_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PowerTools_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 44997CFC6DEFC565AA8E7CCA67B8CC5E /* AbstractBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AbstractBuilder.swift; sourceTree = ""; }; 4905AE6432A13C6CB3BF8EE61B4B27DE /* ModelUpdate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ModelUpdate.swift; sourceTree = ""; }; 4A0A068821B8AE22ACAA50C192D23DF4 /* SublinePipe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = SublinePipe.swift; sourceTree = ""; }; @@ -91,12 +92,12 @@ 6161BD13E4F26EEDC397AB9E74D2FAA1 /* PowerTools-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "PowerTools-prefix.pch"; sourceTree = ""; }; 61FC2E80D3F56B6BD85E061A4C3CA1AF /* DirectionableContainer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DirectionableContainer.swift; sourceTree = ""; }; 6508D79D70D87F39C1D9FA4F6F0181CB /* GridItem.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GridItem.swift; sourceTree = ""; }; - 6A8C920C707FDAB067B932BC0CD81121 /* PowerTools.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; path = PowerTools.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 6A8C920C707FDAB067B932BC0CD81121 /* PowerTools.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = PowerTools.podspec; sourceTree = ""; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 77A32F2DCA944F58CE382FE5870C9E94 /* DispatchTime.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = DispatchTime.swift; sourceTree = ""; }; 78096ACAC843CE1CFC8ECA423DC909B8 /* PowerTools.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = PowerTools.modulemap; sourceTree = ""; }; 78848B999F9D0FD138CE88E6586F22A8 /* GridCollectionDataSource+Internal.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "GridCollectionDataSource+Internal.swift"; sourceTree = ""; }; 7A384E191795275BF2A4DC4FCD729E87 /* GridDescriptor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GridDescriptor.swift; sourceTree = ""; }; - 7CB40B04A677E71E9EA2D96E6E8933C5 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; path = LICENSE; sourceTree = ""; }; + 7CB40B04A677E71E9EA2D96E6E8933C5 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 83363268CD7A88D8172E497AAFDDA8BE /* InteractionDelegate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InteractionDelegate.swift; sourceTree = ""; }; 913E3BD1417C2F558150CE5812BCC0D7 /* Pods-PowerTools_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-PowerTools_Example.modulemap"; sourceTree = ""; }; 91BD1F69BABB0536FED70BA798AF9FAE /* Pods-PowerTools_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-PowerTools_Example-acknowledgements.markdown"; sourceTree = ""; }; @@ -104,10 +105,12 @@ 95A06305E19D1D11C43C86FFF3A995B8 /* BatchUpdateView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = BatchUpdateView.swift; sourceTree = ""; }; 95FD134CB2C983357EED50BC84154D18 /* Pods-PowerTools_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-PowerTools_Tests-acknowledgements.markdown"; sourceTree = ""; }; 96918753A8DF5F56D143A4E7C85E90E1 /* Pods-PowerTools_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PowerTools_Example-acknowledgements.plist"; sourceTree = ""; }; + 9705FDD822B633C700F890D7 /* AbstractPipeline.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AbstractPipeline.swift; sourceTree = ""; }; + 9705FDDA22B6341300F890D7 /* AsyncPromisePipe.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AsyncPromisePipe.swift; sourceTree = ""; }; 97091FCCE9D05F68FC147A4367535FD7 /* PowerTools-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "PowerTools-Info.plist"; sourceTree = ""; }; 9C31E973BAC6A8206A22E389C19DA233 /* ItemViewModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ItemViewModel.swift; sourceTree = ""; }; - 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - 9DF5F276D0E595BF9A78DDF187589004 /* Pods_PowerTools_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_PowerTools_Tests.framework; path = "Pods-PowerTools_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 9DF5F276D0E595BF9A78DDF187589004 /* Pods_PowerTools_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_PowerTools_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9EFEC96A51AA0C94F59B69A747DB888F /* Pods-PowerTools_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-PowerTools_Example-dummy.m"; sourceTree = ""; }; 9FB1A0700BEA5E9872677D64429B15BA /* Pods-PowerTools_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PowerTools_Example.debug.xcconfig"; sourceTree = ""; }; A0BBBBBE22EDA741C168FDD9FFD907B8 /* Pods-PowerTools_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-PowerTools_Example.release.xcconfig"; sourceTree = ""; }; @@ -116,7 +119,6 @@ A93F4164A1CFE144E81038E542C0132F /* PowerTools.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = PowerTools.xcconfig; sourceTree = ""; }; AA0C6F06A49583AA19E5FFFF4EDF7B5C /* Pods-PowerTools_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PowerTools_Example-Info.plist"; sourceTree = ""; }; B028F62D0C3C6B10EA49A9F6689BB1A0 /* Pods-PowerTools_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-PowerTools_Tests-dummy.m"; sourceTree = ""; }; - B511E6D087F10FB99816BAD75DCD59DB /* ThrottlePipe.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ThrottlePipe.swift; sourceTree = ""; }; B88CF909A27C81A9EB3C42BD41C0F73F /* GridCollectionViewController+DataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "GridCollectionViewController+DataSource.swift"; sourceTree = ""; }; BCAEA621FFA2D8C764520C84E6A52074 /* Merge.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Merge.swift; sourceTree = ""; }; BF3ECD4F4E5AAFEB100C996EDD6B6E01 /* GridCollectionViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = GridCollectionViewController.swift; sourceTree = ""; }; @@ -126,7 +128,7 @@ CAABD09A7AF12A59B85B035F3921A658 /* CollectionBinderDataSource.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CollectionBinderDataSource.swift; sourceTree = ""; }; CB4607EFCA7C5F75397649E792E2AFCB /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; DADB4AC9BCBF5A3AB7C5CEE21EB2734A /* CollectionDirectionableContainer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = CollectionDirectionableContainer.swift; sourceTree = ""; }; - DE07C4A3BE9A4B6DECCAC44E2DA24A7B /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; path = README.md; sourceTree = ""; }; + DE07C4A3BE9A4B6DECCAC44E2DA24A7B /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; E19E9A7614A357C36DE902E2B5EB2AB8 /* Pods-PowerTools_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-PowerTools_Example-umbrella.h"; sourceTree = ""; }; E30C2911E9C43B923F01C3CEE454DB00 /* Pods-PowerTools_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-PowerTools_Tests-Info.plist"; sourceTree = ""; }; F22167648DD557D1DA99161D484E201A /* UICollectionView+ViewBatchUpdate.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = "UICollectionView+ViewBatchUpdate.swift"; sourceTree = ""; }; @@ -192,9 +194,8 @@ 0FC4D4CBB31BBACAA1C94D06117DEB45 /* Pipe.swift */, 2BE3D9394B557B319D8C36657743A2DC /* PromisePipe.swift */, 4A0A068821B8AE22ACAA50C192D23DF4 /* SublinePipe.swift */, - B511E6D087F10FB99816BAD75DCD59DB /* ThrottlePipe.swift */, + 9705FDDA22B6341300F890D7 /* AsyncPromisePipe.swift */, ); - name = Pipes; path = Pipes; sourceTree = ""; }; @@ -254,7 +255,6 @@ 61FC2E80D3F56B6BD85E061A4C3CA1AF /* DirectionableContainer.swift */, 5396F3B606028ED72675B61A86DC291D /* GridModule.swift */, ); - name = SizeModule; path = SizeModule; sourceTree = ""; }; @@ -324,6 +324,7 @@ C32BBE72DCCBF7C4068F8FAA7413CB84 /* Pipeline */ = { isa = PBXGroup; children = ( + 9705FDD822B633C700F890D7 /* AbstractPipeline.swift */, C481C5EA10F3A7C6B27A038D4812F320 /* Pipeline.swift */, 2A5568CD5C28278D43A27A8CDFC9CEF5 /* Pipes */, ); @@ -541,6 +542,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, ); mainGroup = CF1408CF629C7361332E53B88F7BD30C; @@ -617,13 +619,14 @@ 460CA8B3AC070B90E220478AD3531C1F /* Merge.swift in Sources */, 67EA2EAAA69C58771FCE840407E412A0 /* ModelUpdate.swift in Sources */, 046C275BEFF94704150FE7FA208F83C3 /* Pipe.swift in Sources */, + 9705FDDB22B6341300F890D7 /* AsyncPromisePipe.swift in Sources */, 95ACE188B09C59D65BDD30BF752D13C3 /* Pipeline.swift in Sources */, 92039126B8CDD22842D4CBECD31C5E34 /* PowerTools-dummy.m in Sources */, 81D9810791F3629818DA5D23F0F30B5A /* PromisePipe.swift in Sources */, F9E27430FC5CE60877D16F2EEF1C3CD9 /* SectionViewModel.swift in Sources */, 2392E9F691DAC251C22AD1FCAB2165AE /* SublinePipe.swift in Sources */, - 6F2A1C3C62783CFAA537D48AEF482661 /* ThrottlePipe.swift in Sources */, 21DD96E965A5E3732B6203CD7D4D190A /* UICollectionView+ViewBatchUpdate.swift in Sources */, + 9705FDD922B633C700F890D7 /* AbstractPipeline.swift in Sources */, A877F3ADDE4154FFA6AD9F22151B5BE7 /* View.swift in Sources */, 2DFAD8D3FE5C955531C1F394BF84CB56 /* ViewController.swift in Sources */, ); @@ -936,8 +939,7 @@ MTL_FAST_MATH = YES; PRODUCT_NAME = "$(TARGET_NAME)"; STRIP_INSTALLED_PRODUCT = NO; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 4.2; SYMROOT = "${SRCROOT}/../build"; }; diff --git a/Example/PowerTools.xcodeproj/project.pbxproj b/Example/PowerTools.xcodeproj/project.pbxproj index cbef628..a921ab0 100644 --- a/Example/PowerTools.xcodeproj/project.pbxproj +++ b/Example/PowerTools.xcodeproj/project.pbxproj @@ -13,6 +13,7 @@ 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; 92996D832F3E34BA04E3E515 /* Pods_PowerTools_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DDC0DF49510CE77B0C060F52 /* Pods_PowerTools_Example.framework */; }; + 9705FDDD22B63AD700F890D7 /* PipeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9705FDDC22B63AD700F890D7 /* PipeTests.swift */; }; 9717B2BF21BB410500C66EE0 /* StringViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9717B2BE21BB410500C66EE0 /* StringViewModel.swift */; }; 9717B2C121BB430800C66EE0 /* StringSectionViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9717B2C021BB430800C66EE0 /* StringSectionViewModel.swift */; }; 9717B2C421BB48A200C66EE0 /* ModelUpdateTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9717B2C321BB48A200C66EE0 /* ModelUpdateTests.swift */; }; @@ -72,6 +73,7 @@ 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 607FACE51AFB9204008FA782 /* PowerTools_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PowerTools_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 9705FDDC22B63AD700F890D7 /* PipeTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PipeTests.swift; sourceTree = ""; }; 9717B2BE21BB410500C66EE0 /* StringViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringViewModel.swift; sourceTree = ""; }; 9717B2C021BB430800C66EE0 /* StringSectionViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringSectionViewModel.swift; sourceTree = ""; }; 9717B2C321BB48A200C66EE0 /* ModelUpdateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModelUpdateTests.swift; sourceTree = ""; }; @@ -245,6 +247,7 @@ isa = PBXGroup; children = ( 9717B2DF21BD30FE00C66EE0 /* PipelineTests.swift */, + 9705FDDC22B63AD700F890D7 /* PipeTests.swift */, 9717B2E421BD3AEA00C66EE0 /* PromisePipeTests.swift */, 977F82AA21D4D8BC0044074A /* SublinePipeTests.swift */, ); @@ -564,6 +567,7 @@ 978E52B422AD3BC6006833C5 /* UIScrollViewDelegateMock.swift in Sources */, 9750D0B92295D5F900E08571 /* ItemViewModelMock.swift in Sources */, 9717B2E521BD3AEA00C66EE0 /* PromisePipeTests.swift in Sources */, + 9705FDDD22B63AD700F890D7 /* PipeTests.swift in Sources */, 9750D09F2292F7D600E08571 /* GridModuleTests.swift in Sources */, 9717B2E821BD472500C66EE0 /* AbstractFactoryTests.swift in Sources */, 9717B2CD21BC08CE00C66EE0 /* StringCell.swift in Sources */, diff --git a/Example/Tests/BaseModels/AssertPipe.swift b/Example/Tests/BaseModels/AssertPipe.swift index bcb75de..e7d90d7 100644 --- a/Example/Tests/BaseModels/AssertPipe.swift +++ b/Example/Tests/BaseModels/AssertPipe.swift @@ -9,18 +9,18 @@ import XCTest import PowerTools -enum PipelineErrors: Error, Equatable { +public enum PipelineErrors: Error, Equatable { case requiredFailure } -class AssertPipe: PowerTools.Pipe { +public class AssertPipe: PowerTools.Pipe { var successExpectation: XCTestExpectation? var failureExpectation: XCTestExpectation? var resetExpectation: XCTestExpectation? - init(success: XCTestExpectation? = nil, failure: XCTestExpectation? = nil, reset: XCTestExpectation? = nil) { + public init(success: XCTestExpectation? = nil, failure: XCTestExpectation? = nil, reset: XCTestExpectation? = nil) { self.successExpectation = success self.failureExpectation = failure @@ -28,28 +28,28 @@ class AssertPipe: PowerTools.Pipe { super.init() } - override func success(_ value: Value) throws { + public override func success(_ value: Value) { guard let exp = self.successExpectation else { XCTFail("success should not be called.") - try super.success(value) - return + self.send(value) + return } exp.fulfill() - try super.success(value) + self.send(value) } - override func failure(_ error: Error) { + public override func failure(_ error: Error) { defer { super.failure(error) } guard let exp = self.failureExpectation else { - return XCTFail("failure should not be called.") + return XCTFail("failure should not be called.") } exp.fulfill() } - override func reset() { + public override func reset() { defer { super.reset() } @@ -59,7 +59,7 @@ class AssertPipe: PowerTools.Pipe { exp.fulfill() } - var expectations: [XCTestExpectation] { + public var expectations: [XCTestExpectation] { var xpt: [XCTestExpectation] = [] if let success = self.successExpectation { diff --git a/Example/Tests/Pipeline/PipeTests.swift b/Example/Tests/Pipeline/PipeTests.swift new file mode 100644 index 0000000..3bbc896 --- /dev/null +++ b/Example/Tests/Pipeline/PipeTests.swift @@ -0,0 +1,50 @@ +// +// PipeTests.swift +// PowerTools_Tests +// +// Created by Andrea Altea on 16/06/2019. +// Copyright © 2019 CocoaPods. All rights reserved. +// + +import XCTest +@testable import PowerTools + +class PipeTests: XCTestCase { + + var pipe: PowerTools.Pipe! + var assertPipe: AssertPipe! + + override func setUp() { + super.setUp() + self.pipe = Pipe() + self.assertPipe = AssertPipe() + self.pipe.nextPipe = assertPipe + } + + override func tearDown() { + self.pipe = nil + self.assertPipe = nil + super.tearDown() + } + + func testPipelineSucccess() { + + assertPipe.successExpectation = expectation(description: "success") + self.pipe.process(.success("")) + wait(for: assertPipe.expectations, timeout: 1.0) + } + + func testPipelineReset() { + + assertPipe.resetExpectation = expectation(description: "reset") + self.pipe.process(.reset) + wait(for: assertPipe.expectations, timeout: 1.0) + } + + func testPipelineFailure() { + + assertPipe.failureExpectation = expectation(description: "failure") + self.pipe.process(.failure(PipelineErrors.requiredFailure)) + wait(for: assertPipe.expectations, timeout: 1.0) + } +} diff --git a/Example/Tests/Pipeline/PipelineTests.swift b/Example/Tests/Pipeline/PipelineTests.swift index bf79e72..9ba5aa6 100644 --- a/Example/Tests/Pipeline/PipelineTests.swift +++ b/Example/Tests/Pipeline/PipelineTests.swift @@ -10,19 +10,19 @@ import XCTest import PowerTools class PipelineTests: XCTestCase { - + var pipeline: Pipeline! override func setUp() { super.setUp() self.pipeline = Pipeline() } - + override func tearDown() { self.pipeline = nil super.tearDown() } - + func testPipelineLoad() { let successExp = expectation(description: "success") @@ -45,8 +45,10 @@ class PipelineTests: XCTestCase { func testPipelineFailure() { - self.pipeline.attach(PromisePipe(success: { _ in throw PipelineErrors.requiredFailure })) - + self.pipeline.attach(PromisePipe(success: { _ in + return .failure(PipelineErrors.requiredFailure) + })) + let failureExp = expectation(description: "failure") let assertPipe = AssertPipe(failure: failureExp) self.pipeline.attach(assertPipe) @@ -54,4 +56,90 @@ class PipelineTests: XCTestCase { self.pipeline.load("") wait(for: assertPipe.expectations, timeout: 1.0) } + + func testHeadPipe() { + + self.pipeline.attach(PromisePipe(success: { value in + XCTAssert(value == "HeadPipe") + return .success(value) + })) + self.pipeline.headPipe = PromisePipe(success: { _ in + return .success("HeadPipe") + }) + let successExp = expectation(description: "success") + let assertPipe = AssertPipe(success: successExp) + self.pipeline.attach(assertPipe) + self.pipeline.load("") + wait(for: assertPipe.expectations, timeout: 1.0) + } + + func testHeadPipeInit() { + + self.pipeline = Pipeline(headPipe: PromisePipe(success: { value in + XCTAssert(value == "HeadPipe") + return .success(value) + })) + self.pipeline.headPipe = PromisePipe(success: { _ in + return .success("HeadPipe") + }) + + let successExp = expectation(description: "success") + let assertPipe = AssertPipe(success: successExp) + self.pipeline.attach(assertPipe) + self.pipeline.load("") + wait(for: assertPipe.expectations, timeout: 1.0) + } + + func testTailPipe() { + + let successExp = expectation(description: "success") + self.pipeline.tailPipe = AssertPipe(success: successExp) + self.pipeline.load("") + wait(for: [successExp], timeout: 1.0) + } + + func testTailPipeContent() { + + let successExp = expectation(description: "success") + self.pipeline.tailPipe = PromisePipe(success: { value in + XCTAssert(value == "Content") + successExp.fulfill() + return nil + }) + + self.pipeline.attach(PromisePipe(success: { _ in + return .success("Content") + })) + self.pipeline.load("") + wait(for: [successExp], timeout: 1.0) + } + + func testTailPipeInit() { + + self.pipeline = Pipeline(headPipe: PromisePipe(success: { value in + XCTAssert(value == "HeadPipe") + return .success(value) + })) + self.pipeline.headPipe = PromisePipe(success: { _ in + return .success("HeadPipe") + }) + + let successExp = expectation(description: "success") + let assertPipe = AssertPipe(success: successExp) + self.pipeline.attach(assertPipe) + self.pipeline.load("") + wait(for: assertPipe.expectations, timeout: 1.0) + } + + func testMultipleLinking() { + + let successExp = expectation(description: "success") + self.pipeline.attach([ + PromisePipe(), + PromisePipe(), + AssertPipe(success: successExp) + ]) + self.pipeline.load("") + wait(for: [successExp], timeout: 1.0) + } } diff --git a/Example/Tests/Pipeline/PromisePipeTests.swift b/Example/Tests/Pipeline/PromisePipeTests.swift index 153ff93..dfb07b2 100644 --- a/Example/Tests/Pipeline/PromisePipeTests.swift +++ b/Example/Tests/Pipeline/PromisePipeTests.swift @@ -8,7 +8,6 @@ import XCTest import PowerTools - class PromisePipeTests: XCTestCase { var pipeline: Pipeline! @@ -28,15 +27,15 @@ class PromisePipeTests: XCTestCase { let originalString = "string" let mutatedString = "mutated" - self.pipeline.attach(PromisePipe(success: { string in + self.pipeline.promise(success: { string in XCTAssert(string == originalString ) - return mutatedString - })) + return .success(mutatedString) + }) - self.pipeline.attach(PromisePipe(success: { string in + self.pipeline.promise(success: { string in XCTAssert(string == mutatedString) - return "" - })) + return .success("") + }) let successExp = expectation(description: "success") let assertPipe = AssertPipe(success: successExp) @@ -48,15 +47,15 @@ class PromisePipeTests: XCTestCase { func testPipelineFailure() { - self.pipeline.attach(PromisePipe(success: { _ in - throw PipelineErrors.requiredFailure - })) + self.pipeline.promise(success: { _ in + return .failure(PipelineErrors.requiredFailure) + }) - self.pipeline.attach(PromisePipe(failure: { error in + self.pipeline.promise(failure: { error in XCTAssert((error as? PipelineErrors) == .requiredFailure) return .failure(error) - })) + }) let failureExp = expectation(description: "failure") let assertPipe = AssertPipe(failure: failureExp) @@ -68,14 +67,15 @@ class PromisePipeTests: XCTestCase { func testMultipleAttacchedPipelines() { - self.pipeline.attach(PromisePipe(success: { _ in - throw PipelineErrors.requiredFailure + self.pipeline.promise(success: { _ in + return .failure(PipelineErrors.requiredFailure) + }) - }), PromisePipe(failure: { error in + self.pipeline.promise(failure: { error in XCTAssert((error as? PipelineErrors) == .requiredFailure) return .failure(error) - })) + }) let failureExp = expectation(description: "failure") let assertPipe = AssertPipe(failure: failureExp) @@ -99,10 +99,10 @@ class PromisePipeTests: XCTestCase { func testEmptyPromisePipeFailure() { - self.pipeline.attach(PromisePipe(success: { _ in - throw PipelineErrors.requiredFailure - - }), PromisePipe()) + self.pipeline.promise(success: { _ in + return .failure(PipelineErrors.requiredFailure) + }) + self.pipeline.attach(PromisePipe()) let failureExp = expectation(description: "failure") let assertPipe = AssertPipe(failure: failureExp) @@ -116,24 +116,26 @@ class PromisePipeTests: XCTestCase { let promisePipe = PromisePipe(success: { string in XCTFail("should not be called") - return string + return .success(string) }) - + let successExp = expectation(description: "success") promisePipe.onSuccess { string in successExp.fulfill() - return string + return .success(string) } self.pipeline.attach(promisePipe) self.pipeline.load("") wait(for: [successExp], timeout: 1.0) - + } func testLazyOnFailureAttach() { - self.pipeline.attach(PromisePipe(success: { _ in throw PipelineErrors.requiredFailure })) + self.pipeline.promise(success: { _ in + return .failure(PipelineErrors.requiredFailure) + }) let promisePipe = PromisePipe(failure: { error in XCTFail("should not be called") @@ -151,5 +153,4 @@ class PromisePipeTests: XCTestCase { wait(for: [failureExp], timeout: 1.0) } - } diff --git a/Example/Tests/Pipeline/SublinePipeTests.swift b/Example/Tests/Pipeline/SublinePipeTests.swift index 42c1caa..165eddf 100644 --- a/Example/Tests/Pipeline/SublinePipeTests.swift +++ b/Example/Tests/Pipeline/SublinePipeTests.swift @@ -32,23 +32,23 @@ class SublinePipeTests: XCTestCase { let thirdString = "sub_second" self.pipeline.attach(PromisePipe<[String]>(success: { _ in - return [firstString] + return .success([firstString]) })) - let subline = SublinePipe(merge: .injectAfter) + let subline = self.pipeline.subline(merge: .injectAfter) subline.attach(PromisePipe<[String]>(success: { _ in - return [secondString] - }), PromisePipe<[String]>(success: { strings in - return strings.appending(thirdString) + return .success([secondString]) + })) + subline.attach(PromisePipe<[String]>(success: { strings in + return .success(strings.appending(thirdString)) })) - self.pipeline.attach(subline) self.pipeline.attach(PromisePipe(success: { strings in XCTAssert(strings.count == 3) XCTAssert(strings.first == firstString) XCTAssert(strings[1] == secondString) XCTAssert(strings.last == thirdString) - return strings + return .success(strings) })) let successExp = expectation(description: "success") @@ -60,23 +60,23 @@ class SublinePipeTests: XCTestCase { } func testSublineFailure() { - + let firstString = "string" self.pipeline.attach(PromisePipe<[String]>(success: { _ in - return [firstString] + return .success([firstString]) })) let subline = SublinePipe(merge: .injectAfter) subline.attach(PromisePipe<[String]>(success: { _ in - throw PipelineErrors.requiredFailure + return .failure(PipelineErrors.requiredFailure) })) self.pipeline.attach(subline) self.pipeline.attach(PromisePipe(success: { strings in XCTAssert(strings.count == 1) XCTAssert(strings.first == firstString) - return strings + return .success(strings) })) let successExp = expectation(description: "success") @@ -85,7 +85,7 @@ class SublinePipeTests: XCTestCase { self.pipeline.load([]) wait(for: assertPipe.expectations, timeout: 1.0) - + } func testPassthroughtSublineResult() { @@ -95,13 +95,13 @@ class SublinePipeTests: XCTestCase { var count = 0 self.pipeline.attach(PromisePipe<[String]>(success: { _ in - return [firstString] + return .success([firstString]) })) let subline = SublinePipe(merge: .injectAfter) subline.shouldPassThrought = true subline.attach(PromisePipe<[String]>(success: { _ in - return [secondString] + return .success([secondString]) })) self.pipeline.attach(subline) @@ -122,7 +122,7 @@ class SublinePipeTests: XCTestCase { } count += 1 - return strings + return .success(strings) })) let successExp = expectation(description: "success") @@ -141,7 +141,7 @@ class SublinePipeTests: XCTestCase { let thirdString = "sub_second" self.pipeline.attach(PromisePipe<[String]>(success: { _ in - return [firstString] + return .success([firstString]) })) let sublineResetExp = expectation(description: "sublineReset") @@ -154,7 +154,7 @@ class SublinePipeTests: XCTestCase { XCTAssert(strings.first == firstString) XCTAssert(strings[1] == secondString) XCTAssert(strings.last == thirdString) - return strings + return .success(strings) })) let resetExp = expectation(description: "reset") diff --git a/PowerTools/Core/Classes/Pipeline/AbstractPipeline.swift b/PowerTools/Core/Classes/Pipeline/AbstractPipeline.swift new file mode 100644 index 0000000..249a18a --- /dev/null +++ b/PowerTools/Core/Classes/Pipeline/AbstractPipeline.swift @@ -0,0 +1,26 @@ +// +// AbstractPipeline.swift +// PowerTools +// +// Created by Andrea Altea on 12/05/2019. +// + +import Foundation + +public protocol AbstractPipeline { + + associatedtype Content + + mutating func attach(_ pipe: Pipe) + mutating func attach(_ pipes: [Pipe]) + + func reset() + func load(_ baseValue: Content) +} + +public extension AbstractPipeline { + + mutating func attach(_ pipes: [Pipe]) { + pipes.forEach({ self.attach($0) }) + } +} diff --git a/PowerTools/Core/Classes/Pipeline/Pipeline.swift b/PowerTools/Core/Classes/Pipeline/Pipeline.swift index 7a11859..a372b4f 100644 --- a/PowerTools/Core/Classes/Pipeline/Pipeline.swift +++ b/PowerTools/Core/Classes/Pipeline/Pipeline.swift @@ -7,35 +7,43 @@ import Foundation -public struct Pipeline { +public struct Pipeline: AbstractPipeline { + public typealias Content = Value + + public var headPipe: Pipe? { + didSet { + self.headPipe?.nextPipe = self.pipes.first ?? self.tailPipe + } + } var pipes: [Pipe] - public init() { + public var tailPipe: Pipe? { + didSet { + (self.pipes.last ?? self.headPipe)?.nextPipe = tailPipe + } + } + + public init(headPipe: Pipe? = nil, tailPipe: Pipe? = nil) { + self.headPipe = headPipe self.pipes = [] + self.tailPipe = tailPipe } public mutating func attach(_ pipe: Pipe) { - if let lastPipe = self.pipes.last { + if let lastPipe = self.pipes.last ?? self.headPipe { lastPipe.nextPipe = pipe } + pipe.nextPipe = tailPipe self.pipes.append(pipe) } - - public mutating func attach(_ pipes: [Pipe]) { - pipes.forEach({ self.attach($0) }) - } - - public mutating func attach(_ pipes: Pipe...) { - self.attach(pipes) - } public func reset() { - self.pipes.first?.process(.reset) + (self.headPipe ?? self.pipes.first)?.process(.reset) } public func load(_ baseValue: Value) { - self.pipes.first?.process(.success(baseValue)) + (self.headPipe ?? self.pipes.first ?? self.tailPipe)?.process(.success(baseValue)) } } diff --git a/PowerTools/Core/Classes/Pipeline/Pipes/AsyncPromisePipe.swift b/PowerTools/Core/Classes/Pipeline/Pipes/AsyncPromisePipe.swift new file mode 100644 index 0000000..d8d61ef --- /dev/null +++ b/PowerTools/Core/Classes/Pipeline/Pipes/AsyncPromisePipe.swift @@ -0,0 +1,65 @@ +// +// AsyncPromisePipe.swift +// PowerTools +// +// Created by Andrea Altea on 12/05/2019. +// + +import Foundation + +public class AsyncPromisePipe: Pipe { + + public typealias SuccessBlock = (Value, _ result: @escaping (Result) -> Void) -> Void + public typealias FailureBlock = (Error, _ result: @escaping (Result) -> Void) -> Void + + var successBlock: SuccessBlock? + var failureBlock: FailureBlock? + + public init(success: SuccessBlock? = nil, failure: FailureBlock? = nil) { + + self.successBlock = success + self.failureBlock = failure + super.init() + } + + override public func success(_ content: Value) { + + guard let successBlock = self.successBlock else { + super.success(content) + return + } + + successBlock(content) { [weak self] result in + self?.send(result) + } + } + + override public func failure(_ error: Error) { + + guard let failureBlock = self.failureBlock else { + super.failure(error) + return + } + + failureBlock(error) { [weak self] result in + self?.send(result) + } + } + + public func onSuccess(_ success: @escaping SuccessBlock) { + self.successBlock = success + } + + public func onFailure(_ failure: @escaping FailureBlock) { + self.failureBlock = failure + } +} + +public extension AbstractPipeline { + + mutating func asyncPromise(success successBlock: AsyncPromisePipe.SuccessBlock? = nil, + failure failureBlock: AsyncPromisePipe.FailureBlock? = nil) { + + self.attach(AsyncPromisePipe(success: successBlock, failure: failureBlock)) + } +} diff --git a/PowerTools/Core/Classes/Pipeline/Pipes/Pipe.swift b/PowerTools/Core/Classes/Pipeline/Pipes/Pipe.swift index 0e74bfa..ff36ef4 100644 --- a/PowerTools/Core/Classes/Pipeline/Pipes/Pipe.swift +++ b/PowerTools/Core/Classes/Pipeline/Pipes/Pipe.swift @@ -25,26 +25,22 @@ open class Pipe { switch result { case .success(let value): - do { - try self.success(value) - } catch let error { - self.send(.failure(error)) - } - + self.success(value) + case .failure(let error): self.failure(error) - + case .reset: self.reset() } } - open func success(_ content: Value) throws { - self.send(.success(content)) + open func success(_ content: Value) { + self.send(content) } open func failure(_ error: Error) { - self.send(.failure(error)) + self.send(error) } open func reset() { @@ -54,4 +50,12 @@ open class Pipe { public func send(_ result: Result) { self.nextPipe?.process(result) } + + public func send(_ content: Value) { + self.send(.success(content)) + } + + public func send(_ error: Error) { + self.send(.failure(error)) + } } diff --git a/PowerTools/Core/Classes/Pipeline/Pipes/PromisePipe.swift b/PowerTools/Core/Classes/Pipeline/Pipes/PromisePipe.swift index a72f4d6..1cabc48 100644 --- a/PowerTools/Core/Classes/Pipeline/Pipes/PromisePipe.swift +++ b/PowerTools/Core/Classes/Pipeline/Pipes/PromisePipe.swift @@ -8,13 +8,13 @@ import Foundation public class PromisePipe: Pipe { - - public typealias SuccessBlock = (Value) throws -> Value - public typealias FailureBlock = (Error) -> Result - + + public typealias SuccessBlock = (Value) -> Result? + public typealias FailureBlock = (Error) -> Result? + var successBlock: SuccessBlock? var failureBlock: FailureBlock? - + public init(success: SuccessBlock? = nil, failure: FailureBlock? = nil) { self.successBlock = success @@ -22,23 +22,25 @@ public class PromisePipe: Pipe { super.init() } - override public func success(_ content: Value) throws { + override public func success(_ content: Value) { - guard let block = self.successBlock else { - try super.success(content) - return + guard let block = self.successBlock, + let result = block(content) else { + self.send(content) + return } - - try super.success(block(content)) + + self.send(result) } override public func failure(_ error: Error) { - guard let block = self.failureBlock else { - super.failure(error) - return + guard let block = self.failureBlock, + let result = block(error) else { + super.failure(error) + return } - self.send(block(error)) + self.send(result) } public func onSuccess(_ success: @escaping SuccessBlock) { @@ -49,3 +51,12 @@ public class PromisePipe: Pipe { self.failureBlock = failure } } + +public extension AbstractPipeline { + + mutating func promise(success successBlock: PromisePipe.SuccessBlock? = nil, + failure failureBlock: PromisePipe.FailureBlock? = nil) { + + self.attach(PromisePipe(success: successBlock, failure: failureBlock)) + } +} diff --git a/PowerTools/Core/Classes/Pipeline/Pipes/SublinePipe.swift b/PowerTools/Core/Classes/Pipeline/Pipes/SublinePipe.swift index c836402..48a61e3 100644 --- a/PowerTools/Core/Classes/Pipeline/Pipes/SublinePipe.swift +++ b/PowerTools/Core/Classes/Pipeline/Pipes/SublinePipe.swift @@ -9,69 +9,79 @@ import Foundation open class SublinePipe: Pipe<[Element]> { + public typealias Content = [Element] + public var shouldPassThrought = false - var subline = [Pipe<[Element]>]() - let mergeAction: Merge.Action - let mergePipe = PromisePipe<[Element]>() + internal var pipeline: Pipeline<[Element]> + private let mergeAction: Merge.Action + + private var promisePipe: PromisePipe<[Element]>? { + return pipeline.tailPipe as? PromisePipe<[Element]> + } public init(merge: Merge) { + self.pipeline = Pipeline(tailPipe: PromisePipe<[Element]>()) self.mergeAction = merge.action super.init() } - - public func attach(_ pipes: Pipe<[Element]>...) { - pipes.forEach({ self.attach($0) }) - } - public func attach(_ pipe: Pipe<[Element]>) { + open override func success(_ content: [Element]) { - pipe.nextPipe = self.mergePipe - if let lastPipe = self.subline.last { - lastPipe.nextPipe = pipe - } - self.subline.append(pipe) - } - - open override func success(_ content: [Element]) throws { - if self.shouldPassThrought { - try super.success(content) + self.send(content) } self.setupSuccess(content) self.setupFailure(content) - self.subline.first?.process(.success([])) + self.load(content) } private func setupSuccess(_ content: [Element]) { - self.mergePipe.onSuccess { [weak self] (result) -> [Element] in + self.promisePipe?.onSuccess { [weak self] (result) -> Pipe<[Element]>.Result? in - guard let strongSelf = self else { - return result - } - - let mergedResult = strongSelf.mergeAction(content, result) - strongSelf.send(.success(mergedResult)) - return result + guard let `self` = self else { return nil } + let mergedResult = self.mergeAction(content, result) + self.send(.success(mergedResult)) + return .success(result) } } private func setupFailure(_ content: [Element]) { - self.mergePipe.onFailure { [weak self] (error) -> Pipe<[Element]>.Result in + self.promisePipe?.onFailure { [weak self] (error) -> Pipe<[Element]>.Result? in self?.send(.success(content)) - return .failure(error) + return nil } } open override func reset() { - self.subline.first?.reset() + self.pipeline.reset() super.reset() } } + +extension SublinePipe: AbstractPipeline { + + public func attach(_ pipe: Pipe<[Element]>) { + self.pipeline.attach(pipe) + } + + public func load(_ baseValue: [Element]) { + self.pipeline.load(baseValue) + } +} + +public extension AbstractPipeline { + + mutating func subline(merge: Merge) -> SublinePipe where Content == [Element] { + let subline = SublinePipe(merge: merge) + self.attach(subline) + return subline + } +} diff --git a/PowerTools/Core/Classes/Pipeline/Pipes/ThrottlePipe.swift b/PowerTools/Core/Classes/Pipeline/Pipes/ThrottlePipe.swift deleted file mode 100644 index dc1f7b5..0000000 --- a/PowerTools/Core/Classes/Pipeline/Pipes/ThrottlePipe.swift +++ /dev/null @@ -1,8 +0,0 @@ -// -// ThrottlePipe.swift -// Pods-PowerTools_Example -// -// Created by Andrea Altea on 11/04/2019. -// - -import Foundation