From e0a372b1f700b8f4f207e48ebaf8077fbaf137a7 Mon Sep 17 00:00:00 2001 From: Georges Boumis Date: Wed, 6 Sep 2017 16:12:09 +0300 Subject: [PATCH] add code v1.1.6 --- .travis.yml | 14 + Example/LogKit.xcodeproj/project.pbxproj | 380 +++++ .../contents.xcworkspacedata | 7 + .../xcschemes/LogKit-Example.xcscheme | 115 ++ .../contents.xcworkspacedata | 10 + Example/Podfile | 9 + Example/Podfile.lock | 46 + .../ContentKit/ContentKit/Classes/Types.swift | 52 + .../ContentKit/Classes/audible/AnyAudio.swift | 45 + .../Classes/audible/AudibleContent.swift | 27 + .../ContentKit/Classes/audible/Audio.swift | 31 + .../audible/DynamicallyDisablingAudio.swift | 49 + .../Classes/audible/OnceAudio.swift | 59 + .../Classes/audible/VoidAudio.swift | 38 + .../ContentKit/Classes/content/Content.swift | 27 + .../ContentKit/Classes/textual/AnyText.swift | 33 + .../ContentKit/Classes/textual/Text.swift | 80 + .../Classes/textual/TextualContentKey.swift | 60 + .../TextualContentRepresentationBuilder.swift | 53 + .../textual/TextualRepresentation.swift | 35 + .../ContentKit/Classes/visual/AnyImage.swift | 33 + .../Classes/visual/CachedImage.swift | 46 + .../ContentKit/Classes/visual/Image.swift | 78 + .../Classes/visual/ScaledImage.swift | 50 + .../ContentKit/Classes/visual/UIContent.swift | 36 + .../Classes/visual/UIImageExtensions.swift | 43 + .../visual/UIImageViewExtensions.swift | 36 + .../Classes/visual/VisualContent.swift | 28 + Example/Pods/ContentKit/LICENSE | 201 +++ Example/Pods/ContentKit/README.md | 26 + .../Classes/extensions/TimeExtensions.swift | 50 + .../BidirectionalCollectionExtensions.swift | 21 + .../CollectionTypeExtensions.swift | 409 +++++ .../collections/DictionaryExtensions.swift | 57 + .../RandomAccessCollectionExtensions.swift | 98 ++ ...RangeReplaceableCollectionExtensions.swift | 126 ++ .../collections/SequenceExtensions.swift | 60 + .../collections/SetAlgebraExtensions.swift | 18 + .../extensions/collections/Sorting.swift | 60 + .../geometry/CALayerExtensions.swift | 71 + .../geometry/CATransform3DExtensions.swift | 34 + .../CGAffineTransformExtensions.swift | 28 + .../geometry/CGFloatExtensions.swift | 88 + .../geometry/CGPointExtensions.swift | 255 +++ .../geometry/CGRectExtensions.swift | 535 ++++++ .../geometry/CGSizeExtensions.swift | 351 ++++ .../geometry/UIViewExtensions.swift | 55 + .../extensions/geometry/UIViewPosition.swift | 552 ++++++ .../extensions/types/BoolExtensions.swift | 261 +++ .../extensions/types/OptionalExtensions.swift | 67 + .../BinaryFloatingPointExtensions.swift | 108 ++ .../types/numbers/DoubleExtensions.swift | 18 + .../numbers/FloatingPointExtensions.swift | 560 ++++++ .../types/numbers/IntegerExtensions.swift | 619 +++++++ .../types/collections/AverageCollection.swift | 96 ++ .../Ents/Classes/types/collections/FIFO.swift | 89 + .../Ents/Classes/types/collections/List.swift | 196 +++ .../Classes/types/collections/Queue.swift | 22 + .../types/collections/SortedCollection.swift | 44 + .../Classes/types/collections/Stack.swift | 34 + .../types/collections/UniqueCollection.swift | 52 + .../Pods/Ents/Ents/Classes/utils/Alarm.swift | 138 ++ .../Ents/Ents/Classes/utils/Chronometer.swift | 31 + .../CompileConditionalBlock.swift | 14 + .../DebugReleaseBlock.swift | 45 + .../Ents/Ents/Classes/utils/Copying.swift | 14 + .../Ents/Classes/utils/DisplayLinkBlock.swift | 114 ++ .../Ents/Classes/utils/EnumCollection.swift | 53 + .../Ents/Ents/Classes/utils/IDValue.swift | 90 + .../Pods/Ents/Ents/Classes/utils/Lazy.swift | 42 + .../utils/NoImplicitAnimationBlock.swift | 22 + .../Ents/Classes/utils/NonEmptyArray.swift | 188 ++ .../Classes/utils/ReadabilityUtilities.swift | 20 + .../Ents/Ents/Classes/utils/TimedBlock.swift | 17 + .../Pods/Ents/Ents/Classes/utils/Types.swift | 13 + .../Pods/Ents/Ents/Classes/utils/Value.swift | 346 ++++ .../Pods/Ents/Ents/Classes/utils/Weak.swift | 19 + Example/Pods/Ents/LICENSE | 21 + Example/Pods/Ents/README.md | 27 + .../Local Podspecs/ContentKit.podspec.json | 30 + Example/Pods/Local Podspecs/Ents.podspec.json | 25 + .../Pods/Local Podspecs/LogKit.podspec.json | 30 + .../RepresentationKit.podspec.json | 22 + Example/Pods/Manifest.lock | 46 + Example/Pods/Pods.xcodeproj/project.pbxproj | 1511 +++++++++++++++++ Example/Pods/RepresentationKit/LICENSE | 201 +++ Example/Pods/RepresentationKit/README.md | 73 + .../Builders/ArrayRepresentationBuilder.swift | 46 + .../DeepArrayRepresentationBuilder.swift | 56 + .../DictionaryRepresentationBuilder.swift | 46 + .../Builders/JSONRepresentationBuilder.swift | 55 + .../TypedArrayRepresentationBuilder.swift | 47 + .../Classes/Protocols/Representable.swift | 61 + .../Classes/Protocols/Representation.swift | 69 + .../Representations/ArrayRepresentation.swift | 67 + .../DictionaryRepresentation.swift | 62 + .../Classes/Representations/Identity.swift | 37 + .../Representations/JSONRepresentation.swift | 82 + .../TypedArrayRepresentation.swift | 67 + .../extensions/CollectionExtensions.swift | 37 + .../extensions/DictionaryExtension.swift | 36 + .../ContentKit/ContentKit-dummy.m | 5 + .../ContentKit/ContentKit-prefix.pch | 12 + .../ContentKit/ContentKit-umbrella.h | 16 + .../ContentKit/ContentKit.modulemap | 6 + .../ContentKit/ContentKit.xcconfig | 11 + .../ContentKit/Info.plist | 26 + .../Target Support Files/Ents/Ents-dummy.m | 5 + .../Target Support Files/Ents/Ents-prefix.pch | 12 + .../Target Support Files/Ents/Ents-umbrella.h | 16 + .../Target Support Files/Ents/Ents.modulemap | 6 + .../Target Support Files/Ents/Ents.xcconfig | 11 + .../Pods/Target Support Files/Ents/Info.plist | 26 + .../Target Support Files/LogKit/Info.plist | 26 + .../LogKit/LogKit-dummy.m | 5 + .../LogKit/LogKit-prefix.pch | 12 + .../LogKit/LogKit-umbrella.h | 16 + .../LogKit/LogKit.modulemap | 6 + .../LogKit/LogKit.xcconfig | 11 + .../Pods-LogKit_Tests/Info.plist | 26 + ...ods-LogKit_Tests-acknowledgements.markdown | 643 +++++++ .../Pods-LogKit_Tests-acknowledgements.plist | 693 ++++++++ .../Pods-LogKit_Tests-dummy.m | 5 + .../Pods-LogKit_Tests-frameworks.sh | 105 ++ .../Pods-LogKit_Tests-resources.sh | 102 ++ .../Pods-LogKit_Tests-umbrella.h | 16 + .../Pods-LogKit_Tests.debug.xcconfig | 12 + .../Pods-LogKit_Tests.modulemap | 6 + .../Pods-LogKit_Tests.release.xcconfig | 12 + .../RepresentationKit/Info.plist | 26 + .../RepresentationKit-dummy.m | 5 + .../RepresentationKit-prefix.pch | 12 + .../RepresentationKit-umbrella.h | 16 + .../RepresentationKit.modulemap | 6 + .../RepresentationKit.xcconfig | 10 + Example/Tests/Info.plist | 24 + Example/Tests/Tests.swift | 29 + LogKit.podspec | 44 + LogKit/Assets/.gitkeep | 0 LogKit/Classes/.gitkeep | 0 LogKit/Classes/InMemoryLog.swift | 47 + LogKit/Classes/Log.swift | 35 + LogKit/Classes/LogRepresentation.swift | 48 + LogKit/Classes/OnDiskLog.swift | 156 ++ NOTICE | 2 + README.md | 27 + _Pods.xcodeproj | 1 + 147 files changed, 13037 insertions(+) create mode 100644 .travis.yml create mode 100644 Example/LogKit.xcodeproj/project.pbxproj create mode 100644 Example/LogKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Example/LogKit.xcodeproj/xcshareddata/xcschemes/LogKit-Example.xcscheme create mode 100644 Example/LogKit.xcworkspace/contents.xcworkspacedata create mode 100644 Example/Podfile create mode 100644 Example/Podfile.lock create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/Types.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/audible/AnyAudio.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/audible/AudibleContent.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/audible/Audio.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/audible/DynamicallyDisablingAudio.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/audible/OnceAudio.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/audible/VoidAudio.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/content/Content.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/textual/AnyText.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/textual/Text.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/textual/TextualContentKey.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/textual/TextualContentRepresentationBuilder.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/textual/TextualRepresentation.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/visual/AnyImage.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/visual/CachedImage.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/visual/Image.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/visual/ScaledImage.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/visual/UIContent.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/visual/UIImageExtensions.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/visual/UIImageViewExtensions.swift create mode 100644 Example/Pods/ContentKit/ContentKit/Classes/visual/VisualContent.swift create mode 100644 Example/Pods/ContentKit/LICENSE create mode 100644 Example/Pods/ContentKit/README.md create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/TimeExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/collections/BidirectionalCollectionExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/collections/CollectionTypeExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/collections/DictionaryExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/collections/RandomAccessCollectionExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/collections/RangeReplaceableCollectionExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/collections/SequenceExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/collections/SetAlgebraExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/collections/Sorting.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/geometry/CALayerExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/geometry/CATransform3DExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/geometry/CGAffineTransformExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/geometry/CGFloatExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/geometry/CGPointExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/geometry/CGRectExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/geometry/CGSizeExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/geometry/UIViewExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/geometry/UIViewPosition.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/types/BoolExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/types/OptionalExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/types/numbers/BinaryFloatingPointExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/types/numbers/DoubleExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/types/numbers/FloatingPointExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/extensions/types/numbers/IntegerExtensions.swift create mode 100644 Example/Pods/Ents/Ents/Classes/types/collections/AverageCollection.swift create mode 100644 Example/Pods/Ents/Ents/Classes/types/collections/FIFO.swift create mode 100644 Example/Pods/Ents/Ents/Classes/types/collections/List.swift create mode 100644 Example/Pods/Ents/Ents/Classes/types/collections/Queue.swift create mode 100644 Example/Pods/Ents/Ents/Classes/types/collections/SortedCollection.swift create mode 100644 Example/Pods/Ents/Ents/Classes/types/collections/Stack.swift create mode 100644 Example/Pods/Ents/Ents/Classes/types/collections/UniqueCollection.swift create mode 100644 Example/Pods/Ents/Ents/Classes/utils/Alarm.swift create mode 100644 Example/Pods/Ents/Ents/Classes/utils/Chronometer.swift create mode 100644 Example/Pods/Ents/Ents/Classes/utils/CompileConditionalBlock/CompileConditionalBlock.swift create mode 100644 Example/Pods/Ents/Ents/Classes/utils/CompileConditionalBlock/DebugReleaseBlock.swift create mode 100644 Example/Pods/Ents/Ents/Classes/utils/Copying.swift create mode 100644 Example/Pods/Ents/Ents/Classes/utils/DisplayLinkBlock.swift create mode 100644 Example/Pods/Ents/Ents/Classes/utils/EnumCollection.swift create mode 100644 Example/Pods/Ents/Ents/Classes/utils/IDValue.swift create mode 100644 Example/Pods/Ents/Ents/Classes/utils/Lazy.swift create mode 100644 Example/Pods/Ents/Ents/Classes/utils/NoImplicitAnimationBlock.swift create mode 100644 Example/Pods/Ents/Ents/Classes/utils/NonEmptyArray.swift create mode 100644 Example/Pods/Ents/Ents/Classes/utils/ReadabilityUtilities.swift create mode 100644 Example/Pods/Ents/Ents/Classes/utils/TimedBlock.swift create mode 100644 Example/Pods/Ents/Ents/Classes/utils/Types.swift create mode 100644 Example/Pods/Ents/Ents/Classes/utils/Value.swift create mode 100644 Example/Pods/Ents/Ents/Classes/utils/Weak.swift create mode 100644 Example/Pods/Ents/LICENSE create mode 100644 Example/Pods/Ents/README.md create mode 100644 Example/Pods/Local Podspecs/ContentKit.podspec.json create mode 100644 Example/Pods/Local Podspecs/Ents.podspec.json create mode 100644 Example/Pods/Local Podspecs/LogKit.podspec.json create mode 100644 Example/Pods/Local Podspecs/RepresentationKit.podspec.json create mode 100644 Example/Pods/Manifest.lock create mode 100644 Example/Pods/Pods.xcodeproj/project.pbxproj create mode 100644 Example/Pods/RepresentationKit/LICENSE create mode 100644 Example/Pods/RepresentationKit/README.md create mode 100644 Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/ArrayRepresentationBuilder.swift create mode 100644 Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/DeepArrayRepresentationBuilder.swift create mode 100644 Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/DictionaryRepresentationBuilder.swift create mode 100644 Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/JSONRepresentationBuilder.swift create mode 100644 Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/TypedArrayRepresentationBuilder.swift create mode 100644 Example/Pods/RepresentationKit/RepresentationKit/Classes/Protocols/Representable.swift create mode 100644 Example/Pods/RepresentationKit/RepresentationKit/Classes/Protocols/Representation.swift create mode 100644 Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/ArrayRepresentation.swift create mode 100644 Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/DictionaryRepresentation.swift create mode 100644 Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/Identity.swift create mode 100644 Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/JSONRepresentation.swift create mode 100644 Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/TypedArrayRepresentation.swift create mode 100644 Example/Pods/RepresentationKit/RepresentationKit/Classes/extensions/CollectionExtensions.swift create mode 100644 Example/Pods/RepresentationKit/RepresentationKit/Classes/extensions/DictionaryExtension.swift create mode 100644 Example/Pods/Target Support Files/ContentKit/ContentKit-dummy.m create mode 100644 Example/Pods/Target Support Files/ContentKit/ContentKit-prefix.pch create mode 100644 Example/Pods/Target Support Files/ContentKit/ContentKit-umbrella.h create mode 100644 Example/Pods/Target Support Files/ContentKit/ContentKit.modulemap create mode 100644 Example/Pods/Target Support Files/ContentKit/ContentKit.xcconfig create mode 100644 Example/Pods/Target Support Files/ContentKit/Info.plist create mode 100644 Example/Pods/Target Support Files/Ents/Ents-dummy.m create mode 100644 Example/Pods/Target Support Files/Ents/Ents-prefix.pch create mode 100644 Example/Pods/Target Support Files/Ents/Ents-umbrella.h create mode 100644 Example/Pods/Target Support Files/Ents/Ents.modulemap create mode 100644 Example/Pods/Target Support Files/Ents/Ents.xcconfig create mode 100644 Example/Pods/Target Support Files/Ents/Info.plist create mode 100644 Example/Pods/Target Support Files/LogKit/Info.plist create mode 100644 Example/Pods/Target Support Files/LogKit/LogKit-dummy.m create mode 100644 Example/Pods/Target Support Files/LogKit/LogKit-prefix.pch create mode 100644 Example/Pods/Target Support Files/LogKit/LogKit-umbrella.h create mode 100644 Example/Pods/Target Support Files/LogKit/LogKit.modulemap create mode 100644 Example/Pods/Target Support Files/LogKit/LogKit.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-LogKit_Tests/Info.plist create mode 100644 Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-acknowledgements.markdown create mode 100644 Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-acknowledgements.plist create mode 100644 Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-dummy.m create mode 100755 Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-frameworks.sh create mode 100755 Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-resources.sh create mode 100644 Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-umbrella.h create mode 100644 Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests.debug.xcconfig create mode 100644 Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests.modulemap create mode 100644 Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests.release.xcconfig create mode 100644 Example/Pods/Target Support Files/RepresentationKit/Info.plist create mode 100644 Example/Pods/Target Support Files/RepresentationKit/RepresentationKit-dummy.m create mode 100644 Example/Pods/Target Support Files/RepresentationKit/RepresentationKit-prefix.pch create mode 100644 Example/Pods/Target Support Files/RepresentationKit/RepresentationKit-umbrella.h create mode 100644 Example/Pods/Target Support Files/RepresentationKit/RepresentationKit.modulemap create mode 100644 Example/Pods/Target Support Files/RepresentationKit/RepresentationKit.xcconfig create mode 100644 Example/Tests/Info.plist create mode 100644 Example/Tests/Tests.swift create mode 100644 LogKit.podspec create mode 100644 LogKit/Assets/.gitkeep create mode 100644 LogKit/Classes/.gitkeep create mode 100644 LogKit/Classes/InMemoryLog.swift create mode 100644 LogKit/Classes/Log.swift create mode 100644 LogKit/Classes/LogRepresentation.swift create mode 100644 LogKit/Classes/OnDiskLog.swift create mode 100644 NOTICE create mode 100644 README.md create mode 120000 _Pods.xcodeproj diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..79a80fc --- /dev/null +++ b/.travis.yml @@ -0,0 +1,14 @@ +# references: +# * http://www.objc.io/issue-6/travis-ci.html +# * https://github.com/supermarin/xcpretty#usage + +osx_image: xcode7.3 +language: objective-c +# cache: cocoapods +# podfile: Example/Podfile +# before_install: +# - gem install cocoapods # Since Travis is not always on latest version +# - pod install --project-directory=Example +script: +- set -o pipefail && xcodebuild test -workspace Example/LogKit.xcworkspace -scheme LogKit-Example -sdk iphonesimulator9.3 ONLY_ACTIVE_ARCH=NO | xcpretty +- pod lib lint diff --git a/Example/LogKit.xcodeproj/project.pbxproj b/Example/LogKit.xcodeproj/project.pbxproj new file mode 100644 index 0000000..c3f753a --- /dev/null +++ b/Example/LogKit.xcodeproj/project.pbxproj @@ -0,0 +1,380 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* Tests.swift */; }; + 6D45B8D5A6D34CA36296505D /* Pods_LogKit_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DE7FFAF85444D4500C835086 /* Pods_LogKit_Tests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 2490E4BDB9AC9BAF3D0F6916 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; + 3FF785A10ECC244DD1223D5A /* LogKit.podspec */ = {isa = PBXFileReference; includeInIndex = 1; name = LogKit.podspec; path = ../LogKit.podspec; sourceTree = ""; }; + 607FACE51AFB9204008FA782 /* LogKit_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = LogKit_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; + BA512160428A4C87FCF5075E /* Pods-LogKit_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LogKit_Tests.release.xcconfig"; path = "Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests.release.xcconfig"; sourceTree = ""; }; + C3C90AEF4DFBCAAA2A48E44C /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; name = README.md; path = ../README.md; sourceTree = ""; }; + D6308EF26543EF56BBF0EADC /* Pods-LogKit_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LogKit_Tests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests.debug.xcconfig"; sourceTree = ""; }; + DE7FFAF85444D4500C835086 /* Pods_LogKit_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_LogKit_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 607FACE21AFB9204008FA782 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 6D45B8D5A6D34CA36296505D /* Pods_LogKit_Tests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 3F6226ED275DC42BDD01400F /* Frameworks */ = { + isa = PBXGroup; + children = ( + DE7FFAF85444D4500C835086 /* Pods_LogKit_Tests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 607FACC71AFB9204008FA782 = { + isa = PBXGroup; + children = ( + 607FACF51AFB993E008FA782 /* Podspec Metadata */, + 607FACE81AFB9204008FA782 /* Tests */, + 607FACD11AFB9204008FA782 /* Products */, + E5E82809B7B9AAA1930B9D4D /* Pods */, + 3F6226ED275DC42BDD01400F /* Frameworks */, + ); + sourceTree = ""; + }; + 607FACD11AFB9204008FA782 /* Products */ = { + isa = PBXGroup; + children = ( + 607FACE51AFB9204008FA782 /* LogKit_Tests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 607FACE81AFB9204008FA782 /* Tests */ = { + isa = PBXGroup; + children = ( + 607FACEB1AFB9204008FA782 /* Tests.swift */, + 607FACE91AFB9204008FA782 /* Supporting Files */, + ); + path = Tests; + sourceTree = ""; + }; + 607FACE91AFB9204008FA782 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 607FACEA1AFB9204008FA782 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { + isa = PBXGroup; + children = ( + 3FF785A10ECC244DD1223D5A /* LogKit.podspec */, + C3C90AEF4DFBCAAA2A48E44C /* README.md */, + 2490E4BDB9AC9BAF3D0F6916 /* LICENSE */, + ); + name = "Podspec Metadata"; + sourceTree = ""; + }; + E5E82809B7B9AAA1930B9D4D /* Pods */ = { + isa = PBXGroup; + children = ( + D6308EF26543EF56BBF0EADC /* Pods-LogKit_Tests.debug.xcconfig */, + BA512160428A4C87FCF5075E /* Pods-LogKit_Tests.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 607FACE41AFB9204008FA782 /* LogKit_Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "LogKit_Tests" */; + buildPhases = ( + 5F8ECFA07435EDBAB487C37B /* [CP] Check Pods Manifest.lock */, + 607FACE11AFB9204008FA782 /* Sources */, + 607FACE21AFB9204008FA782 /* Frameworks */, + 607FACE31AFB9204008FA782 /* Resources */, + FB6FC791819962219064F70D /* [CP] Embed Pods Frameworks */, + F4B48C4B9323504C15161D49 /* [CP] Copy Pods Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = LogKit_Tests; + productName = Tests; + productReference = 607FACE51AFB9204008FA782 /* LogKit_Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 607FACC81AFB9204008FA782 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0720; + LastUpgradeCheck = 0820; + ORGANIZATIONNAME = CocoaPods; + TargetAttributes = { + 607FACCF1AFB9204008FA782 = { + CreatedOnToolsVersion = 6.3.1; + LastSwiftMigration = 0820; + }; + 607FACE41AFB9204008FA782 = { + CreatedOnToolsVersion = 6.3.1; + LastSwiftMigration = 0820; + TestTargetID = 607FACCF1AFB9204008FA782; + }; + }; + }; + buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "LogKit" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 607FACC71AFB9204008FA782; + productRefGroup = 607FACD11AFB9204008FA782 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 607FACE41AFB9204008FA782 /* LogKit_Tests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 607FACE31AFB9204008FA782 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 5F8ECFA07435EDBAB487C37B /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + F4B48C4B9323504C15161D49 /* [CP] Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + FB6FC791819962219064F70D /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 607FACE11AFB9204008FA782 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 607FACED1AFB9204008FA782 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 607FACEE1AFB9204008FA782 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 607FACF31AFB9204008FA782 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D6308EF26543EF56BBF0EADC /* Pods-LogKit_Tests.debug.xcconfig */; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + 607FACF41AFB9204008FA782 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BA512160428A4C87FCF5075E /* Pods-LogKit_Tests.release.xcconfig */; + buildSettings = { + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = Tests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 3.0; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "LogKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACED1AFB9204008FA782 /* Debug */, + 607FACEE1AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "LogKit_Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 607FACF31AFB9204008FA782 /* Debug */, + 607FACF41AFB9204008FA782 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 607FACC81AFB9204008FA782 /* Project object */; +} diff --git a/Example/LogKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Example/LogKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..befa98f --- /dev/null +++ b/Example/LogKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Example/LogKit.xcodeproj/xcshareddata/xcschemes/LogKit-Example.xcscheme b/Example/LogKit.xcodeproj/xcshareddata/xcschemes/LogKit-Example.xcscheme new file mode 100644 index 0000000..7af1a2c --- /dev/null +++ b/Example/LogKit.xcodeproj/xcshareddata/xcschemes/LogKit-Example.xcscheme @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example/LogKit.xcworkspace/contents.xcworkspacedata b/Example/LogKit.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..f5afbf5 --- /dev/null +++ b/Example/LogKit.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Example/Podfile b/Example/Podfile new file mode 100644 index 0000000..567ec7b --- /dev/null +++ b/Example/Podfile @@ -0,0 +1,9 @@ +use_frameworks! +target 'LogKit_Tests' do + pod 'LogKit', :path => '../' + + pod 'RepresentationKit', :git => 'https://github.com/averello/RepresentationKit.git' + pod 'ContentKit', :git => 'https://github.com/averello/ContentKit.git' + pod 'Ents', :git => 'https://github.com/averello/Ents.git' + +end diff --git a/Example/Podfile.lock b/Example/Podfile.lock new file mode 100644 index 0000000..7325e16 --- /dev/null +++ b/Example/Podfile.lock @@ -0,0 +1,46 @@ +PODS: + - ContentKit (1.6.5): + - Ents + - RepresentationKit + - Ents (1.17) + - LogKit (1.1.6): + - ContentKit + - RepresentationKit + - RepresentationKit (1.1.4) + +DEPENDENCIES: + - ContentKit (from `https://github.com/averello/ContentKit.git`) + - Ents (from `https://github.com/averello/Ents.git`) + - LogKit (from `../`) + - RepresentationKit (from `https://github.com/averello/RepresentationKit.git`) + +EXTERNAL SOURCES: + ContentKit: + :git: https://github.com/averello/ContentKit.git + Ents: + :git: https://github.com/averello/Ents.git + LogKit: + :path: "../" + RepresentationKit: + :git: https://github.com/averello/RepresentationKit.git + +CHECKOUT OPTIONS: + ContentKit: + :commit: ef561a488f2cde6731a76a163184578ec01fb0af + :git: https://github.com/averello/ContentKit.git + Ents: + :commit: 580e1880a334135f775b2cf1ef20f0e1a1540f1d + :git: https://github.com/averello/Ents.git + RepresentationKit: + :commit: 13a45a3a9e3e93def7662d6f7719e9fe4920f5d3 + :git: https://github.com/averello/RepresentationKit.git + +SPEC CHECKSUMS: + ContentKit: b0ded7d9d57f77ca3c87261c97d606b4ea9f7bdf + Ents: f7469b80b3507e2bbc936c96b2cf61e79c0ce809 + LogKit: 580d198cb760af1e217ae6af12c26d04b0f14a6b + RepresentationKit: 1ae7749916ed014403db30f3d38204d7e000dbd1 + +PODFILE CHECKSUM: 806623dc0beef0c14dd3cf055f7d62d4cb652c7c + +COCOAPODS: 1.2.1 diff --git a/Example/Pods/ContentKit/ContentKit/Classes/Types.swift b/Example/Pods/ContentKit/ContentKit/Classes/Types.swift new file mode 100644 index 0000000..58976cf --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/Types.swift @@ -0,0 +1,52 @@ +// +// Types.swift +// ContentKit +// +// Created by Georges Boumis on 16/05/2017. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +public struct Size { + public let width: Float + public let height: Float + + public init(width: Float, height: Float) { + self.width = width + self.height = height + } + + public init(size: CGSize) { + self.init(width: Float(size.width), height: Float(size.height)) + } +} + +public extension Size { + + public var asCGSize: CGSize { + return CGSize(size: self) + } +} + +public extension CGSize { + public init(size: Size) { + self.init(width: CGFloat(size.width), height: CGFloat(size.height)) + } +} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/audible/AnyAudio.swift b/Example/Pods/ContentKit/ContentKit/Classes/audible/AnyAudio.swift new file mode 100644 index 0000000..25eda01 --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/audible/AnyAudio.swift @@ -0,0 +1,45 @@ +// +// AnyAudio.swift +// ContentKit +// +// Created by Georges Boumis on 08/06/2017. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +final public class AnyAudio: Audio { + final private let audio: Audio + + public init(audio: Audio) { + self.audio = audio + } + + final public var duration: TimeInterval { + return self.audio.duration + } + + final public func play() { + self.audio.play() + } + + final public func stop(fadeOut: Bool) { + self.audio.stop(fadeOut: fadeOut) + } +} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/audible/AudibleContent.swift b/Example/Pods/ContentKit/ContentKit/Classes/audible/AudibleContent.swift new file mode 100644 index 0000000..11d2961 --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/audible/AudibleContent.swift @@ -0,0 +1,27 @@ +// +// AudibleContent.swift +// ContentKit +// +// Created by Georges Boumis on 09/12/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +public protocol AudibleContent: Content {} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/audible/Audio.swift b/Example/Pods/ContentKit/ContentKit/Classes/audible/Audio.swift new file mode 100644 index 0000000..6ca4af4 --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/audible/Audio.swift @@ -0,0 +1,31 @@ +// +// Audio.swift +// ContentKit +// +// Created by Georges Boumis on 09/12/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +public protocol Audio: AudibleContent { + var duration: TimeInterval { get } + func play() + func stop(fadeOut: Bool) +} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/audible/DynamicallyDisablingAudio.swift b/Example/Pods/ContentKit/ContentKit/Classes/audible/DynamicallyDisablingAudio.swift new file mode 100644 index 0000000..0b83154 --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/audible/DynamicallyDisablingAudio.swift @@ -0,0 +1,49 @@ +// +// DynamicallyDisablingAudio.swift +// ContentKit +// +// Created by Georges Boumis on 02/08/2017. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +final public class DynamicallyDisablingAudio: Audio { + final private let audio: Audio + final public var enabled: Bool + + public init(audio: Audio, enabled: Bool = true) { + self.audio = audio + self.enabled = enabled + } + + final public var duration: TimeInterval { + return self.audio.duration + } + + final public func play() { + guard self.enabled else { return } + self.audio.play() + } + + final public func stop(fadeOut: Bool) { + guard self.enabled else { return } + self.audio.stop(fadeOut: fadeOut) + } +} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/audible/OnceAudio.swift b/Example/Pods/ContentKit/ContentKit/Classes/audible/OnceAudio.swift new file mode 100644 index 0000000..3c93679 --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/audible/OnceAudio.swift @@ -0,0 +1,59 @@ +// +// OnceAudio.swift +// ContentKit +// +// Created by Georges Boumis on 30/05/2017. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +final public class OnceAudio: ContentKit.Audio { + final fileprivate let audio: ContentKit.Audio + final fileprivate var notPlayed = true + + public init(audio: ContentKit.Audio) { + self.audio = audio + } + + final public var duration: TimeInterval { + return self.audio.duration + } + + final public func play() { + guard self.notPlayed else { return } + self.audio.play() + self.notPlayed = false + } + + final public func stop(fadeOut: Bool) { + self.audio.stop(fadeOut: fadeOut) + } +} + +extension OnceAudio: CustomStringConvertible { + public var description: String { + return "<" + + String(describing: type(of: self)) + + ": \(Unmanaged.passUnretained(self));" + + " played = \(!self.notPlayed);" + + " audio = \(self.audio);" + + ">" + } +} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/audible/VoidAudio.swift b/Example/Pods/ContentKit/ContentKit/Classes/audible/VoidAudio.swift new file mode 100644 index 0000000..0734c15 --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/audible/VoidAudio.swift @@ -0,0 +1,38 @@ +// +// VoidAudio.swift +// ContentKit +// +// Created by Georges Boumis on 30/05/2017. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +open class VoidAudio: Audio { + + public init() {} + + final public var duration: TimeInterval { + return 0.0 + } + + final public func play() {} + + final public func stop(fadeOut: Bool) {} +} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/content/Content.swift b/Example/Pods/ContentKit/ContentKit/Classes/content/Content.swift new file mode 100644 index 0000000..e41d485 --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/content/Content.swift @@ -0,0 +1,27 @@ +// +// Content.swift +// ContentKit +// +// Created by Georges Boumis on 25/07/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +public protocol Content {} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/textual/AnyText.swift b/Example/Pods/ContentKit/ContentKit/Classes/textual/AnyText.swift new file mode 100644 index 0000000..9d1d717 --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/textual/AnyText.swift @@ -0,0 +1,33 @@ +// +// AnyText.swift +// ContentKit +// +// Created by Georges Boumis on 29/05/2017. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +public struct AnyText: Text { + public private(set) var content: String + + public init(_ string: String) { + self.content = string + } +} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/textual/Text.swift b/Example/Pods/ContentKit/ContentKit/Classes/textual/Text.swift new file mode 100644 index 0000000..6c9f77f --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/textual/Text.swift @@ -0,0 +1,80 @@ +// +// Text.swift +// ContentKit +// +// Created by Georges Boumis on 25/07/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation +import RepresentationKit +import Ents + +public protocol Text: Content, Representable, LosslessStringConvertible { + var content: String { get } + var empty: Bool { get } +} + +public extension Text { + + public var description: String { + return self.content + } + + public func debugQuickLookObject() -> AnyObject? { + return self.content as NSString + } + + public var customPlaygroundQuickLook: PlaygroundQuickLook { + return PlaygroundQuickLook.text(self.content) + } + + public var empty: Bool { return self.content.isEmpty } +} + +public extension Text { + + public var hashValue: Int { + return self.content.hashValue + } + + public static func == (lhs: Self, rhs: Self) -> Bool { + return (lhs.content.hashValue == rhs.content.hashValue) || + (lhs.content == rhs.content) + } + + public static func < (lhs: Self, rhs: Self) -> Bool { + return (lhs.content < rhs.content) + } +} + +extension String: Text { + + public init(content: Text) { + self.init(content.content)! + } + + public var content: String { + return self + } + + public func represent(using representation: Representation) -> Representation { + return representation.with(key: TextKey(), value: self) + } +} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/textual/TextualContentKey.swift b/Example/Pods/ContentKit/ContentKit/Classes/textual/TextualContentKey.swift new file mode 100644 index 0000000..a761ac3 --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/textual/TextualContentKey.swift @@ -0,0 +1,60 @@ +// +// TextKey.swift +// ContentKit +// +// Created by Georges Boumis on 16/05/2017. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +// default textual content key + +public struct TextKey: LosslessStringConvertible, Hashable { + private let value: String = "content" + + public init() {} + + // Hashable + public var hashValue: Int { + return self.value.hashValue + } + + // Equatable + public static func == (_ lhs: TextKey, rhs: TextKey) -> Bool { + return (lhs.value == rhs.value) + } + + public static func != (_ lhs: TextKey, rhs: TextKey) -> Bool { + return !(lhs == rhs) + } + + public static func == (_ lhs: String, rhs: TextKey) -> Bool { + return (lhs == rhs.value) + } + + public static func == (_ lhs: TextKey, rhs: String) -> Bool { + return (lhs.value == rhs) + } + + // LosslessStringConvertible + public init?(_ description: String) {} + // CustomStringConvertible + public var description: String { return self.value } +} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/textual/TextualContentRepresentationBuilder.swift b/Example/Pods/ContentKit/ContentKit/Classes/textual/TextualContentRepresentationBuilder.swift new file mode 100644 index 0000000..2bd9b1c --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/textual/TextualContentRepresentationBuilder.swift @@ -0,0 +1,53 @@ +// +// TextRepresentationBuilder.swift +// ContentKit +// +// Created by Georges Boumis on 28/06/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation +import RepresentationKit + +/// Use this to create a ServerMessage from a json string +public struct TextRepresentationBuilder: TextRepresentation { + private let _string: String + public var content: String { + return "{ \(self._string) }" + } + + public init() { + self.init("")! + } + + public init?(_ string: String) { + self._string = string + } + + // gets key == "value" as value a String + public func with(key: Key, value: Value) -> Representation where Key: LosslessStringConvertible & Hashable { + let notEmpty = !self._string.isEmpty + var string = self._string + if notEmpty { + string.append(", ") + } + string.append("\"" + String(key) + "\" : \(value)") + return TextRepresentationBuilder(string)! + } +} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/textual/TextualRepresentation.swift b/Example/Pods/ContentKit/ContentKit/Classes/textual/TextualRepresentation.swift new file mode 100644 index 0000000..1ef75f6 --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/textual/TextualRepresentation.swift @@ -0,0 +1,35 @@ +// +// TextRepresentation.swift +// ContentKit +// +// Created by Georges Boumis on 28/06/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation +import RepresentationKit + +public protocol TextRepresentation: Representation, Text { +} + +public extension DictionaryRepresentation { + public var textualRepresentation: TextRepresentation { + return self.represent(using: TextRepresentationBuilder()) as! TextRepresentation + } +} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/visual/AnyImage.swift b/Example/Pods/ContentKit/ContentKit/Classes/visual/AnyImage.swift new file mode 100644 index 0000000..3996c03 --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/visual/AnyImage.swift @@ -0,0 +1,33 @@ +// +// AnyImage.swift +// ContentKit +// +// Created by Georges Boumis on 15/05/2017. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +final public class AnyImage: Image { + final public let image: UIImage + + public init(image: UIImage) { + self.image = image + } +} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/visual/CachedImage.swift b/Example/Pods/ContentKit/ContentKit/Classes/visual/CachedImage.swift new file mode 100644 index 0000000..ab04353 --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/visual/CachedImage.swift @@ -0,0 +1,46 @@ +// +// CachedImage.swift +// ContentKit +// +// Created by Georges Boumis on 01/09/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +public final class CachedImage: Image { + private var _image: UIImage? + private let _imageToCache: Image + + public var image: UIImage { + if self._image.optional { + self._image = self._imageToCache.image + } + return self._image! + } + + public init(image: Image) { + self._imageToCache = image + } + + public func scaled(scale: Float) -> Image { + let scaled = ScaledImage(original: self, scale: scale) + return CachedImage(image: scaled) + } +} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/visual/Image.swift b/Example/Pods/ContentKit/ContentKit/Classes/visual/Image.swift new file mode 100644 index 0000000..1329e3c --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/visual/Image.swift @@ -0,0 +1,78 @@ +// +// Image.swift +// ContentKit +// +// Created by Georges Boumis on 12/08/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation +import Ents + +public protocol Image: VisualContent, CustomPlaygroundQuickLookable { + var image: UIImage { get } + var size: Size { get } + func scaled(_ scale: Float) -> Image + + func configure(imageView: UIImageView) + func configure(button: UIButton) + func configureBackground(button: UIButton) +} + +public extension Image { + + public var size: Size { + return Size(size: self.image.size) + } + + public func scaled(_ scale: Float) -> Image { + return ScaledImage(original: self, scale: scale) + } +} + +public extension Image { + + public var customPlaygroundQuickLook: PlaygroundQuickLook { + return PlaygroundQuickLook.image(self.image) + } +} + +public extension Image { + + public func debugQuickLookObject() -> AnyObject? { + return self.image + } +} + +public extension Image { + + public func configure(imageView: UIImageView) { + imageView.image = self.image + } + + public func configure(button: UIButton) { + button.setImage(self.image, + for: UIControlState.normal) + } + + func configureBackground(button: UIButton) { + button.setBackgroundImage(self.image, + for: UIControlState.normal) + } +} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/visual/ScaledImage.swift b/Example/Pods/ContentKit/ContentKit/Classes/visual/ScaledImage.swift new file mode 100644 index 0000000..7cd6508 --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/visual/ScaledImage.swift @@ -0,0 +1,50 @@ +// +// ScaledImage.swift +// ContentKit +// +// Created by Georges Boumis on 01/09/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation +import Ents + +public struct ScaledImage: Image { + public let original: Image + public let scale: Float + + public var image: UIImage { + if self.scale.isEqual(to: 1.0) { + return self.original.image + } + else { + let scaled = self.original.image.scaled(self.scale) + return scaled.image + } + } + + public init(original: Image, scale: Float) { + self.original = original + self.scale = scale + } + + public func scaled(_ scale: Float) -> Image { + return ScaledImage(original: self, scale: scale) + } +} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/visual/UIContent.swift b/Example/Pods/ContentKit/ContentKit/Classes/visual/UIContent.swift new file mode 100644 index 0000000..78e5ad5 --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/visual/UIContent.swift @@ -0,0 +1,36 @@ +// +// UIContent.swift +// ContentKit +// +// Created by Georges Boumis on 25/07/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +public protocol UIContent: VisualContent { + var view: UIView { get } +} + + +extension UIView: UIContent { + public var view: UIView { + return self + } +} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/visual/UIImageExtensions.swift b/Example/Pods/ContentKit/ContentKit/Classes/visual/UIImageExtensions.swift new file mode 100644 index 0000000..6d418c1 --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/visual/UIImageExtensions.swift @@ -0,0 +1,43 @@ +// +// UIImageExtensions.swift +// ContentKit +// +// Created by Georges Boumis on 16/05/2017. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +extension UIImage: Image { + public var image: UIImage { + return self + } + + public func scaled(_ scale: Float) -> Image { + let newWidth = self.size.width.multiplied(by: CGFloat(scale)) + let newHeight = self.size.height.multiplied(by: CGFloat(scale)) + let newSize = CGSize(width: newWidth, height: newHeight).ceiled + + UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0) + self.draw(in: CGRect(origin: CGPoint.zero, size: newSize)) + let image = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + return AnyImage(image: image!) + } +} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/visual/UIImageViewExtensions.swift b/Example/Pods/ContentKit/ContentKit/Classes/visual/UIImageViewExtensions.swift new file mode 100644 index 0000000..cbaf6aa --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/visual/UIImageViewExtensions.swift @@ -0,0 +1,36 @@ +// +// UIImageViewExtensions.swift +// ContentKit +// +// Created by Georges Boumis on 16/06/2017. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +//public extension UIImageView { +// +// public convenience init(image: Image) { +// self.init(image: image.image) +// } +// +// public convenience init(image: Image, highlighted: Image) { +// self.init(image: image.image, highlightedImage: highlighted.image) +// } +//} diff --git a/Example/Pods/ContentKit/ContentKit/Classes/visual/VisualContent.swift b/Example/Pods/ContentKit/ContentKit/Classes/visual/VisualContent.swift new file mode 100644 index 0000000..e5e2e98 --- /dev/null +++ b/Example/Pods/ContentKit/ContentKit/Classes/visual/VisualContent.swift @@ -0,0 +1,28 @@ +// +// VisualContent.swift +// ContentKit +// +// Created by Georges Boumis on 25/07/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +public protocol VisualContent: Content { +} diff --git a/Example/Pods/ContentKit/LICENSE b/Example/Pods/ContentKit/LICENSE new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/Example/Pods/ContentKit/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Example/Pods/ContentKit/README.md b/Example/Pods/ContentKit/README.md new file mode 100644 index 0000000..c8fd5f3 --- /dev/null +++ b/Example/Pods/ContentKit/README.md @@ -0,0 +1,26 @@ +# ContentKit + +Manage content. + +## Example + +To run the example project, clone the repo, and run `pod install` from the Example directory first. + +## Requirements + +## Installation + +ContentKit is available through [CocoaPods](http://cocoapods.org). To install +it, simply add the following line to your Podfile: + +```ruby +pod "ContentKit" +``` + +## Author + +Georges Boumis, developer.george.boumis@gmail.com + +## License + +ContentKit is available under the Apache 2.0 license. See the LICENSE file for more info. diff --git a/Example/Pods/Ents/Ents/Classes/extensions/TimeExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/TimeExtensions.swift new file mode 100644 index 0000000..d54364c --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/TimeExtensions.swift @@ -0,0 +1,50 @@ +// +// TimeExtensions.swift +// Ents +// +// Created by Georges Boumis on 19/08/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public typealias Milliseconds = TimeInterval +public typealias Seconds = TimeInterval + +public extension TimeInterval { + + /// the zero time interval + public static let zero: TimeInterval = TimeInterval(0) + /// the instant time interval == 1ms + public static let instantly: TimeInterval = TimeInterval(1) + + /// Returns its value in milliseconds + /// - note: The caller should know wether the time interval is in seconds + public var asMilliseconds: Milliseconds { + return self.multiplied(by: 1000.0) + } + /// Returns its value in seconds + /// - note: The caller should know wether the time interval is in milliseconds + public var asSeconds: Seconds { + return self.divided(by: 1000.0) + } + + /// Returns its value in minutes + /// - note: the interval is considered to be in seconds + public var asMinutes: TimeInterval { + return self.divided(by: 60.0) + } + + /// Returns its value in hours + /// - note: the interval is considered to be in seconds + public var asHours: TimeInterval { + return self.asMinutes.divided(by: 60.0) + } + + /// Returns its value in days + /// - note: the interval is considered to be in seconds + public var asDays: TimeInterval { + return self.asHours.divided(by: 24.0) + } +} diff --git a/Example/Pods/Ents/Ents/Classes/extensions/collections/BidirectionalCollectionExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/collections/BidirectionalCollectionExtensions.swift new file mode 100644 index 0000000..edb94de --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/collections/BidirectionalCollectionExtensions.swift @@ -0,0 +1,21 @@ +// +// BidirectionalCollectionExtensions.swift +// Ents +// +// Created by Georges Boumis on 13/06/2017. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public extension BidirectionalCollection { + + /// The "just before past the end" position for the set---that is, the + /// position equal to the last valid subscript argument. + /// + /// If the set is empty, `endIndex` is equal to `startIndex`. + public var lastIndex: Index { + return self.index(self.endIndex, offsetBy: Self.IndexDistance(-1.toIntMax())) + } +} diff --git a/Example/Pods/Ents/Ents/Classes/extensions/collections/CollectionTypeExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/collections/CollectionTypeExtensions.swift new file mode 100644 index 0000000..62779a9 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/collections/CollectionTypeExtensions.swift @@ -0,0 +1,409 @@ +// +// CollectionTypeExtensions.swift +// Ents +// +// Created by Georges Boumis on 13/07/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public extension Collection { + + /// Calls the given closure on each element in the sequence in the same order + /// as a `for`-`in` loop with the index of the elemement in the collection. + /// + /// The two loops in the following example produce the same output: + /// + /// let numberWords = ["one", "two", "three"] + /// for index,word in numberWords.enumerated() { + /// print("\(index): \(word)") + /// } + /// // Prints "0: one" + /// // Prints "1: two" + /// // Prints "2: three" + /// + /// numberWords.forEach { index,word in + /// print("\(index): \(word)") + /// } + /// // Same as above + /// + /// Using the `forEach` method is distinct from a `for`-`in` loop in two + /// important ways: + /// + /// 1. You cannot use a `break` or `continue` statement to exit the current + /// call of the `body` closure or skip subsequent calls. + /// 2. Using the `return` statement in the `body` closure will exit only from + /// the current call to `body`, not from any outer scope, and won't skip + /// subsequent calls. + /// + /// - Parameter body: A closure that takes an element of the sequence, as + /// well as its index in the collection, as its parameters. + public func forEach(inReverse rev: Bool = false, + body: ((Self.Index, Self.Iterator.Element)) throws -> Void) rethrows { + try self.forEach(inRange: self.wholeRange, inReverse: rev, body: body) + } + + /// Trasverses a `Collection` instance from end to start, evaluating the + /// given closure for each element. + public func forEachReversed(body: (Self.Index, Self.Iterator.Element) throws -> Void) rethrows { + try self.forEach(inRange: self.wholeRange, inReverse: true, body: body) + } + + /// Calls the given closure on each element starting from a given index in + /// the sequence in the same order as a `for`-`in` loop with the index of + /// the elemement in the collection. + /// The iterations starts from the given index. + /// + /// let a = ["George", "Martha", "Nick", "Honey"] + /// a.forEach(startingFromIndex: 2) { index,element in + /// print("\(index): \(word)") + /// } + /// // Prints "2: Nick" + /// // Prints "3: Honey" + /// - Parameter startingFromIndex: the index to start iterating from + /// - Parameter body: A closure that takes an element of the sequence, as + /// well as its index in the collection, as its parameters. + public func forEach(startingFromIndex index: Self.Index, + body: (Self.Index, Self.Iterator.Element) throws -> Void) rethrows { + try self.forEach(inRange: index.. Void) rethrows { + try self.forEach(inRange: self.startIndex.., + inReverse rev: Bool = false, + body: (Self.Index, Self.Iterator.Element) throws -> Void) rethrows { + guard not(range.isEmpty) else { return } + guard (range.lowerBound >= self.startIndex && range.lowerBound < self.endIndex) && + (range.upperBound >= self.startIndex && range.upperBound <= self.endIndex) + else { return } + if not(rev) { + try self._forEachIterateLoop(with: range, body: body) + } + else { + try self._forEachIterateLoopInReverse(with: range, body: body) + } + } + + private func _forEachIterateLoop(with range: Range, + body: (Self.Index, Self.Iterator.Element) throws -> Void) rethrows { + try self.__forEachIterateLoop(with: range) { (i, e, b) in + try body(i,e) + } + } + + private func __forEachIterateLoop(with range: Range, + body: (Self.Index, Self.Iterator.Element, _ stop: inout Bool) throws -> Void) rethrows { + var i = range.lowerBound + var stop = false + while (i < range.upperBound) && (stop == false) { + let element = self[i] + try body(i, element, &stop) + i = self.index(after: i) + } + } + + private func _forEachIterateLoopInReverse(with range: Range, + body: (Self.Index, Self.Iterator.Element) throws -> Void) rethrows { + try self.__forEachIterateLoopInReverse(with: range) { (i, e, b) in + try body(i,e) + } + } + + private func __forEachIterateLoopInReverse(with range: Range, + body: (Self.Index, Self.Iterator.Element, _ stop: inout Bool) throws -> Void) rethrows { + var i = self.index(range.upperBound, offsetBy: -1) + var stop = false + while (i >= range.lowerBound) && (stop == false) { + let element = self[i] + try body(i, element, &stop) + i = self.index(i, offsetBy: -1) + } + } + + /// Enumerates over all elements of the this `Collection` instance, evaluating + /// the given closure, passing the index of the element as well as a `stop` + /// indicator to stop prematurely the iteration. + /// Tris to replicate `-enumerateObjectsUsingBlock:` of `NSArray`. + public func enumerate(_ body: (Self.Index, Self.Iterator.Element, _ stop: inout Bool) throws -> Void) rethrows { + try self.__forEachIterateLoop(with: self.wholeRange, body: body) + } +} + +public extension Collection { + + /// A range that contains all valid indexes of the collection. + /// This range does not contain "pass the end" indexes. + public var wholeRange: Range { + return self.startIndex.. { + let whole = self.wholeRange + let upper = self.index(whole.upperBound, offsetBy: -1) + return ClosedRange(uncheckedBounds: (whole.lowerBound, upper: upper)) + } +} + +public extension Collection where Index: Strideable, Index.Stride: SignedInteger { + + /// A range that contains all valid indexes of the collection. + /// This range does not contain "pass the end" indexes. + public var wholeRange: CountableClosedRange { + return CountableClosedRange(self.closedWholeRange) + } +} + +public extension Collection { + + /// Find indices satisfying the given predicate. + /// - parameter predicate: a predicate + /// - returns: the indices of elements satisfying predicate + public func indices(where predicate: (Iterator.Element) -> Bool) -> [Index] { + var indices: [Index] = Array() + indices.reserveCapacity(Int(self.count.toIntMax())) + + let range: Range = self.startIndex.. Bool) rethrows -> (included:[Self.Iterator.Element], notIncluded:[Self.Iterator.Element]) { + var filtered: [Self.Iterator.Element] = [] + var unfiltered: [Self.Iterator.Element] = [] + + let capacity = Int(self.count.toIntMax())/2 + filtered.reserveCapacity(capacity) + unfiltered.reserveCapacity(capacity) + + for element in self { + if try includeElement(element) { + filtered.append(element) + } + else { + unfiltered.append(element) + } + } + return (filtered,unfiltered) + } + + /// Returns an array **NOT** containing, in order, the elements of the + /// sequence that satisfy the given predicate. + /// This is a **reverted** filter(). + /// + /// let cast = ["Vivien", "Marlon", "Kim", "Karl"] + /// let shortNames = cast.sieve { $0.characters.count < 5 } + /// print(shortNames) + /// // Prints "["Vivien", "Marlon"]" + /// + /// - Parameter excluding: A closure that takes an element of the + /// sequence as its argument and returns a Boolean value indicating whether + /// the element should be excluded in the returned array. + /// - Returns: An array of the elements that `excluding` excluded. + public func sieve(_ excluding: (Self.Iterator.Element) throws -> Bool) rethrows -> [Self.Iterator.Element] { + return try self.filter { try not(excluding($0)) } + } +} + +public extension Collection { + + /// Returns an array containing, in order, the elements of the sequence + /// that satisfy the given predicate. + /// + /// In this example, `filter` is used to include only names shorter than + /// five characters. + /// + /// let cast = ["Vivien", "Marlon", "Kim", "Karl"] + /// let shortNames = cast.filteri { $1.characters.count < 5 || $1 == 0 } + /// print(shortNames) + /// // Prints "["Vivien", "Kim", "Karl"]" + /// + /// - Parameter isIncluded: A closure that takes an element of the + /// sequence, as well as its index, as its arguments and returns a Boolean + /// value indicating whether the element should be included in the + /// returned array. + /// - Returns: An array of the elements that `includeElement` allowed. + public func filteri(_ isIncluded: (Self.Index, Self.Iterator.Element) throws -> Bool) rethrows -> [Self.Iterator.Element] { + var result: [Iterator.Element] = [] + let count = Int(self.count.toIntMax()) + result.reserveCapacity(count) + try self.forEach { index,element in + if try isIncluded(index,element) { + result.append(element) + } + } + return result + } + + /// Returns an array containing the results of mapping the given closure + /// over the sequence's elements. + /// + /// In this example, `map` is used first to convert the names in the array + /// to lowercase strings and then to count their characters. + /// + /// let cast = ["Vivien", "Marlon", "Kim", "Karl"] + /// let lowercaseNames = cast.mapi { $0 > 1 ? $1.lowercaseString && : $1 } + /// // 'lowercaseNames' == ["Vivien", "Marlon", "kim", "karl"] + /// let letterCounts = cast.map { $0.characters.count } + /// // 'letterCounts' == [6, 6, 3, 4] + /// + /// - Parameter transform: A mapping closure. `transform` accepts an + /// element of this sequence, as well as its index, as its parameters and + /// returns a transformed value of the same or of a different type. + /// - Returns: An array containing the transformed elements of this + /// sequence. + public func mapi(_ transform: (Self.Index, Self.Iterator.Element) throws -> T) rethrows -> [T] { + var result: [T] = [] + let count = Int(self.count.toIntMax()) + result.reserveCapacity(count) + try self.forEach { i,e in + let e1 = try transform(i, e) + result.append(e1) + } + return result + } + + public func flatMapi(_ transform: (Self.Index, Self.Iterator.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Iterator.Element] { + var result: [SegmentOfResult.Iterator.Element] = [] + let count = Int(self.count.toIntMax()) + result.reserveCapacity(count) // at least + try self.forEach { i,e in + let e1 = try transform(i, e) + result.append(contentsOf: e1) + } + return result + } + + /// Returns the result of combining the elements of the sequence using the + /// given closure. + /// + /// Use the `reduce(_:_:)` method to produce a single value from the elements + /// of an entire sequence. For example, you can use this method on an array + /// of numbers to find their sum or product. + /// + /// The `nextPartialResult` closure is called sequentially with an + /// accumulating value initialized to `initialResult` and each element of + /// the sequence. This example shows how to find the sum of an array of + /// numbers. + /// + /// let numbers = [1, 2, 3, 4] + /// let numberSum = numbers.reduce(0, { x, y in + /// x + y + /// }) + /// // numberSum == 10 + /// + /// When `numbers.reduce(_:_:)` is called, the following steps occur: + /// + /// 1. The `nextPartialResult` closure is called with `initialResult`---`0` + /// in this case---and the first element of `numbers`, returning the sum: + /// `1`. + /// 2. The closure is called again repeatedly with the previous call's return + /// value and each element of the sequence. + /// 3. When the sequence is exhausted, the last value returned from the + /// closure is returned to the caller. + /// + /// If the sequence has no elements, `nextPartialResult` is never executed + /// and `initialResult` is the result of the call to `reduce(_:_:)`. + /// + /// - Parameters: + /// - initialResult: The value to use as the initial accumulating value. + /// `initialResult` is passed to `nextPartialResult` the first time the + /// closure is executed. + /// - nextPartialResult: A closure that combines an accumulating value and + /// an element of the sequence into a new accumulating value, as well as + /// an index, to be used in the next call of the `nextPartialResult` + /// closure or returned to the caller. + /// - Returns: The final accumulated value. If the sequence has no elements, + /// the result is `initialResult`. + public func reducei(_ initialResult: Result, _ nextPartialResult: (Result, Self.Index, Self.Iterator.Element) throws -> Result) rethrows -> Result { + var result = initialResult + try self.forEach { i,e in + result = try nextPartialResult(result, i, e) + } + return result + } +} + + +public extension Collection { + + /// The "just before past the end" position for the set---that is, the + /// position equal to the last valid subscript argument. + /// + /// If the set is empty, `endIndex` is equal to `startIndex`. + public var lastIndex: Index { + guard self.hasElements else { return self.startIndex } + let start = self.startIndex + var index = start + while self.index(after: index) < self.endIndex { + index = self.index(after: index) + } + return index + } +} + +public extension Collection { + + /// A `Boolean` value indicating whether the collection is *NOT* empty. + /// + /// When you need to check whether your collection is not empty, use the + /// `hasElements` property instead of checking that the `count` property is + /// different from zero. For collections that don't conform to + /// `RandomAccessCollection`, accessing the `count` property iterates + /// through the elements of the collection. + /// + /// let horseName = "Silver" + /// if horseName.characters.hasElements { + /// print("Hi ho, \(horseName)!") + /// } else { + /// print("I've been through the desert on a horse with no name.") + /// } + /// // Prints "Hi ho, Silver!") + /// + /// - Complexity: O(1) + public var hasElements: Bool { + return (self.isEmpty == false) + } +} + diff --git a/Example/Pods/Ents/Ents/Classes/extensions/collections/DictionaryExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/collections/DictionaryExtensions.swift new file mode 100644 index 0000000..d9b45b8 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/collections/DictionaryExtensions.swift @@ -0,0 +1,57 @@ +// +// DictionaryExtensions.swift +// Ents +// +// Created by Georges Boumis on 22/03/2017. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public extension Dictionary { + + /// Merges two dictionaries or a dictionary with a sequence of key-value pairs + public mutating func merge( _ other: S) where S: Sequence, S.Iterator.Element == Dictionary.Element { + for (key,value) in other { + self[key] = value + } + } + + /// Creates a merged dictionary by merging with another dictionary or with a + /// sequence of key-value pairs + public func merging( _ other: S) -> [Key: Value] where S: Sequence, S.Iterator.Element == Dictionary.Element { + var dict = self + dict.merge(other) + return dict + } +} + +public extension Dictionary { + + /// Creates a dictionary from a sequence of key-value pairs + public init(_ sequence: S) where S.Iterator.Element == Dictionary.Element { + self = [:] + self.merge(sequence) + } +} + +public extension Dictionary { + + /// Creates a new dictionary transforming the Values into NewValues using the transform + /// - parameter transform: a closure that transforms the values of the Dictionary + /// - returns: a new dictionary with its values transformed + public func mapValues(transform: (Value) -> (NewValue)) -> Dictionary { + return Dictionary(self.map { (key,value) in + return (key, transform(value)) + }) + } +} + +public extension Dictionary { + + /// Creates a new dictionary that contains the updated (key,value) pair + public func updating(withKey key: Key, value: Value) -> Dictionary { + return self.merging([key: value]) + } +} diff --git a/Example/Pods/Ents/Ents/Classes/extensions/collections/RandomAccessCollectionExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/collections/RandomAccessCollectionExtensions.swift new file mode 100644 index 0000000..75129ab --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/collections/RandomAccessCollectionExtensions.swift @@ -0,0 +1,98 @@ +// +// RandomAccessCollection.swift +// Ents +// +// Created by Georges Boumis on 22/03/2017. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public extension RandomAccessCollection where IndexDistance: Integer { + + + /// the middle element of an odd sized collection. + /// - Note: only returns an element if the collection has elements and + /// the count is an odd number + public var middle: Self.Iterator.Element? { + guard self.hasElements else { return nil } + + let odd = (self.count % 2 != 0) + let even = not(odd) + + if odd { + if let middle = self._oddMiddleIndex { + return self[middle] + } + } + if even { + return self.lowerMiddle + } + return nil + } + + + /// the lower middle element of an even sized collection. + public var lowerMiddle: Self.Iterator.Element? { + guard self.hasElements else { return nil } + guard self.count % 2 == 0 else { return nil } + + if let middle = self._evenMiddleIndex { + return self[self.index(before: middle)] + } + return nil + } + + /// the upper middle element of an even sized collection. + public var upperMiddle: Self.Iterator.Element? { + guard self.hasElements else { return nil } + guard self.count % 2 == 0 else { return nil } + + if let middle = self._evenMiddleIndex { + return self[middle] + } + return nil + } + + + + private var _oddMiddleIndex: Self.Index? { + guard self.hasElements else { return nil } + if self.count % 2 == 0 { + return nil + } + let count = self.count + let offset = Self.IndexDistance((count/2).toIntMax()) + return self.index(self.startIndex, offsetBy: offset) + } + + private var _evenMiddleIndex: Self.Index? { + guard self.hasElements else { return nil } + + let count = self.count + let offset = Self.IndexDistance((count/2).toIntMax()) + return self.index(self.startIndex, offsetBy: offset) + } +} + +public extension RandomAccessCollection { + + /// a "safe" accesor of elements in a `RandomAccessColelction` instance. + public func element(atIndex i: Self.Index) -> Self.Iterator.Element? { + guard i < self.endIndex && i >= self.startIndex else { return nil } + return self[i] + } + + /// returns a random element of the collection. + public var randomElement: Self.Iterator.Element? { + guard self.hasElements else { return nil } + guard self.count > 1 else { return self[self.startIndex] } // optimization + + let random = Self.IndexDistance(arc4random_uniform(UInt32(self.count.toIntMax())).toIntMax()) + let index = self.index(self.startIndex, offsetBy: random) + return self.element(atIndex: index) + } +} + + diff --git a/Example/Pods/Ents/Ents/Classes/extensions/collections/RangeReplaceableCollectionExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/collections/RangeReplaceableCollectionExtensions.swift new file mode 100644 index 0000000..807017c --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/collections/RangeReplaceableCollectionExtensions.swift @@ -0,0 +1,126 @@ +// +// RangeReplaceableCollectionExtensions.swift +// Ents +// +// Created by Georges Boumis on 22/03/2017. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public extension RangeReplaceableCollection where Self.SubSequence.Iterator.Element == Self.Iterator.Element { + + /// creates a new collection that was deprived of its last element + public func dropingLast(_ n: Int = 1) -> Self { + guard n > 0 else { return self } + return Self(self.dropLast(n)) + } + + /// creates a new collection that was deprived of its first element + public func dropingFirst(_ n: Int = 1) -> Self { + guard n > 0 else { return self } + return Self(self.dropFirst(n)) + } +} + +public extension RangeReplaceableCollection { + + /// iterates over the elements before removing all of them from the collection + public mutating func removeAll(_ block: (Self.Iterator.Element) throws -> Void) rethrows { + try self.forEach { (_,e) in + try block(e) + } + self.removeAll() + } + + /// creates a new collection populated by the given element at the end + /// + /// let a = ["1", "2", "3"] + /// let appended = a.appending(element: "4") + /// print(appended) + /// // prints "["1", "2", "3", "4"]" + /// + /// - Parameter element: the element to append + /// - Returns: a new collection populated by the given element at the end + public func appending(element: Self.Iterator.Element) -> Self { + var mutant = self + mutant.append(element) + return mutant + } + + /// creates a new collection populated by the given element at the start + /// + /// let a = ["1", "2", "3"] + /// let prepended = a.prepending(element: "0") + /// print(prepended) + /// // prints "["0", "1", "2", "3"]" + /// + /// - Parameter element: the element to prepend + /// - Returns: creates a new collection populated by the given element at the start + public func prepending(element: Self.Iterator.Element) -> Self { + var mutant = self + mutant.insert(element, at: mutant.startIndex) + return mutant + } + + + // sieve() returns [Self.Iterator.Element], + /// - Parameter predicate: the predicate + /// - Returns: a new collection deprived of the elemnets that satisfy the given predicate + /// - SeeAlso: sieve(:) + public func removing(elementsSatisfying predicate: (Self.Iterator.Element) throws -> Bool) rethrows -> Self { + return try Self(self.sieve(predicate)) + } + + /// remove elements that satisfy the given predicate + /// - Parameter predicate: the predicate + /// - SeeAlso: sieve(:) + public mutating func remove(elementsSatisfying predicate: (Self.Iterator.Element) throws -> Bool) rethrows { + self = try self.removing(elementsSatisfying: predicate) + } +} + +//public extension RangeReplaceableCollection +//where Self.Iterator.Element: Comparable, +// Self.IndexDistance: Integer, +// Self.Index == Self.IndexDistance, +//Self.SubSequence.Iterator.Element == Self.Iterator.Element { +// +// public mutating func mergeSortInPlace() { +// var tmp: [Self.Iterator.Element] = [] +// tmp.reserveCapacity(Int(self.count.toIntMax())) +// +// func merge(lo: Self.Index, mi: Self.Index, hi: Self.Index) { +// tmp.removeAll(keepingCapacity: true) +// +// var i = lo, j = mi +// while i != mi && j != hi { +// let sj = self[j], si = self[i] +// if sj < si { +// tmp.append(sj) +// j = self.index(after: j) +// } +// else { +// tmp.append(si) +// i = self.index(after: i) +// } +// } +// print("i = \(i), j = \(j), (lo,mi,hi) = (\(lo),\(mi),\(hi))") +// tmp.append(contentsOf: self[i.. Bool) -> Iterator.Element? { + for element in self.reversed() where predicate(element) { + return element + } + return nil + } +} + +public extension Sequence { + + /// - Parameter pridecate: a predicate + /// - returns: true if all elements satisfy the predicate + public func all(matching predicate: (Iterator.Element) -> Bool) -> Bool { + return !self.contains { !predicate($0) } + } + + /// - Parameter pridecate: a predicate + /// - returns: true if none of the elements satisfy the predicate + public func none(matching predicate: (Iterator.Element) -> Bool) -> Bool { + return self.all { !predicate($0) } + } +} + +public extension Sequence where Iterator.Element: Hashable { + + /// - returns: an array containing once all elemnts, in order they appear in the sequence + public func unique() -> [Iterator.Element] { + var seen: Set = [] + return self.filter { element in + if seen.contains(element) { + return false + } + seen.insert(element) + return true + } + } +} + diff --git a/Example/Pods/Ents/Ents/Classes/extensions/collections/SetAlgebraExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/collections/SetAlgebraExtensions.swift new file mode 100644 index 0000000..e265d18 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/collections/SetAlgebraExtensions.swift @@ -0,0 +1,18 @@ +// +// SetAlgebraExtensions.swift +// Ents +// +// Created by Georges Boumis on 22/03/2017. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public extension SetAlgebra { + + /// inverted .contains + public func doesNotContain(_ element: Self.Element) -> Bool { + return doesNot(self.contains(element)) + } +} diff --git a/Example/Pods/Ents/Ents/Classes/extensions/collections/Sorting.swift b/Example/Pods/Ents/Ents/Classes/extensions/collections/Sorting.swift new file mode 100644 index 0000000..18f1dbb --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/collections/Sorting.swift @@ -0,0 +1,60 @@ +// +// Sorting.swift +// Ents +// +// Created by Georges Boumis on 20/08/2017. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public typealias SortDescriptor = (Value,Value) -> Bool + +public func sortDescriptor( + key: @escaping (Value) -> Key, + _ areInIncreasingOrder: @escaping (Key, Key) -> Bool + ) -> SortDescriptor { + return { areInIncreasingOrder(key($0), key($1)) } +} + +public func sortDescriptor( + key: @escaping (Value) -> Key +) -> SortDescriptor where Key: Comparable { + return { key($0) < key($1) } +} + +public func sortDescriptor( + key: @escaping (Value) -> Key, + ascending: Bool = true, + _ comparator: @escaping (Key) -> (Key) -> ComparisonResult + ) -> SortDescriptor { + return { lhs, rhs in + let order: ComparisonResult = ascending + ? .orderedAscending + : .orderedDescending + return comparator(key(lhs))(key(rhs)) == order + } +} + +public func combine(sortDescriptors: [SortDescriptor]) -> SortDescriptor { + return { lhs, rhs in + for areInIncreasingOrder in sortDescriptors { + if areInIncreasingOrder(lhs,rhs) { return true } + if areInIncreasingOrder(rhs,lhs) { return false } + } + return false + } +} + +public func lift(_ compare: @escaping (A) -> (A) -> ComparisonResult) -> (A?) -> (A?) -> ComparisonResult { + return { lhs in { rhs in + switch (lhs,rhs) { + case (nil,nil): return .orderedSame + case (nil,_): return .orderedAscending + case (_,nil): return .orderedDescending + case let (l?, r?): return compare(l)(r) + default: fatalError() // Impossible case + }} + } +} diff --git a/Example/Pods/Ents/Ents/Classes/extensions/geometry/CALayerExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/geometry/CALayerExtensions.swift new file mode 100644 index 0000000..8d09672 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/geometry/CALayerExtensions.swift @@ -0,0 +1,71 @@ +// +// CALayerExtensions.swift +// Ents +// +// Created by Georges Boumis on 29/08/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import QuartzCore + +public extension CALayer { + + /// Computes a new point of a given postion using a given ancorPoint. + final public func point(ofPosition position: CGPoint, + withAnchorPoint anchorPoint: CGPoint) -> CGPoint { + var newPoint = CGPoint(x: self.bounds.size.width * anchorPoint.x, + y: self.bounds.size.height * anchorPoint.y) + var oldPoint = CGPoint(x: self.bounds.size.width * self.anchorPoint.x, + y: self.bounds.size.height * self.anchorPoint.y) + + newPoint = newPoint.applying(self.affineTransform()) + oldPoint = oldPoint.applying(self.affineTransform()) + + var position = position + position.x -= oldPoint.x + position.x += newPoint.x + + position.y -= oldPoint.y + position.y += newPoint.y + return position + } + + + /// Computes a new point that describes the `position` of the layer if the given + /// anchorPoing was to be used. + final public func position(ofAnchorPoint anchorPoint: CGPoint) -> CGPoint { + return self.point(ofPosition: self.position, withAnchorPoint: anchorPoint) + } + + /// changes the anchorPoing of this instance of `CALayer` without repositioning + /// the layer. + final public func setAnchorPointWithoutMoving(_ anchorPoint: CGPoint, implicit: Bool = false) { + let position = self.position(ofAnchorPoint: anchorPoint) + + if implicit { + self.position = position + self.anchorPoint = anchorPoint + } + else { + NoImplicitAnimation { + self.position = position + self.anchorPoint = anchorPoint + } + } + } +} + +#if DEBUG + public extension CALayer { + public func debugQuickLookObject() -> AnyObject? { + let size = self.bounds.size + UIGraphicsBeginImageContext(size) + let context = UIGraphicsGetCurrentContext() + self.render(in: context!) + let image = UIGraphicsGetImageFromCurrentImageContext() + UIGraphicsEndImageContext() + return image + } + } +#endif diff --git a/Example/Pods/Ents/Ents/Classes/extensions/geometry/CATransform3DExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/geometry/CATransform3DExtensions.swift new file mode 100644 index 0000000..6c20fb8 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/geometry/CATransform3DExtensions.swift @@ -0,0 +1,34 @@ +// +// CATTransform3D.swift +// Ents +// +// Created by Georges Boumis on 26/08/16. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public extension CATransform3D { + + /// create a NSValue from this instance of `CATransform3D`. + public var value: NSValue { + return NSValue(caTransform3D: self) + } + + /// create a CGAffineTransform from this instance of `CATransform3D`. + public var affine: CGAffineTransform { + return CATransform3DGetAffineTransform(self) + } + + /// concatenate this instance of `CATransform3D` with another instance of `CATransform3D`. + public mutating func concatenate(_ t: CATransform3D) { + self = self.concatenating(t) + } + + /// concatenates this instance of `CATransform3D` with another instance of `CATransform3D` + /// and returns a new `CATransform3D` instance. + public func concatenating(_ t: CATransform3D) -> CATransform3D { + return CATransform3DConcat(self, t) + } +} diff --git a/Example/Pods/Ents/Ents/Classes/extensions/geometry/CGAffineTransformExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/geometry/CGAffineTransformExtensions.swift new file mode 100644 index 0000000..a42d95a --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/geometry/CGAffineTransformExtensions.swift @@ -0,0 +1,28 @@ +// +// CGAffineTransformExtensions.swift +// Ents +// +// Created by Georges Boumis on 29/08/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +extension CGAffineTransform { + + /// creates a `CATransform3D` instance from this `CGAffineTransform` instance. + public var asCATransform3D: CATransform3D { + return CATransform3DMakeAffineTransform(self) + } + + /// creates a `NSValue` instance from this `CGAffineTransform` instance. + public var value: NSValue { + return NSValue(cgAffineTransform: self) + } + + /// concatenate this instance of `CGAffineTransform` with another instance of `CGAffineTransform`. + public mutating func concatenate(_ t: CGAffineTransform) { + self = self.concatenating(t) + } +} diff --git a/Example/Pods/Ents/Ents/Classes/extensions/geometry/CGFloatExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/geometry/CGFloatExtensions.swift new file mode 100644 index 0000000..7e736bb --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/geometry/CGFloatExtensions.swift @@ -0,0 +1,88 @@ +// +// CGFloatExtensions.swift +// Ents +// +// Created by Georges Boumis on 07/07/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +extension CGFloat { + + /// converts this `CGFloat` instance to a `Float` instance. + public var asFloat: Float { + return Float(self) + } + + /// converts this `CGFloat` instance to a `Double` instance. + public var asDouble: Double { + return Double(self) + } +} + + +public extension CGFloat { + + /// returns the minimum of this `CGFloat` instance and a `Int` instance. + public func minimum(_ other: Int) -> CGFloat { + return self.minimum(CGFloat(other)) + } + + /// returns the minimum of this `CGFloat` instance and a `Float` instance. + public func minimum(_ other: Float) -> CGFloat { + return self.minimum(CGFloat(other)) + } + + /// returns the maximum of this `CGFloat` instance and a `Int` instance. + public func maximum(_ other: Int) -> CGFloat { + return self.maximum(CGFloat(other)) + } + + /// returns the maximum of this `CGFloat` instance and a `Float` instance. + public func maximum(_ other: Float) -> CGFloat { + return self.maximum(CGFloat(other)) + } +} + +public extension CGFloat { + + public func isDifferent(from other: Int) -> Bool { + return self.isDifferent(from: CGFloat(other)) + } + + public func isDifferent(from other: Float) -> Bool { + return self.isDifferent(from: CGFloat(other)) + } +} + +public extension CGFloat { + + public var asNumber: NSNumber { + return NSNumber(value: CGFloat.NativeType(self)) + } +} + +public extension CGFloat { + + public func power(_ p: Double) -> Double { + return Foundation.pow(Double(self), p) + } + + public func power(_ p: Int) -> Double { + return self.power(Double(p)) + } + + public func power(_ p: Float) -> Double { + return self.power(Double(p)) + } + + public var square: Double { + return self.power(2.0) + } + + public var cube: Double { + return self.power(3.0) + } +} diff --git a/Example/Pods/Ents/Ents/Classes/extensions/geometry/CGPointExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/geometry/CGPointExtensions.swift new file mode 100644 index 0000000..e5ea65c --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/geometry/CGPointExtensions.swift @@ -0,0 +1,255 @@ +// +// CGPointRounding.swift +// UIViewPosition +// +// Created by Georges Boumis on 12/04/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import CoreGraphics + +/// Compose two `CGFloat` to form a point operator +infix operator ^: AdditionPrecedence + +public func ^ (lhs: CGFloat, rhs: CGFloat) -> CGPoint { + return CGPoint(x: lhs, y: rhs) +} + +public func ^ (lhs: Int, rhs: Int) -> CGPoint { + return CGPoint(x: lhs, y: rhs) +} + +public func ^ (lhs: Double, rhs: Double) -> CGPoint { + return CGPoint(x: CGFloat(lhs), y: CGFloat(rhs)) +} + +public func ^ (lhs: Float, rhs: Float) -> CGPoint { + return CGPoint(x: CGFloat(lhs), y: CGFloat(rhs)) +} + +///// Compose two `Integers` to form a point operator +//public func ^ (lhs: I, rhs: I) -> CGPoint where I:Integer { +// return CGPoint(x: CGFloat(lhs.toIntMax()), y: CGFloat(rhs.toIntMax())) +//} +// +///// Compose two `BinaryFloatingPoint` to form a point operator +//public func ^ (lhs: F, rhs: F) -> CGPoint +// where F: BinaryFloatingPoint, +// F.RawExponent == CGFloat.RawExponent, +// F.RawSignificand == CGFloat.RawSignificand { +// let l = CGFloat(sign: lhs.sign, exponentBitPattern: lhs.exponentBitPattern, significandBitPattern: lhs.significandBitPattern) +// let r = CGFloat(sign: rhs.sign, exponentBitPattern: rhs.exponentBitPattern, significandBitPattern: rhs.significandBitPattern) +// return CGPoint(x: l, y: r) +//} + +public extension CGPoint { + + /// returns a new point with floored `x` and `y` of the receiver + public var floored: CGPoint { + var point = self + point.x = CoreGraphics.floor(self.x) + point.y = CoreGraphics.floor(self.y) + return point + } + + + /// floors `x` and `y` + public mutating func floor() { + self = self.floored + } + + /// returns a new point with ceiled `x` and `y` of the receiver + public var ceiled : CGPoint { + var point = self + point.x = CoreGraphics.ceil(self.x) + point.y = CoreGraphics.ceil(self.y) + return point + } + + /// ceils `x` and `y` + public mutating func ceil() { + self = self.ceiled + } +} + +public extension CGPoint { + + /// converts this `CGPoint` instance to a `NSValue` instance. + public var asValue: NSValue { + return NSValue(cgPoint: self) + } +} + +public extension CGPoint { + + /// moves the receiver by the specified amounts on the x an y axis + public mutating func translate(dx : CGFloat, dy : CGFloat) { + self.translate(horizontally: dx) + self.translate(vertically: dy) + } + + /// creates a point translated by the specified amounts on the x an y axis + public func translatedBy(dx : CGFloat, dy : CGFloat) -> CGPoint { + var point = self; + point.translate(dx: dx, dy: dy) + return point + } + + /// moves the receiver by the specified amounts on y axis + public mutating func translate(vertically dy: CGFloat) { + self.y += dy + } + + /// moves the receiver by the specified amounts on x axis + public mutating func translate(horizontally dx: CGFloat) { + self.x += dx + } + + /// creates a point translated by the specified amounts on the y axis + public func translated(vertically dy: CGFloat) -> CGPoint { + var point = self + point.translate(vertically: dy) + return point + } + + /// creates a point translated by the specified amounts on the x axis + public func translated(horizontally dx: CGFloat) -> CGPoint { + var point = self + point.translate(horizontally: dx) + return point + } +} + +public extension CGPoint { + + /// returns a Boolean indicating wether the receiver is on the left of the + /// passed in argument + /// - parameter other: another point + public func left(of other: CGPoint) -> Bool { + return self.x.isLessThan(other.x) + } + + /// returns a Boolean indicating wether the receiver is on the rigth of the + /// passed in argument + /// - parameter other: another point + public func right(of other: CGPoint) -> Bool { + return self.x.isGreaterThan(other.x) + } + + /// returns a Boolean indicating wether the receiver is above the + /// passed in argument + /// - parameter other: another point + public func above(of other: CGPoint) -> Bool { + return self.y.isLessThan(other.y) + } + + /// returns a Boolean indicating wether the receiver is below the + /// passed in argument + /// - parameter other: another point + public func below(of other: CGPoint) -> Bool { + return self.y.isGreaterThan(other.y) + } + + /// returns a Boolean indicating wether the receiver is on the same + /// Longitude as the passed in argument + /// - parameter other: another point + public func sameVerticalAxe(with other: CGPoint) -> Bool { + return self.x.isEqual(to: other.x) + } + + /// returns a Boolean indicating wether the receiver is on the same + /// latitude as the passed in argument + /// - parameter other: another point + public func sameHorizontalAxe(with other: CGPoint) -> Bool { + return self.y.isEqual(to: other.y) + } + + /// a 8-point direction used for comparing positions of CGPoint instances. + /// - note: it's is assumed that the origin of the coordinate system is at + /// the upper left. + public enum Direction { + case north /// the point is above + case west /// the point is left + case east /// the point is right + case south /// the point is below + + case northWest /// the point is above and to the left + case northEast /// the point is above and to the right + case southWest /// the point is below and to the left + case southEast /// the point is below and to the right + + case none /// the points are on the same spot + } + + /// returns an approximate direcation of the receiver according to the + /// argument passed in + /// - parameter other: another point + public func direction(comparedTo other: CGPoint) -> CGPoint.Direction { + if self == other { return CGPoint.Direction.none } + + if self.left(of: other).and(self.above(of: other)) { + return CGPoint.Direction.northWest + } + + if self.right(of: other).and(self.above(of: other)) { + return CGPoint.Direction.northEast + } + + if self.left(of: other).and(self.below(of: other)) { + return CGPoint.Direction.southWest + } + + if self.right(of: other).and(self.below(of: other)) { + return CGPoint.Direction.southEast + } + + + + if self.sameVerticalAxe(with: other).and(self.above(of: other)) { + return CGPoint.Direction.north + } + + if self.sameVerticalAxe(with: other).and(self.below(of: other)) { + return CGPoint.Direction.south + } + + if self.sameHorizontalAxe(with: other).and(self.left(of: other)) { + return CGPoint.Direction.west + } + + if self.sameHorizontalAxe(with: other).and(self.right(of: other)) { + return CGPoint.Direction.east + } + + return CGPoint.Direction.none + } +} + +public extension CGPoint { + + /// creates a CGPoint with the given `x` and the same `y` as the receiver + /// - parameter x: the new `x`. + public func with(x: CGFloat) -> CGPoint { + var point = self + point.x = x + return point + } + + /// creates a CGPoint with the given `y` and the same `x` as the receiver + /// - parameter y: the new `y`. + public func with(y: CGFloat) -> CGPoint { + var point = self + point.y = y + return point + } +} + +public extension CGPoint { + + /// apply a transformation to a CGPoint + /// - parameter t: a transformation + public mutating func apply(_ t: CGAffineTransform) { + self = self.applying(t) + } +} diff --git a/Example/Pods/Ents/Ents/Classes/extensions/geometry/CGRectExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/geometry/CGRectExtensions.swift new file mode 100644 index 0000000..acaa5bf --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/geometry/CGRectExtensions.swift @@ -0,0 +1,535 @@ +// +// CGRectRounding.swift +// UIViewPosition +// +// Created by Georges Boumis on 12/04/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import CoreGraphics + +infix operator ◊ : AdditionPrecedence + +/// creates a CGRect given a point and a size +public func ◊ (lhs: CGPoint, rhs: CGSize) -> CGRect { + return CGRect(origin: lhs, size: rhs) +} + +public extension CGRect { + + /// creates a CGRect with the specified center and size components + public init(center: CGPoint, width: CGFloat, height: CGFloat) { + self.init(center: center, size: CGSize(width: width, height: height)) + } + + /// creates a CGRect with the specified center and size + public init(center: CGPoint, size : CGSize) { + let x = center.x - (size.width * 0.5) + let y = center.y - (size.height * 0.5) + let origin = CGPoint(x: x, y: y) + self.init(origin: origin, size: size) + } + + // + // Creating CGRect with unusual points + // + + /// creates a CGRect with the specified rightCenter point and size components + public init(rightCenter: CGPoint, width: CGFloat, height: CGFloat) { + self.init(rightCenter: rightCenter, size: CGSize(width: width, height: height)) + } + + /// creates a CGRect with the specified rightCenter point and size + public init(rightCenter: CGPoint, size: CGSize) { + let x = rightCenter.x - size.width + let y = rightCenter.y - (size.height * 0.5) + let origin = CGPoint(x: x, y: y) + self.init(origin: origin, size: size) + } + + /// creates a CGRect with the specified leftCenter point and size components + public init(leftCenter: CGPoint, width: CGFloat, height: CGFloat) { + self.init(leftCenter: leftCenter, size: CGSize(width: width, height: height)) + } + + /// creates a CGRect with the specified leftCenter point and size + public init(leftCenter : CGPoint, size : CGSize) { + let x = leftCenter.x + let y = leftCenter.y - (size.height * 0.5) + let origin = CGPoint(x: x, y: y); + self.init(origin: origin, size: size) + } + + /// creates a CGRect with the specified topCenter point and size components + public init(topCenter: CGPoint, width: CGFloat, height: CGFloat) { + self.init(topCenter: topCenter, size: CGSize(width: width, height: height)) + } + + /// creates a CGRect with the specified topCenter point and size + public init(topCenter: CGPoint, size: CGSize) { + let x = topCenter.x - (size.width * 0.5) + let y = topCenter.y + let origin = CGPoint(x: x, y: y) + self.init(origin: origin, size: size) + } + + /// creates a CGRect with the specified bottomCenter point and size components + public init(bottomCenter: CGPoint, width: CGFloat, height: CGFloat) { + self.init(bottomCenter: bottomCenter, size: CGSize(width: width, height: height)) + } + + /// creates a CGRect with the specified bottomCenter point and size + public init(bottomCenter : CGPoint, size : CGSize) { + let x = bottomCenter.x - (size.width * 0.5) + let y = bottomCenter.y - size.height + let origin = CGPoint(x: x, y: y) + self.init(origin: origin, size: size) + } + + // + // using corners + + /// creates a CGRect with the specified topRight point and size components + public init(topRight: CGPoint, width: CGFloat, height: CGFloat) { + self.init(topRight: topRight, size: CGSize(width: width, height: height)) + } + + /// creates a CGRect with the specified topRight point and size + public init(topRight: CGPoint, size: CGSize) { + let x = topRight.x - size.width + let y = topRight.y + let origin = CGPoint(x: x, y: y) + self.init(origin: origin, size: size) + } + + /// creates a CGRect with the specified topLeft point and size components + public init(topLeft: CGPoint, width: CGFloat, height: CGFloat) { + self.init(topLeft: topLeft, size: CGSize(width: width, height: height)) + } + + /// creates a CGRect with the specified topLeft point and size + public init(topLeft: CGPoint, size: CGSize) { + self.init(origin: topLeft, size: size) + } + + /// creates a CGRect with the specified bottomLeft point and size components + public init(bottomLeft: CGPoint, width: CGFloat, height: CGFloat) { + self.init(bottomLeft: bottomLeft, size: CGSize(width: width, height: height)) + } + + /// creates a CGRect with the specified bottomLeft point and size + public init(bottomLeft: CGPoint, size: CGSize) { + let x = bottomLeft.x + let y = bottomLeft.y - size.height + let origin = CGPoint(x: x, y: y) + self.init(origin: origin, size: size) + } + + /// creates a CGRect with the specified bottomRight point and size components + public init(bottomRight: CGPoint, width: CGFloat, height: CGFloat) { + self.init(bottomRight: bottomRight, size: CGSize(width: width, height: height)) + } + + /// creates a CGRect with the specified bottomRight point and size + public init(bottomRight: CGPoint, size: CGSize) { + let x = bottomRight.x - size.width + let y = bottomRight.y - size.height + let origin = CGPoint(x: x, y: y) + self.init(origin: origin, size: size) + } + + // + // "cutting corners" +// public init(origin: CGPoint = CGPoint.zero, squareRectWithEdge edge: CGFloat) { +// self.init(origin: origin, size: CGSize(width: edge, height: edge)) +// } + + /// creates a CGRect with the specified size + public init(size: CGSize) { + self.init(origin: CGPoint.zero, size: size) + } + + /// creates a CGRect with the specified size components + public init(width: CGFloat, height: CGFloat) { + self.init(size: CGSize(width: width, height: height)) + } +} + +extension CGRect { + /// returns a new CGRect with floored `origin` and `size` + public var floored : CGRect { + var rect = self + rect.origin = self.origin.floored + rect.size = self.size.floored + return rect + } + + + /// floors `origin` and `size` + public mutating func floor() { + self = self.floored + } + + /// returns a new CGRect with ceiled `origin` and `size` + public var ceiled : CGRect { + var rect = self + rect.origin = self.origin.ceiled + rect.size = self.size.ceiled + return rect + } + + /// ceils `origin` and `size` + public mutating func ceil() { + self = self.ceiled + } +} + +extension CGRect { + + /// the center x + public var centerX : CGFloat { + get { + return self.midX + } + set { + self.center = CGPoint(x: newValue, y: self.centerY); + } + } + + /// the center y + public var centerY : CGFloat { + get { + return self.midY + } + set { + self.center = CGPoint(x: self.centerX, y: newValue); + } + } + + /// the center + public var center : CGPoint { + get { + return CGPoint(x: self.centerX, y: self.centerY) + } + set { + let xDiff = self.centerX - newValue.x + let yDiff = self.centerY - newValue.y + self.origin.x += xDiff + self.origin.y += yDiff + } + } + + /// the top + public var top : CGFloat { + get { + return self.minY + } + set { + self.origin.y = newValue + } + } + + /// the bottom + public var bottom : CGFloat { + get { + return self.maxY + } + set { + self.origin.y = newValue - self.size.height + } + } + + /// the left + public var left : CGFloat { + get { + return self.minX + } + set { + self.origin.x = newValue + } + } + + /// the rigth + public var right : CGFloat { + get { + return self.maxX + } + set { + self.origin.x = newValue - self.size.width + } + } + + + /* Getting CGPoint from CGRect */ + /// the top left point + public var topLeft : CGPoint { + get { + return self.origin + } + set { + self.origin = newValue + } + } + + /// the top right point + public var topRight : CGPoint { + get { + return CGPoint(x: self.right, y: self.top) + } + set { + self.right = newValue.x + self.top = newValue.y + } + } + + /// the bottom left point + public var bottomLeft : CGPoint { + get { + return CGPoint(x: self.left, y: self.bottom) + } + set { + self.left = newValue.x + self.bottom = newValue.y + } + } + + /// the bottom right point + public var bottomRight : CGPoint { + get { + return CGPoint(x: self.right, y: self.bottom) + } + set { + self.right = newValue.x + self.bottom = newValue.y + } + } + + /// the top center point + public var topCenter : CGPoint { + get { + return CGPoint(x: self.centerX, y: self.top) + } + set { + self.centerX = newValue.x + self.top = newValue.y + } + } + + /// the bottom center point + public var bottomCenter : CGPoint { + get { + return CGPoint(x: self.centerX, y: self.bottom) + } + set { + self.centerX = newValue.x + self.bottom = newValue.y + } + } + + /// the top left center point + public var leftCenter : CGPoint { + get { + return CGPoint(x: self.left, y: self.centerY) + } + set { + self.left = newValue.x + self.centerY = newValue.y + } + } + + /// the top right center point + public var rightCenter : CGPoint { + get { + return CGPoint(x: self.right, y: self.centerY) + } + set { + self.right = newValue.x + self.centerY = newValue.y + } + } +} + +extension CGRect { + /// moves the receiver by the specified amounts on the x an y axis + public mutating func translate(dx: CGFloat, dy: CGFloat){ + self.origin.translate(dx : dx, dy: dy) + } + + /// creates a point translated by the specified amounts on the x an y axis + public func translatedBy(dx : CGFloat, dy : CGFloat) -> CGRect { + var rect = self; + rect.translate(dx: dx, dy: dy) + return rect + } + + /// moves the receiver by the specified amounts on y axis + public mutating func translate(vertically dy: CGFloat) { + self.translate(dx: 0.0, dy: dy) + } + + /// moves the receiver by the specified amounts on x axis + public mutating func translate(horizontally dx: CGFloat) { + self.translate(dx: dx, dy: 0.0) + } + + /// creates a point translated by the specified amounts on the y axis + public func translated(vertically dy: CGFloat) -> CGRect { + return self.translatedBy(dx: 0.0, dy: dy) + } + + /// creates a point translated by the specified amounts on the x axis + public func translated(horizontally dx: CGFloat) -> CGRect { + return self.translatedBy(dx: dx, dy: 0.0) + } +} + +extension CGRect { + + /// returns a Boolean indicating wether the receiver is on the left of the + /// passed in argument + public func left(of other: CGRect) -> Bool { + return self.origin.left(of: other.origin) + } + + /// returns a Boolean indicating wether the receiver is on the right of the + /// passed in argument + public func right(of other: CGRect) -> Bool { + return self.origin.right(of: other.origin) + } + + /// returns a Boolean indicating wether the receiver is on the above of the + /// passed in argument + public func above(of other: CGRect) -> Bool { + return self.origin.above(of: other.origin) + } + + /// returns a Boolean indicating wether the receiver is on the below of the + /// passed in argument + public func below(of other: CGRect) -> Bool { + return self.origin.below(of: other.origin) + } + + /// returns a Boolean indicating wether the receiver is on the same + /// Longitude as the passed in argument + public func sameVerticalAxe(with other: CGRect) -> Bool { + return self.origin.sameVerticalAxe(with: other.origin) + } + + /// returns a Boolean indicating wether the receiver is on the same + /// latitude as the passed in argument + public func sameHorizontalAxe(with other: CGRect) -> Bool { + return self.origin.sameHorizontalAxe(with: other.origin) + } +} + +public extension CGRect { + + /// converts this `CGRect` instance to a `NSValue` instance. + public var asValue: NSValue { + return NSValue(cgRect: self) + } +} + +public extension CGRect { + + /// creates a CGRect which is scaled by the given factor. + public func scaled(_ scale: CGFloat) -> CGRect { + var rect = self + rect.scale(scale) + return rect + } + + /// scales the receiver with the given factor. + public mutating func scale(_ scale: CGFloat) { + self.size.scale(scale) + } + + /// Makes the receiver smaller by the + /// given factor. + public mutating func inset(_ scale: CGFloat) { + assert(scale > 0, "use .outset() instead") + let dx = self.size.width * scale + let dy = self.size.height * scale + self = self.insetBy(dx: dx, dy: dy) + } + + /// Makes the receiver larger by the + /// given factor. + public mutating func outset(_ scale: CGFloat) { + assert(scale < 0, "use .inset() instead") + let dx = self.size.width * scale + let dy = self.size.height * scale + + self = self.insetBy(dx: -dx, dy: -dy) + } + + /// Returns a rectangle that is smaller than the source rectangle by the + /// given factor, with the same center point. + public func inseted(_ scale: CGFloat) -> CGRect { + var rect = self + rect.inset(scale) + return rect + } + + /// Returns a rectangle that is larger than the source rectangle by the + /// given factor, with the same center point. + public func outseted(_ scale : CGFloat) -> CGRect { + var rect = self + rect.outset(scale) + return rect + } +} + +public extension CGRect { + + /// creates a CGRect with the given `size`. the rest of properties are the same as the receiver + public func with(size: CGSize) -> CGRect { + var frame = self + frame.size = size + return frame + } + + /// creates a CGRect with the given `origin`. the rest of properties are the same as the receiver + public func with(origin: CGPoint) -> CGRect { + var frame = self + frame.origin = origin + return frame + } + + /// creates a CGRect with the given `width`. the rest of properties are the same as the receiver + public func with(width: CGFloat) -> CGRect { + var frame = self + frame.size.width = width + return frame + } + + /// creates a CGRect with the given `height`. the rest of properties are the same as the receiver + public func with(height: CGFloat) -> CGRect { + var frame = self + frame.size.height = height + return frame + } + + /// creates a CGRect with the given `x`. the rest of properties are the same as the receiver + public func with(x: CGFloat) -> CGRect { + var frame = self + frame.origin.x = x + return frame + } + + /// creates a CGRect with the given `y`. the rest of properties are the same as the receiver + public func with(y: CGFloat) -> CGRect { + var frame = self + frame.origin.y = y + return frame + } +} + +public extension CGRect { + + /// apply a transformation to a CGPoint + public mutating func apply(_ t: CGAffineTransform) { + self = self.applying(t) + } +} diff --git a/Example/Pods/Ents/Ents/Classes/extensions/geometry/CGSizeExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/geometry/CGSizeExtensions.swift new file mode 100644 index 0000000..015b4d2 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/geometry/CGSizeExtensions.swift @@ -0,0 +1,351 @@ +// +// CGSizeRounding.swift +// UIViewPosition +// +// Created by Georges Boumis on 12/04/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import CoreGraphics + +/// Compose two `CGFloat` to form a CGSize operator +infix operator |: AdditionPrecedence + +public func | (lhs: CGFloat, rhs: CGFloat) -> CGSize { + return CGSize(width: lhs, height: rhs) +} + +public func | (lhs: Int, rhs: Int) -> CGSize { + return CGSize(width: lhs, height: rhs) +} + +public func | (lhs: Double, rhs: Double) -> CGSize { + return CGSize(width: CGFloat(lhs), height: CGFloat(rhs)) +} + +public func | (lhs: Float, rhs: Float) -> CGSize { + return CGSize(width: CGFloat(lhs), height: CGFloat(rhs)) +} + +public extension CGSize { + + /// returns a new CGSize with floored `width` and `height` of the receiver + public var floored: CGSize { + var size = self + size.width = self.width.floored + size.height = self.height.floored + return size + } + + + /// floors `width` and `height` + public mutating func floor() { + self = self.floored + } + + /// returns a new CGSize with ceiled `width` and `height` of the receiver + public var ceiled: CGSize { + var size = self + size.width = self.width.ceiled + size.height = self.height.ceiled + return size + } + + /// ceils `width` and `height` + public mutating func ceil() { + self = self.ceiled + } +} + +public extension CGSize { + + /// returns a CGSize double is size + public var doubled: CGSize { + return CGSize(width: self.width.doubled, + height: self.height.doubled) + } + + /// returns half a CGSize + public var halfed: CGSize { + return CGSize(width: self.width.half, + height: self.height.half) + } +} + +public extension CGSize { + + /// creates a CGSize which is scaled by the given factor. + /// - parameter scale: the factor to scale with. + public func scaled(_ scale: CGFloat) -> CGSize { + var size = self + size.scale(scale) + return size + } + + /// creates a CGSize which is scaled by the given factors. + /// - parameter dx: the factor to scale `width`. + /// - parameter dy: the factor to scale `height`. + public func scaled(_ dx: CGFloat, dy: CGFloat) -> CGSize { + var size = self + size.scale(dx, dy: dy) + return size + } + + /// creates a CGSize which is scaled by the given factors. + /// - parameter wS: the factor to scale `width`. + /// - parameter hS: the factor to scale `height` + public func scaled(widthScale wS: CGFloat, heightScale hS: CGFloat) -> CGSize { + var size = self + size.scale(widthScale: wS, heightScale: hS) + return size + } + + /// scales the receiver with the given factor. + /// - parameter scale: the factor to scale with. + public mutating func scale(_ scale: CGFloat) { + self.scale(widthScale: scale, heightScale: scale) + } + + /// scales the receiver with the given factors. + /// - parameter wS: the factor to scale `width`. + /// - parameter hS: the factor to scale `height` + public mutating func scale(widthScale wS: CGFloat, heightScale hS: CGFloat) { + self.width *= wS + self.height *= hS + } + + /// scales the receiver with the given factors. + /// - parameter dx: the factor to scale `width`. + /// - parameter dy: the factor to scale `height`. + public mutating func scale(_ dx: CGFloat, dy: CGFloat) { + self.width += dx + self.height += dy + } +} + +public extension CGSize { + + /// converts this `CGSize` instance to a `NSValue` instance. + public var asValue: NSValue { + return NSValue(cgSize: self) + } +} + +public extension CGSize { + + /// creates a CGSize with the given `width` and the same `height` as the receiver + /// - parameter width: the new `width` + public func with(width: CGFloat) -> CGSize { + var size = self + size.width = width + return size + } + + /// creates a CGSize with the given `height` and the same `width` as the receiver + /// - parameter height: the new `height` + public func with(height: CGFloat) -> CGSize { + var size = self + size.height = height + return size + } +} + +public extension CGSize { + + /// creates a CGSize whose `width` is the sum of the current `width` and the + /// given value. + /// - parameter width: the value to add to the current `width`. + public func adding(width: CGFloat) -> CGSize { + var size = self + size.width += width + return size + } + + /// creates a CGSize whose `height` is the sum of the current `height` and + /// the given value. + /// - parameter height: the value to add to the current `height`. + public func adding(height: CGFloat) -> CGSize { + var size = self + size.height += height + return size + } + + /// creates a CGSize whose `width` is the difference of the current `width` + /// and the given value. + /// - parameter width: the value to subtract from the current `width`. + public func subtracting(width: CGFloat) -> CGSize { + var size = self + size.width -= width + return size + } + + /// creates a CGSize whose `height` is the difference of the current + /// `height` and the given value. + /// - parameter width: the value to subtract from the current `height`. + public func subtracting(height: CGFloat) -> CGSize { + var size = self + size.height -= height + return size + } +} + +public extension CGSize { + + /// sums two CGSize instances + /// - parameter size: another size + public func adding(size: CGSize) -> CGSize { + return self + .adding(width: size.width) + .adding(height: size.height) + } + + /// subtracts two CGSize instances + /// - parameter size: another size + public func subtracting(size: CGSize) -> CGSize { + return self + .subtracting(width: size.width) + .subtracting(height: size.height) + } +} + +public extension CGSize { + + /// apply a transformation to a CGSize + /// - parameter t: the transformation + public mutating func apply(_ t: CGAffineTransform) { + self = self.applying(t) + } +} + +public extension CGSize { + + /// creates a CGSize with has the greatest properties between the receiver + /// and the given value + /// - parameter other: another size + public func union(with other: CGSize) -> CGSize { + return self + .with(width: self.width.maximum(other.width)) + .with(height: self.height.maximum(other.height)) + } + + /// creates a CGSize with has the greatest properties between the receiver + /// and the given value. + /// - parameter other: another size + /// - seeAlso: union(with:) + public mutating func merge(with other: CGSize) { + self = self.union(with: other) + } +} + +public extension CGSize { + + /// calculates the area of this instance + public var area: CGFloat { + return self.width.multiplied(by: self.height).absolute() + } +} + +public extension CGSize { + + /// the rule to use for maximum/minimum/area comparisons. + public enum ComparisonRule { + case width /// do comparison based on `width`. + case height /// do comparison based on `height`. + case area /// do comparison based on `area`. + } + + /// returns the maximum size between the receiver and `other` using the + /// given rule for comparison + /// - parameter other: another size + /// - parameter rule: the comparison rule to use. + public func maximum(_ other: CGSize, rule: CGSize.ComparisonRule = CGSize.ComparisonRule.area) -> CGSize { + switch rule { + case CGSize.ComparisonRule.width: + return (self.width > other.width) ? self : other + case CGSize.ComparisonRule.height: + return (self.height > other.height) ? self : other + case CGSize.ComparisonRule.area: + return (self.area > other.area) ? self : other + } + } + + /// returns the minimum size between the receiver and `other` using the + /// given rule for comparison + /// - parameter other: another size + /// - parameter rule: the comparison rule to use. + public func minimum(_ other: CGSize, rule: CGSize.ComparisonRule = CGSize.ComparisonRule.area) -> CGSize { + switch rule { + case CGSize.ComparisonRule.width: + return (self.width < other.width) ? self : other + case CGSize.ComparisonRule.height: + return (self.height < other.height) ? self : other + case CGSize.ComparisonRule.area: + return (self.area < other.area) ? self : other + } + } +} + +public extension CGSize { + + /// returns a Boolean indicating wether the receiver is greater than the + /// given value based on the given comparison rule. + /// - parameter other: another size + /// - parameter rule: the comparison rule to use. + public func isGreater(than other: CGSize, rule: CGSize.ComparisonRule = CGSize.ComparisonRule.area) -> Bool { + switch rule { + case CGSize.ComparisonRule.width: + return (self.width > other.width) + case CGSize.ComparisonRule.height: + return (self.height > other.height) + case CGSize.ComparisonRule.area: + return (self.area > other.area) + } + } + + /// returns a Boolean indicating wether the receiver is greater than or + /// equal to the given value based on the given comparison rule. + /// - parameter other: another size + /// - parameter rule: the comparison rule to use. + public func isGreater(thanOrEqualTo other: CGSize, rule: CGSize.ComparisonRule = CGSize.ComparisonRule.area) -> Bool { + switch rule { + case CGSize.ComparisonRule.width: + return (self.width >= other.width) + case CGSize.ComparisonRule.height: + return (self.height >= other.height) + case CGSize.ComparisonRule.area: + return (self.area >= other.area) + } + } + + /// returns a Boolean indicating wether the receiver is less than the + /// given value based on the given comparison rule. + /// - parameter other: another size + /// - parameter rule: the comparison rule to use. + public func isLess(than other: CGSize, rule: CGSize.ComparisonRule = CGSize.ComparisonRule.area) -> Bool { + switch rule { + case CGSize.ComparisonRule.width: + return (self.width < other.width) + case CGSize.ComparisonRule.height: + return (self.height < other.height) + case CGSize.ComparisonRule.area: + return (self.area < other.area) + } + } + + /// returns a Boolean indicating wether the receiver is less than or equal + /// to the given value based on the given comparison rule. + /// - parameter other: another size + /// - parameter rule: the comparison rule to use. + public func isLess(thanOrEqualTo other: CGSize, rule: CGSize.ComparisonRule = CGSize.ComparisonRule.area) -> Bool { + switch rule { + case CGSize.ComparisonRule.width: + return (self.width <= other.width) + case CGSize.ComparisonRule.height: + return (self.height <= other.height) + case CGSize.ComparisonRule.area: + return (self.area <= other.area) + } + } +} + diff --git a/Example/Pods/Ents/Ents/Classes/extensions/geometry/UIViewExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/geometry/UIViewExtensions.swift new file mode 100644 index 0000000..0c0776a --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/geometry/UIViewExtensions.swift @@ -0,0 +1,55 @@ +// +// UIViewExtensions.swift +// Ents +// +// Created by Georges Boumis on 29/08/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import UIKit + +public extension UIView { + + /// the view layer's anchor point. + final public var layerAnchorPoint: CGPoint { + get { + return self.layer.anchorPoint + } + set { + self.layer.setAnchorPointWithoutMoving(newValue) + } + } +} + +public extension UIView { + + /// scales the receiver's frame with the provided scale. + /// - parameter scale: a factor. + final public func scale(_ scale: CGFloat) { + self.frameSize.scale(scale) + } +} + +public extension UIView { + + /// sets the center of the view using a specific anchor point. + /// - parameter point: the anchor point to use. + /// - parameter block: a closure that returns the new center of the receiver. + final public func center(withAnchorPoint point: CGPoint, _ block: (UIView) -> CGPoint) { + let anchorPoint = self.layer.anchorPoint + self.layerAnchorPoint = point + self.center = block(self) + self.layerAnchorPoint = anchorPoint + } + + /// Evaluates the given closure with no transform applied to the receiver, + /// passing the receiver as its argument. + /// - parameter block: a closure to evaluate without transformations. + final public func withoutTransform(_ block: (UIView) -> Void) { + let transform = self.transform + self.transform = CGAffineTransform.identity + block(self) + self.transform = transform + } +} diff --git a/Example/Pods/Ents/Ents/Classes/extensions/geometry/UIViewPosition.swift b/Example/Pods/Ents/Ents/Classes/extensions/geometry/UIViewPosition.swift new file mode 100644 index 0000000..3476b5a --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/geometry/UIViewPosition.swift @@ -0,0 +1,552 @@ +// +// UIViewPosition.swift +// Ents +// +// Created by Georges Boumis on 12/04/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import UIKit + + +/* +With the following methods you can obtain and set nearly any corner or edge of +a UIView both in the superview's coordinate system (frame, center) either on the +view's coordinate system (bounds, own*). + +*----------*----------* +| | +| | +* * * +| | +| | +*----------*----------* + +You can obtain and set any '*' point in the above figure either as a CGPoint +either independently as a CGFloat value. + +*/ + +// +// Superview's coordinate system +// +extension UIView { + + /// The frame origin as in self.frame.origin (superview's coordinate system) + public var frameOrigin: CGPoint { + get { + return self.frame.origin + } + set { + var frame = self.frame + frame.origin = newValue + self.frame = frame + } + } + + /// The frame center.x (superview's coordinate system) + public var centerX: CGFloat { + get { + return self.center.x + } + set { + self.center = CGPoint(x: newValue, y: self.centerY) + } + } + /// The frame center.y (superview's coordinate system) + public var centerY: CGFloat { + get { + return self.center.y + } + set { + self.center = CGPoint(x: self.centerX, y: newValue) + } + } + + /// x of frame's origin (superview's coordinate system) + public var frameX: CGFloat { + get { + return self.frame.minX + } + set { + var frame = self.frame + frame.origin.x = newValue + self.frame = frame + } + } + /// y of frame's origin (superview's coordinate system) + public var frameY: CGFloat { + get { + return self.frame.minY + } + set { + var frame = self.frame + frame.origin.y = newValue + self.frame = frame + } + } +} + +// +// Edges +// +extension UIView { + /// The left edge of the frame (superview's coordinate system) + public var frameLeft: CGFloat { + get { + return self.frameX + } + set { + self.frameX = newValue + } + } + /// The top edge of the frame (superview's coordinate system) + public var frameTop: CGFloat { + get { + return self.frameY + } + set { + self.frameY = newValue + } + } + /// The right edge of the frame (superview's coordinate system) + public var frameRight: CGFloat { + get { + return self.frame.maxX + } + set { + var frame = self.frame + frame.origin.x = newValue - self.frameWidth + self.frame = frame + } + } + /// The bottom edge of the frame (superview's coordinate system) + public var frameBottom: CGFloat { + get { + return self.frame.maxY + } + set { + var frame = self.frame + frame.origin.y = newValue - self.frameHeight + self.frame = frame + } + } +} + +// +// Corners +// +extension UIView { + /// The top left corner of the frame (superview's coordinate system) + public var frameTopLeft: CGPoint { + get { + return self.frameOrigin + } + set { + self.frameOrigin = newValue + } + } + /// The top right corner of the frame (superview's coordinate system) + public var frameTopRight: CGPoint { + get { + return CGPoint(x: self.frameRight, y: self.frameTop) + } + set { + self.frameTop = newValue.y + self.frameRight = newValue.x + } + } + /// The bottom left corner of the frame (superview's coordinate system) + public var frameBottomLeft: CGPoint { + get { + return CGPoint(x: self.frameLeft, y: self.frameBottom) + } + set { + self.frameBottom = newValue.y + self.frameLeft = newValue.x + } + } + /// The bottom right corner of the frame (superview's coordinate system) + public var frameBottomRight: CGPoint { + get { + return CGPoint(x: self.frameRight, y: self.frameBottom) + } + set { + self.frameBottom = newValue.y + self.frameRight = newValue.x + } + } +} + +// +// Middle of Edges +// +extension UIView { + /// The top center virtual point of the frame (superview's coordinate system) + public var frameTopCenter: CGPoint { + get { + return CGPoint(x: self.centerX, y: self.frameTop) + } + set { + self.frameTop = newValue.y + self.centerX = newValue.x + } + } + /// The bottom center virtual point of the frame (superview's coordinate system) + public var frameBottomCenter: CGPoint { + get { + return CGPoint(x: self.centerX, y: self.frameBottom) + } + set { + self.frameBottom = newValue.y + self.centerX = newValue.x + } + } + + /// The left center virtual point of the frame (superview's coordinate system) + public var frameLeftCenter: CGPoint { + get { + return CGPoint(x: self.frameLeft, y: self.centerY) + } + set { + self.frameLeft = newValue.x + self.centerY = newValue.y + } + } + /// The right center virtual point of the frame (superview's coordinate system) + public var frameRightCenter: CGPoint { + get { + return CGPoint(x: self.frameRight, y: self.centerY) + } + set { + self.frameRight = newValue.x + self.centerY = newValue.y + } + } +} + +// +// Sizes +// +extension UIView { + /// The frame size as in self.frame.size + public var frameSize: CGSize { + get { + return self.frame.size + } + set { + var frame = self.frame + frame.size = newValue + self.frame = frame + } + } + /// The frame width (takes into account the current transformations) + public var frameWidth: CGFloat { + get { + return self.frame.size.width + } + set { + var frame = self.frame + frame.size.width = newValue + self.frame = frame + } + } + /// The frame height (takes into account the current transformations) + public var frameHeight: CGFloat { + get { + return self.frame.size.height + } + set { + var frame = self.frame + frame.size.height = newValue + self.frame = frame + } + } +} + +// +// View's coordinate system +// +extension UIView { + /// The bounds width (in the view's coordinate system, not taking into account any transformations) + public var boundsWidth: CGFloat { + get { + return self.bounds.width + } + set { + var bounds = self.bounds + bounds.size.width = newValue + self.bounds = bounds + } + } + /// The bounds height (in the view's coordinate system, not taking into account any transformations) + public var boundsHeight: CGFloat { + get { + return self.bounds.height + } + set { + var bounds = self.bounds + bounds.size.height = newValue + self.bounds = bounds + } + } + /// The bounds size (in the view's coordinate system, not taking into account any transformations) + public var boundsSize: CGSize { + get { + return self.bounds.size + } + set { + var bounds = self.bounds + bounds.size = newValue + self.bounds = bounds + } + } + + /// The bounds center (in the view's coordinate system) @warning you nearly never want to set this + public var ownCenter: CGPoint { + get { + return CGPoint(x: self.ownCenterX, y: self.ownCenterY) + } + set { + var bounds = self.bounds + let xDiff = self.ownCenterX - newValue.x + let yDiff = self.ownCenterY - newValue.y + bounds.origin.x += xDiff + bounds.origin.y += yDiff + self.bounds = bounds + } + } + /// x of bounds center (in the view's coordinate system) @warning you nearly never want to set this + public var ownCenterX: CGFloat { + get { + return self.bounds.midX + } + set { + self.ownCenter = CGPoint(x: newValue, y: self.ownCenterY); + } + } + /// y of bounds center (in the view's coordinate system) @warning you nearly never want to set this + public var ownCenterY: CGFloat { + get { + return self.bounds.midY + } + set { + self.ownCenter = CGPoint(x: self.ownCenterY, y: newValue); + } + } + + /// The bounds origin as in self.bounds.origin (view's coordinate system) @warning you nearly never want to set this + public var ownOrigin: CGPoint { + get { + return self.bounds.origin + } + set { + var bounds = self.bounds + bounds.origin = newValue + self.bounds = bounds + } + } + + /// The left edge of the bounds (in the view's coordinate system) @warning you nearly never want to set this + public var ownLeft: CGFloat { + get { + return self.bounds.minX + } + set { + var bounds = self.bounds + bounds.origin.x = newValue + self.bounds = bounds + } + } + /// The right edge of the bounds (in the view's coordinate system) + public var ownRight: CGFloat { + get { + return self.bounds.maxX + } + set { + var bounds = self.bounds + bounds.origin.x = newValue - self.boundsWidth + self.bounds = bounds + } + } + /// The top edge of the bounds (in the view's coordinate system) @warning you nearly never want to set this + public var ownTop: CGFloat { + get { + return self.bounds.minY + } + set { + var bounds = self.bounds + bounds.origin.y = newValue + self.bounds = bounds + } + } + /// The bottom edge of the bounds (in the view's coordinate system) + public var ownBottom: CGFloat { + get { + return self.bounds.maxY + } + set { + var bounds = self.bounds + bounds.origin.y = newValue - self.boundsHeight + self.bounds = bounds + } + } + + /// The top left corner of the bounds (in the view's coordinate system) @warning you nearly never want to set this + public var ownTopLeft: CGPoint { + get { + return self.ownOrigin + } + set { + self.ownOrigin = newValue + } + } + /// The top right corner of the bounds (in the view's coordinate system) @warning you nearly never want to set this + public var ownTopRight: CGPoint { + get { + return CGPoint(x: self.ownRight, y: self.ownTop) + } + set { + self.ownTop = newValue.y + self.ownRight = newValue.x + } + } + /// The bottom left corner of the bounds (in the view's coordinate system) @warning you nearly never want to set this + public var ownBottomLeft: CGPoint { + get { + return CGPoint(x: self.ownLeft, y: self.ownBottom) + } + set { + self.ownBottom = newValue.y + self.ownLeft = newValue.x + } + } + /// The bottom right corner of the bounds (in the view's coordinate system) @warning you nearly never want to set this + public var ownBottomRight: CGPoint { + get { + return CGPoint(x: self.ownRight, y: self.ownBottom) + } + set { + self.ownBottom = newValue.y + self.ownRight = newValue.x + } + } + + /// The top center virtual point of the bounds (in the view's coordinate system) @warning you nearly never want to set this + public var ownTopCenter: CGPoint { + get { + return CGPoint(x: self.ownCenterX, y: self.ownTop) + } + set { + self.ownTop = newValue.y + self.ownCenterX = newValue.x + } + } + /// The bottom center virtual point of the bounds (in the view's coordinate system) @warning you nearly never want to set this + public var ownBottomCenter: CGPoint { + get { + return CGPoint(x: self.ownCenterX, y: self.ownBottom) + } + set { + self.ownBottom = newValue.y + self.ownCenterX = newValue.x + } + } + + /// The left center virtual point of the bounds (in the view's coordinate system) @warning you nearly never want to set this + public var ownLeftCenter: CGPoint { + get { + return CGPoint(x: self.ownLeft, y: self.ownCenterY) + } + set { + self.ownLeft = newValue.x + self.ownCenterY = newValue.y + } + } + /// The right center virtual point of the bounds (in the view's coordinate system) @warning you nearly never want to set this + public var ownRightCenter: CGPoint { + get { + return CGPoint(x: self.ownRight, y: self.ownCenterY) + } + set { + self.ownRight = newValue.x + self.ownCenterY = newValue.y + } + } +} + +/// +/// Rounding +/// +extension UIView { + /// The frame of the view that has origin.x, origin.y, size.width and size.height floor()ed + public var flooredFrame: CGRect { + return self.frame.floored + } + /// The frame of the view that has origin.x, origin.y, size.width and size.height ceil()ed + public var ceiledFrame: CGRect { + return self.frame.ceiled + } + + /// The size of the view that has its width and height floor()ed + public var flooredFrameSize: CGSize { + return self.frameSize.floored + } + /// The size of the view that has its width and height ceiled()ed + public var ceiledFrameSize: CGSize { + return self.frameSize.ceiled + } + + /// The origin of the view that has its x and y floor()ed + public var flooredFrameOrigin: CGPoint { + return self.frameOrigin.floored + } + /// The origin of the view that has its x and y ceil()ed + public var ceiledFrameOrigin: CGPoint { + return self.frameOrigin.ceiled + } +} + +// +// Mutating Actions +// +extension UIView { + + /// floors the frame of the receiver; that is both the `origin` and `size`. + public func floorFrame() -> UIView { + self.frame.floor() + return self + } + + /// ceils the frame of the receiver; that is both the `origin` and `size`. + public func ceilFrame() -> UIView { + self.frame.ceil() + return self + } + + + /// floors the frame origin of the receiver. + public func floorFrameOrigin() -> UIView { + self.frameOrigin.floor() + return self + } + + /// ceils the frame origin of the receiver. + public func ceilFrameOrigin() -> UIView { + self.frameOrigin.ceil() + return self + } + + /// floors the frame size of the receiver. + public func floorFrameSize() -> UIView { + self.frameSize.floor() + return self + } + + /// ceils the frame size of the receiver. + public func ceilFrameSize() -> UIView { + self.frameSize.ceil() + return self + } +} diff --git a/Example/Pods/Ents/Ents/Classes/extensions/types/BoolExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/types/BoolExtensions.swift new file mode 100644 index 0000000..2a32fe9 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/types/BoolExtensions.swift @@ -0,0 +1,261 @@ +// +// BoolExtensions.swift +// Ents +// +// Created by Georges Boumis on 09/08/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +/// Free function that negates the boolean passed as argument. +/// May help readability of bool expressions. +/// +/// if not(self.enabled) { // do something } +/// +/// - parameter b: the boolean. +/// - returns: the passed argument but negated. +public func not(_ b: Bool) -> Bool { + return b.not +} + + +/// Free function that returns `true` when the boolean passed as argument is +/// `true`. +/// May help readability of bool expressions. +/// +/// if does(self.concersEverything) { // do nothing } +/// +/// - parameter b: the boolean. +/// - returns: `true` if the argument passed in is also `true`. +public func does(_ b: Bool) -> Bool { + return (b == true) +} + +/// Free function that returns `true` when the boolean passed as argument is +/// `false`. +/// May help readability of bool expressions. +/// +/// if doesNot(self.createsConfusion) { // relax } +/// +/// - parameter b: the boolean. +/// - returns: `true` if the argument passed in is `false`. +public func doesNot(_ b: Bool) -> Bool { + return (b.not == true) +} + +public extension Bool { + + /// Creating Bool from Integers. + /// - parameter i: the integer. `0` means `false`. Any other value means `true` + public init(_ i: Int) { + if i == 0 { + self = false + } + else { + self = true + } + } + + /// Creating Bool from Integers. + /// - parameter i: the integer. `0` means `false`. Any other value means `true` + public init(_ i: I) where I: Integer { + self.init(Int(i.toIntMax())) + } +} + +public extension Bool { + + /// Provides a more natural language interface to AND (`&&`). + /// + /// true.and(false) // false + /// + /// - parameter other: another boolean to do an `&&` + /// - returns: the result of AND-ing self and other + public func and(_ other: @autoclosure () -> Bool) -> Bool { + guard self else { return false } + return other() + } + + /// Provides a more natural language interface to OR (`||`). + /// + /// true.or(false) // true + /// + /// - parameter other: another boolean to do an `||` + /// - returns: the result of OR-ing self and other + public func or(_ other: Bool) -> Bool { + return self || other + } + + /// Provides a more natural language interface to `!=`. + /// + /// true.different(false) // true + /// + /// - parameter other: another boolean to do a differnet than `!=` comparison. + /// - returns: `true` if the booleans are different, otherwise `false`. + public func different(than other: Bool) -> Bool { + return self != other + } + + /// Provides a more natural language interface to NOT (`!`). + /// + /// true.not // false + /// + /// - returns: the NOT-ed boolean as in '!'. + public var not: Bool { + return !self + } +} + +public extension Bool { + + /// Provides a more natural language interface to NOT (`!`). + /// + /// true.negated // false + /// + /// - returns: the NOT-ed boolean as in '!'. + public var negated: Bool { + return self.not + } + + /// Negate (NOT) the Boolean. + /// + /// var b = true + /// b.negate() + /// b // false + /// + public mutating func negate() { + self = self.not + } +} + +public extension Bool { + + /// OR the receiver with another Bool. + /// + /// var b = false + /// b.orWith(true) + /// b // true + /// + public mutating func orWith(_ other: Bool) { + self = self.or(other) + } + + /// AND the receiver with another Bool. + /// + /// var b = false + /// b.andWith(true) + /// b // false + /// + public mutating func andWith(_ other: Bool) { + self = self.and(other) + } +} + +public extension Bool { + + /// Evaluates the given closure when this `Bool` instance is `true`. + /// It's like `map(:)` of Optional. + /// + /// var b = true + /// b.ifTrue { // do work } + /// + public func ifTrue(_ block: () -> Void) { + if self { + block() + } + } + + /// Evaluates the given closure when this `Bool` instance is `true`. + /// It's like `map(:)` of Optional. + /// + /// var condition = true + /// condition.isTrue { // do work } + /// + public func isTrue(_ block: () -> Void) { + self.ifTrue(block) + } + + /// Evaluates `iblock` when this `Bool` instance is `true`, and evaluates + /// `eblock` when this `Bool` instance is `false`. + /// + /// var condition = /* some boolean value *. + /// confition.ifTrue({ + /// // true + /// }, else: { + /// // false + /// }) + /// + public func ifTrue(_ iblock: () -> Void, else eblock: () -> Void) { + if self { + iblock() + } else { + eblock() + } + } + + /// Evaluates the given closure when this `Bool` instance is `false`. + /// + /// var condition = true + /// condition.ifFalse { // do work } + /// + public func ifFalse(_ block: () -> Void) { + if self.not { + block() + } + } + + /// Evaluates the given closure when this `Bool` instance is `false`. + /// + /// var condition = true + /// condition.isFalse { // do work } + /// + public func isFalse(_ block: () -> Void) { + self.ifFalse(block) + } + + /// Evaluates `iblock` when this `Bool` instance is `false`, and evaluates + /// `eblock` when this `Bool` instance is `true`. + /// + /// var condition = /* some boolean value *. + /// confition.ifFalse({ + /// // true + /// }, else: { + /// // false + /// }) + /// + public func ifFalse(_ iblock: () -> Void, else eblock: () -> Void) { + if self.not { + iblock() + } + else { + eblock() + } + } +} + +public extension Bool { + + /// Evaluates the given closure when this `Bool` instance is `true`. + /// + /// var condition = true + /// let res = confition.map { + /// return "true" + /// } + /// res // Optional("true") + /// + /// var condition = false + /// let res = confition.map { + /// return "true" + /// } + /// res // nil + /// + @discardableResult + public func map(_ transform: () throws -> U) rethrows -> U? { + if self { + return try transform() + } + return nil + } +} diff --git a/Example/Pods/Ents/Ents/Classes/extensions/types/OptionalExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/types/OptionalExtensions.swift new file mode 100644 index 0000000..e14c8df --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/types/OptionalExtensions.swift @@ -0,0 +1,67 @@ +// +// OptionalExtensions.swift +// Ents +// +// Created by Georges Boumis on 11/08/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public extension Optional { + + /// indicates wether the Wrapped value is `nil`. + public var optional: Bool { + if let _ = self { + return false + } + else { + return true + } + } + + /// indicates wether the Wrapped value is not `nil`. + public var nonOptional: Bool { + return not(self.optional) + } + + /// returns the wrapped value or the default if the wrapped value is `nil`. + public func unwrap(defaultValue value: Wrapped) -> Wrapped { + return self ?? value + } + + /// converts an optional to a concrete value + public mutating func materialize(_ materialize: () throws -> Wrapped) rethrows { + if self.optional { + self = try materialize() + } + } +} + + +infix operator !! + +/// This operator unwraps an optional, if the optional is `nil` then it crashes +/// printing the givent text as a reason why it crashed +/// +/// let i: Int? = nil +/// i !? "should not be `nil`" // crashes in DEBUG printing "should not be `nil`" +/// +public func !!(wrapped: T?, failureText: @autoclosure () -> String) -> T { + if let x = wrapped { return x } + fatalError(failureText()) +} + +infix operator !? + +/// This operator unwraps an optional, if the optional is `nil` then it crashes +/// in DEBUG builds, printing the givent text as a reason why it crashed +/// +/// let i: Int? = nil +/// i !! "should not be `nil`" // crashes printing "should not be `nil`" +/// +//public func !?(wrapped: T?, failureText: @autoclosure () -> String) -> T { +// if let x = wrapped { return x } +// assert(false, failureText()) +//} diff --git a/Example/Pods/Ents/Ents/Classes/extensions/types/numbers/BinaryFloatingPointExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/types/numbers/BinaryFloatingPointExtensions.swift new file mode 100644 index 0000000..b4764cd --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/types/numbers/BinaryFloatingPointExtensions.swift @@ -0,0 +1,108 @@ +// +// BinaryFloatingPointExtensions.swift +// Ents +// +// Created by Georges Boumis on 19/08/2017. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation +import QuartzCore + +public extension BinaryFloatingPoint + where Self.RawSignificand == Double.RawSignificand, Self.RawExponent == Double.RawExponent { + + /// converts this `Double`-like instance to a `NSNumber` instance. + public var asNumber: NSNumber { + return NSNumber(value: Double(sign: self.sign, + exponentBitPattern: self.exponentBitPattern, + significandBitPattern: self.significandBitPattern)) + } + + /// Returns a floating-point value that is raised to the power of `p`. + /// - parameter p: a floating-point power. + public func power(_ p: Self) -> Self { + let lhs = Double(sign: self.sign, + exponentBitPattern: self.exponentBitPattern, + significandBitPattern: self.significandBitPattern) + let rhs = Double(sign: p.sign, + exponentBitPattern: p.exponentBitPattern, + significandBitPattern: p.significandBitPattern) + let result = Foundation.pow(lhs, rhs) + return Self(sign: result.sign, + exponentBitPattern: result.exponentBitPattern, + significandBitPattern: result.significandBitPattern) + } + + /// Returns a floating-point value that is raised to the power of `p`. + /// - parameter p: an integer power. + public func power(_ p: I) -> Self where I: IntegerArithmetic { + let lhs = Double(sign: self.sign, + exponentBitPattern: self.exponentBitPattern, + significandBitPattern: self.significandBitPattern) + let result = Foundation.pow(lhs, Double(p.toIntMax())) + return Self(sign: result.sign, + exponentBitPattern: result.exponentBitPattern, + significandBitPattern: result.significandBitPattern) + } + + /// returns the square value of this instance. + public var square: Self { + return self.power(2) + } + + /// returns the cube value of this instance. + public var cube: Self { + return self.power(3) + } +} + + +public extension BinaryFloatingPoint + where Self.RawSignificand == Float.RawSignificand, Self.RawExponent == Float.RawExponent { + + /// converts this `Float`-like instance to a `NSNumber` instance. + public var asNumber: NSNumber { + return NSNumber(value: Float(sign: self.sign, + exponentBitPattern: self.exponentBitPattern, + significandBitPattern: self.significandBitPattern)) + } + + /// Returns a floating-point value that is raised to the power of `p`. + /// - parameter p: a floating-point power. + public func power(_ p: Self) -> Self { + let lhs = Float(sign: self.sign, + exponentBitPattern: self.exponentBitPattern, + significandBitPattern: self.significandBitPattern) + let rhs = Float(sign: p.sign, + exponentBitPattern: p.exponentBitPattern, + significandBitPattern: p.significandBitPattern) + let result = Foundation.powf(lhs, rhs) + return Self(sign: result.sign, + exponentBitPattern: result.exponentBitPattern, + significandBitPattern: result.significandBitPattern) + } + + /// Returns a floating-point value that is raised to the power of `p`. + /// - parameter p: an integer power. + public func power(_ p: I) -> Self where I: IntegerArithmetic { + let lhs = Float(sign: self.sign, + exponentBitPattern: self.exponentBitPattern, + significandBitPattern: self.significandBitPattern) + let result = Foundation.powf(lhs, Float(p.toIntMax())) + return Self(sign: result.sign, + exponentBitPattern: result.exponentBitPattern, + significandBitPattern: result.significandBitPattern) + } + + /// returns the square value of this instance. + public var square: Self { + return self.power(2) + } + + /// returns the cube value of this instance. + public var cube: Self { + return self.power(3) + } +} diff --git a/Example/Pods/Ents/Ents/Classes/extensions/types/numbers/DoubleExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/types/numbers/DoubleExtensions.swift new file mode 100644 index 0000000..4e55a1c --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/types/numbers/DoubleExtensions.swift @@ -0,0 +1,18 @@ +// +// DoubleExtensions.swift +// Ents +// +// Created by Georges Boumis on 26/07/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public extension Double { + + /// converts a `Double` instance to a `CGFloat` instance. + public var asCGFloat: QuartzCore.CGFloat { + return QuartzCore.CGFloat(self) + } +} diff --git a/Example/Pods/Ents/Ents/Classes/extensions/types/numbers/FloatingPointExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/types/numbers/FloatingPointExtensions.swift new file mode 100644 index 0000000..344b208 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/types/numbers/FloatingPointExtensions.swift @@ -0,0 +1,560 @@ +// +// FloatingPointExtensions.swift +// Ents +// +// Created by Georges Boumis on 2/10/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public extension FloatingPoint { + + /// the floored value + public var floored: Self { + return self.rounded(FloatingPointRoundingRule.down) + } + + /// the ceiled value + public var ceiled: Self { + return self.rounded(FloatingPointRoundingRule.up) + } +} + +public extension FloatingPoint { + + /// the absolute value of this instance + public func absolute() -> Self { + return Self.abs(self) + } +} + +public extension FloatingPoint { + + /// the half of this value + public var half: Self { + return self.divided(by: Self(2)) + } + /// the double of this value + public var doubled: Self { + return self.multiplied(by: Self(2)) + } + /// the triple of this value + public var tripled: Self { + return self.multiplied(by: Self(3)) + } + /// a quarter of this value + public var quarter: Self { + return self.divided(by: Self(4)) + } +} + +public extension FloatingPoint { + + /// Returns the product of this value and the given value, rounded to a + /// representable value. + /// + /// This method serves as the basis for the multiplication operator (`*`). + /// For example: + /// + /// let x = 7.5 + /// print(x.multiplied(by: 2)) + /// // Prints "15.0" + /// print(x * 2) + /// // Prints "15.0" + /// + /// The `multiplied(by:)` method implements the multiplication operation + /// defined by the [IEEE 754 specification][spec]. + /// + /// [spec]: http://ieeexplore.ieee.org/servlet/opac?punumber=4610933 + /// + /// - Parameter other: The value to multiply by this value. + /// - Returns: The product of this value and `other`, rounded to a + /// representable value. + /// + /// - SeeAlso: `multiply(by:)` + public func multiplied(by other: I) -> Self where I: Integer { + return self.multiplied(by: Self(other.toIntMax())) + } + + /// Multiplies this value by the given value in place, rounding to a + /// representable value. + /// + /// This method serves as the basis for the in-place multiplication operator + /// (`*=`). For example: + /// + /// var (x, y) = (7.5, 7.5) + /// x.multiply(by: 2) + /// // x == 15 + /// y *= 2 + /// // y == 15 + /// + /// - Parameter other: The value to multiply by this value. + /// + /// - SeeAlso: `multiplied(by:)` + public mutating func multiply(by other: I) where I: Integer { + self.multiply(by: Self(other.toIntMax())) + } +} + +public extension FloatingPoint { + + /// Returns the quotient of this value and the given value, rounded to a + /// representable value. + /// + /// This method serves as the basis for the division operator (`/`). For + /// example: + /// + /// let x = 7.5 + /// let y = x.divided(by: 2) + /// // y == 3.75 + /// let z = y * 2 + /// // z == 7.5 + /// + /// The `divided(by:)` method implements the division operation + /// defined by the [IEEE 754 specification][spec]. + /// + /// [spec]: http://ieeexplore.ieee.org/servlet/opac?punumber=4610933 + /// + /// - Parameter other: The value to use when dividing this value. + /// - Returns: The quotient of this value and `other`, rounded to a + /// representable value. + /// + /// - SeeAlso: `divide(by:)` + public func divided(by other: I) -> Self where I: Integer { + return self.divided(by: Self(other.toIntMax())) + } + + /// Divides this value by the given value in place, rounding to a + /// representable value. + /// + /// This method serves as the basis for the in-place division operator + /// (`/=`). For example: + /// + /// var (x, y) = (15.0, 15.0) + /// x.divide(by: 2) + /// // x == 7.5 + /// y /= 2 + /// // y == 7.5 + /// + /// - Parameter other: The value to use when dividing this value. + /// + /// - SeeAlso: `divided(by:)` + public mutating func divide(by other: I) where I: Integer { + self.divide(by: Self(other.toIntMax())) + } +} + +public extension FloatingPoint { + + /// Returns the difference of this value and the given value, rounded to a + /// representable value. + /// + /// This method serves as the basis for the subtraction operator (`-`). For + /// example: + /// + /// let x = 7.5 + /// print(x.subtracting(2)) + /// // Prints "5.5" + /// print(x - 2) + /// // Prints "5.5" + /// + /// The `subtracting(_:)` method implements the subtraction operation + /// defined by the [IEEE 754 specification][spec]. + /// + /// [spec]: http://ieeexplore.ieee.org/servlet/opac?punumber=4610933 + /// + /// - Parameter other: The value to subtract from this value. + /// - Returns: The difference of this value and `other`, rounded to a + /// representable value. + /// + /// - SeeAlso: `subtract(_:)` + public func subtracting(by other: I) -> Self where I: Integer { + return self.subtracting(Self(other.toIntMax())) + } + + /// Subtracts the given value from this value in place, rounding to a + /// representable value. + /// + /// This method serves as the basis for the in-place subtraction operator + /// (`-=`). For example: + /// + /// var (x, y) = (7.5, 7.5) + /// x.subtract(2) + /// // x == 5.5 + /// y -= 2 + /// // y == 5.5 + /// + /// - Parameter other: The value to subtract. + /// + /// - SeeAlso: `subtracting(_:)` + public mutating func subtract(by other: I) where I: Integer { + self.subtract(Self(other.toIntMax())) + } +} + +public extension FloatingPoint { + + /// Returns the sum of this value and the given value, rounded to a + /// representable value. + /// + /// This method serves as the basis for the addition operator (`+`). For + /// example: + /// + /// let x = 1.5 + /// print(x.adding(2)) + /// // Prints "3.4" + /// print(x + 2) + /// // Prints "3.5" + /// + /// The `adding(_:)` method implements the addition operation defined by the + /// [IEEE 754 specification][spec]. + /// + /// [spec]: http://ieeexplore.ieee.org/servlet/opac?punumber=4610933 + /// + /// - Parameter other: The value to add. + /// - Returns: The sum of this value and `other`, rounded to a representable + /// value. + /// + /// - SeeAlso: `add(_:)` + public func adding(by other: I) -> Self where I: Integer { + return self.adding(Self(other.toIntMax())) + } + + /// Adds the given value to this value in place, rounded to a representable + /// value. + /// + /// This method serves as the basis for the in-place addition operator + /// (`+=`). For example: + /// + /// var (x, y) = (2.25, 2.25) + /// x.add(7) + /// // x == 9.25 + /// y += 7 + /// // y == 9.25 + /// + /// - Parameter other: The value to add. + /// + /// - SeeAlso: `adding(_:)` + public mutating func add(by other: I) where I: Integer { + self.add(Self(other.toIntMax())) + } +} + +public extension FloatingPoint { + + /// Returns the remainder of this value divided by the given value. + /// + /// - Parameter other: The value to use when dividing this value. + /// - Returns: The remainder of this value divided by `other`. + /// + /// - SeeAlso: `formRemainder(dividingBy:)`, + /// `truncatingRemainder(dividingBy:)` + public func remainder(dividingBy rhs: I) -> Self where I:Integer { + return self.remainder(dividingBy: Self(rhs.toIntMax())) + } + + /// Returns the remainder of this value divided by the given value using + /// truncating division. + /// + /// - Parameter other: The value to use when dividing this value. + /// - Returns: The remainder of this value divided by `other` using + /// truncating division. + /// + /// - SeeAlso: `formTruncatingRemainder(dividingBy:)`, + /// `remainder(dividingBy:)` + public func truncatingRemainder(dividingBy other: I) -> Self where I:Integer { + return self.truncatingRemainder(dividingBy: Self(other.toIntMax())) + } + + /// Replaces this value with the remainder of itself divided by the given + /// value. + /// + /// - Parameter other: The value to use when dividing this value. + /// + /// - SeeAlso: `remainder(dividingBy:)`, + /// `formTruncatingRemainder(dividingBy:)` + public mutating func formRemainder(dividingBy rhs: I) where I:Integer { + self.formRemainder(dividingBy: Self(rhs.toIntMax())) + } + + /// Replaces this value with the remainder of itself divided by the given + /// value using truncating division. + /// + /// - Parameter other: The value to use when dividing this value. + /// + /// - SeeAlso: `truncatingRemainder(dividingBy:)`, + /// `formRemainder(dividingBy:)` + public mutating func formTruncatingRemainder(dividingBy other: I) where I:Integer { + self.formTruncatingRemainder(dividingBy: Self(other.toIntMax())) + } +} + +public extension FloatingPoint { + + /// Returns a Boolean value indicating whether this instance is less than the + /// given value. + /// + /// This method serves as the basis for the less-than operator (`<`) for + /// floating-point values. Some special cases apply: + /// + /// - Because NaN compares not less than nor greater than any value, this + /// method returns `false` when called on NaN or when NaN is passed as + /// `other`. + /// - `-infinity` compares less than all values except for itself and NaN. + /// - Every value except for NaN and `+infinity` compares less than + /// `+infinity`. + /// + /// let x = 15.0 + /// x.isLessThan(20.0) + /// // true + /// x.isLessThan(.nan) + /// // false + /// Double.nan.isLessThan(x) + /// // false + /// + /// The `isLess(than:)` method implements the less-than predicate defined by + /// the [IEEE 754 specification][spec]. + /// + /// [spec]: http://ieeexplore.ieee.org/servlet/opac?punumber=4610933 + /// + /// - Parameter other: The value to compare with this value. + /// - Returns: `true` if `other` is less than this value; otherwise, `false`. + public func isLessThan(_ other: Self) -> Bool { + return self.isLess(than: other) + } + + /// Returns a Boolean value indicating whether this instance is less than the + /// given value. + /// + /// This method serves as the basis for the less-than operator (`<`) for + /// floating-point values. Some special cases apply: + /// + /// - Because NaN compares not less than nor greater than any value, this + /// method returns `false` when called on NaN or when NaN is passed as + /// `other`. + /// - `-infinity` compares less than all values except for itself and NaN. + /// - Every value except for NaN and `+infinity` compares less than + /// `+infinity`. + /// + /// let x = 15.0 + /// x.isLessThan(20) + /// // true + /// + /// The `isLess(than:)` method implements the less-than predicate defined by + /// the [IEEE 754 specification][spec]. + /// + /// [spec]: http://ieeexplore.ieee.org/servlet/opac?punumber=4610933 + /// + /// - Parameter other: The value to compare with this value. + /// - Returns: `true` if `other` is less than this value; otherwise, `false`. + public func isLessThan(_ other: I) -> Bool where I: Integer { + return self.isLessThan(Self(other.toIntMax())) + } + + /// Returns a Boolean value indicating whether this instance is less than + /// or equal to the given value. + /// + /// This method serves as the basis for the greater-than operator (`<=`) for + /// floating-point values. + /// + /// - Parameter other: The value to compare with this value. + /// - Returns: `true` if `other` is less than or equal to this this value; otherwise, `false`. + public func isLessThanOrEqualTo(_ other: Self) -> Bool { + return self <= other + } + + /// Returns a Boolean value indicating whether this instance is less than + /// or equal to the given value. + /// + /// This method serves as the basis for the greater-than operator (`<=`) for + /// floating-point values. + /// + /// - Parameter other: The value to compare with this value. + /// - Returns: `true` if `other` is less than or equal to this this value; otherwise, `false`. + public func isLessThanOrEqualTo(_ other: I) -> Bool where I: Integer { + return self.isLessThanOrEqualTo(Self(other.toIntMax())) + } +} + +public extension FloatingPoint { + + /// Returns a Boolean value indicating whether this instance is greater than the + /// given value. + /// + /// This method serves as the basis for the greater-than operator (`>`) for + /// floating-point values. + /// + /// - Parameter other: The value to compare with this value. + /// - Returns: `true` if `other` is greater than this value; otherwise, `false`. + public func isGreaterThan(_ other: Self) -> Bool { + return self > other + } + + /// Returns a Boolean value indicating whether this instance is greater than the + /// given value. + /// + /// This method serves as the basis for the greater-than operator (`>`) for + /// floating-point values. + /// + /// - Parameter other: The value to compare with this value. + /// - Returns: `true` if `other` is greater than this value; otherwise, `false`. + public func isGreaterThan(_ other: I) -> Bool where I: Integer { + return self.isGreaterThan(Self(other.toIntMax())) + } + + /// Returns a Boolean value indicating whether this instance is greater than + /// or equal to the given value. + /// + /// This method serves as the basis for the greater-than operator (`>=`) for + /// floating-point values. + /// + /// - Parameter other: The value to compare with this value. + /// - Returns: `true` if `other` is greater than or equal to this this value; otherwise, `false`. + public func isGreaterThanOrEqualTo(_ other: Self) -> Bool { + return self >= other + } + + /// Returns a Boolean value indicating whether this instance is greater than + /// or equal to the given value. + /// + /// This method serves as the basis for the greater-than operator (`>=`) for + /// floating-point values. + /// + /// - Parameter other: The value to compare with this value. + /// - Returns: `true` if `other` is greater than or equal to this this value; otherwise, `false`. + public func isGreaterThanOrEqualTo(_ other: I) -> Bool where I: Integer { + return self.isGreaterThanOrEqualTo(Self(other.toIntMax())) + } +} + +public extension FloatingPoint { + + /// Returns the lesser of the two given values. + /// + /// 10.0.minimum(-25.0) + /// // -25.0 + /// 10.0.minimum(.nan) + /// // 10.0 + /// Double.nan.minimum(-25.0) + /// // -25.0 + /// Double.nan.minimum(.nan) + /// // nan + /// + /// The `minimum` method implements the `minNum` operation defined by the + /// [IEEE 754 specification][spec]. + /// + /// [spec]: http://ieeexplore.ieee.org/servlet/opac?punumber=4610933 + /// + /// - Parameter other: Another floating-point value. + /// - Returns: The minimum of this instance and `other` , or whichever is a number if the + /// other is NaN. + public func minimum(_ other: Self) -> Self { + return Self.minimum(self, other) + } + + /// Returns the lesser of the two given values. + /// + /// 10.0.minimum(-25) + /// // -25.0 + /// 10.0.minimum(30) + /// // 10.0 + /// Double.nan.minimum(-25) + /// // -25.0 + /// + /// The `minimum` method implements the `minNum` operation defined by the + /// [IEEE 754 specification][spec]. + /// + /// [spec]: http://ieeexplore.ieee.org/servlet/opac?punumber=4610933 + /// + /// - Parameter other: Another integer value. + /// - Returns: The minimum of this instance and `other`, or whichever is a number if the + /// other is NaN. + public func minimum(_ other: I) -> Self where I: Integer { + return Self.minimum(self, Self(other.toIntMax())) + } +} + +public extension FloatingPoint { + + /// Returns the greater of the two given values. + /// + /// 10.0.maximum(-25.0) + /// // 10.0 + /// 10.0.maximum(.nan) + /// // 10.0 + /// Double.nan.maximum(-25.0) + /// // -25.0 + /// Double.nan.maximum(.nan) + /// // nan + /// + /// The `maximum` method implements the `maxNum` operation defined by the + /// [IEEE 754 specification][spec]. + /// + /// [spec]: http://ieeexplore.ieee.org/servlet/opac?punumber=4610933 + /// + /// - Parameter other: Another floating-point value. + /// - Returns: The greater of this instance and `other`, or whichever is a number if the + /// other is NaN. + public func maximum(_ other: Self) -> Self { + return Self.maximum(self, other) + } + + /// Returns the greater of the two given values. + /// + /// 10.0.maximum(-25) + /// // 10.0 + /// 10.0.maximum(8) + /// // 10.0 + /// + /// The `maximum` method implements the `maxNum` operation defined by the + /// [IEEE 754 specification][spec]. + /// + /// [spec]: http://ieeexplore.ieee.org/servlet/opac?punumber=4610933 + /// + /// - Parameter other: Another floating-point value. + /// - Returns: The greater of this instance and `other` , or whichever is a number if the + /// other is NaN. + public func maximum(_ other: I) -> Self where I: Integer { + return Self.maximum(self, Self(other.toIntMax())) + } +} + +public extension FloatingPoint { + + /// Returns a Boolean value indicating whether this instance is NOT equal to + /// the given value. + /// - Parameter other: The value to compare with this value. + /// - Returns: `true` if `other` is a different value from this instance; + /// otherwise, `false`. + public func isDifferent(from other: Self) -> Bool { + if self.isNaN && other.isNaN { return false } + return not(self.isEqual(to: other)) + } + + /// Returns a Boolean value indicating whether this instance is NOT equal to + /// the given `Integer` value. + /// - Parameter other: The value to compare with this value. + /// - Returns: `true` if `other` is a different value from this instance; + /// otherwise, `false`. + public func isDifferent(from other: I) -> Bool where I: Integer { + if self.isNaN { return true } + return self.isDifferent(from: Self(other.toIntMax())) + } +} + +public extension FloatingPoint { + + /// if the instance value is considered to represent degrees then this + /// property returns the a converted value that represents radians. + public var radians: Self { + return self.divided(by: Self(180)).multiplied(by: Self.pi) + } + + /// if the instance value is considered to represent radians then this + /// property returns the a converted value that represents degrees. + public var degrees: Self { + return self.multiplied(by: Self(180)).divided(by: Self.pi) + } +} diff --git a/Example/Pods/Ents/Ents/Classes/extensions/types/numbers/IntegerExtensions.swift b/Example/Pods/Ents/Ents/Classes/extensions/types/numbers/IntegerExtensions.swift new file mode 100644 index 0000000..9b44298 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/extensions/types/numbers/IntegerExtensions.swift @@ -0,0 +1,619 @@ +// +// IntegerExtensions.swift +// Ents +// +// Created by Georges Boumis on 2/10/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public extension Integer { + + /// Evaluates the given closure as many times as the instance represents + /// passing the current iteration. + /// + /// - parameter block: the closure to evaluate + /// - precondition: The instance must by greater than zero. + public func times(_ block: (_ i : Self) throws -> ()) rethrows { + precondition(self >= 0) + guard self > 0 else { return } + + var i = self-self // == 0 + let iterator = AnyIterator { + defer { i = i.advanced(by: 1) } + if i < self { + return i + } + return nil + } + for index in iterator { + try block(index) + } + } + + /// Evaluates the given closure as many times as the instance represents in + /// reverse. + /// + /// - parameter block: the closure to evaluate + /// - precondition: The instance must by greater than zero. + public func reversedTimes(_ block: (_ i : Self) throws -> ()) rethrows { + try self.times { index in + try block((self-1)-index) + } + } +} + +public extension IntegerArithmetic { + + /// Returns the sum of this value and the given value. + /// + /// This method serves as the basis for the addition operator (`+`). For + /// example: + /// + /// let x = 1 + /// print(x.adding(2)) + /// // Prints "3" + /// print(x + 2) + /// // Prints "3" + /// + /// - Parameter other: The value to add. + /// - Returns: The sum of this value and `other` + /// + /// - SeeAlso: `add(_:)` + public func adding(_ other: Self) -> Self { + return self + other + } + + /// Adds the given value to this value in place. + /// + /// This method serves as the basis for the in-place addition operator + /// (`+=`). For example: + /// + /// var (x, y) = (2, 2) + /// x.add(7) + /// // x == 9 + /// y += 7 + /// // y == 9 + /// + /// - Parameter other: The value to add. + /// + /// - SeeAlso: `adding(_:)` + public mutating func add(_ other: Self) { + self += other + } +} + +public extension IntegerArithmetic { + + /// Returns the difference of this value and the given value. + /// + /// This method serves as the basis for the subtraction operator (`-`). For + /// example: + /// + /// let x = 7 + /// print(x.subtracting(2)) + /// // Prints "5" + /// print(x - 2) + /// // Prints "5" + /// + /// - Parameter other: The value to subtract from this value. + /// - Returns: The difference of this value and `other`. + /// + /// - SeeAlso: `subtract(_:)` + public func subtracting(_ other: Self) -> Self { + return self - other + } + + /// Subtracts the given value from this value in place. + /// + /// This method serves as the basis for the in-place subtraction operator + /// (`-=`). For example: + /// + /// var (x, y) = (7, 7) + /// x.subtract(2) + /// // x == 5 + /// y -= 2 + /// // y == 5 + /// + /// - Parameter other: The value to subtract. + /// + /// - SeeAlso: `subtracting(_:)` + public mutating func subtract(_ other: Self) { + self -= other + } + + /// Returns the difference of this value and the given value. + /// + /// This method serves as the basis for the subtraction operator (`-`). For + /// example: + /// + /// let x = 7 + /// print(x.difference(2)) + /// // Prints "5" + /// print(x - 2) + /// // Prints "5" + /// + /// - Parameter other: The value to subtract from this value. + /// - Returns: The difference of this value and `other`. + /// + /// - SeeAlso: `subtracting(_:)` + public func difference(_ other: Self) -> Self { + return self.subtracting(other) + } +} + +public extension IntegerArithmetic { + + /// Returns the product of this value and the given value. + /// + /// This method serves as the basis for the multiplication operator (`*`). + /// For example: + /// + /// let x = 7 + /// print(x.multiplied(by: 2)) + /// // Prints "14" + /// print(x * 2) + /// // Prints "14" + /// + /// - Parameter other: The value to multiply by this value. + /// - Returns: The product of this value and `other`. + /// + /// - SeeAlso: `multiply(by:)` + public func multiplied(by other: Self) -> Self { + return self * other + } + + /// Multiplies this value by the given value in place. + /// + /// This method serves as the basis for the in-place multiplication operator + /// (`*=`). For example: + /// + /// var (x, y) = (7, 7) + /// x.multiply(by: 2) + /// // x == 14 + /// y *= 2 + /// // y == 14 + /// + /// - Parameter other: The value to multiply by this value. + /// + /// - SeeAlso: `multiplied(by:)` + public mutating func multiply(by other: Self) { + self *= other + } +} + +public extension IntegerArithmetic { + + /// Returns the quotient of this value and the given value. + /// + /// This method serves as the basis for the division operator (`/`). For + /// example: + /// + /// let x = 7 + /// let y = x.divided(by: 2) + /// // y == 3 + /// let z = x / 2 + /// // z == 3 + /// + /// - Parameter other: The value to use when dividing this value. + /// - Returns: The quotient of this value and `other`. + /// + /// - SeeAlso: `divide(by:)` + public func divided(by other: Self) -> Self { + return self / other + } + + /// Divides this value by the given value in place. + /// + /// This method serves as the basis for the in-place division operator + /// (`/=`). For example: + /// + /// var (x, y) = (15, 15) + /// x.divide(by: 2) + /// // x == 7 + /// y /= 2 + /// // y == 7 + /// + /// - Parameter other: The value to use when dividing this value. + /// + /// - SeeAlso: `divided(by:)` + public mutating func divide(by other: Self) { + self /= other + } +} + +public extension IntegerArithmetic { + + /// Returns the remainder of this value divided by the given value. + /// + /// For two finite values `x` and `y`, the remainder `r` of dividing `x` by + /// `y` satisfies `x == y * q + r`, where `q` is the integer nearest to + /// `x / y`. If `x / y` is exactly halfway between two integers, `q` is + /// chosen to be even. Note that `q` is *not* `x / y` computed in + /// floating-point arithmetic, and that `q` may not be representable in any + /// available integer type. + /// + /// The following example calculates the remainder of dividing 8.625 by 0.75: + /// + /// let x = 8.625 + /// print(x / 0.75) + /// // Prints "11.5" + /// + /// let q = (x / 0.75).rounded(.toNearestOrEven) + /// // q == 12.0 + /// let r = x.remainder(dividingBy: 0.75) + /// // r == -0.375 + /// + /// let x1 = 0.75 * q + r + /// // x1 == 8.625 + /// + /// If this value and `other` are finite numbers, the remainder is in the + /// closed range `-abs(other / 2)...abs(other / 2)`. The + /// `remainder(dividingBy:)` method is always exact. This method implements + /// the remainder operation defined by the [IEEE 754 specification][spec]. + /// + /// [spec]: http://ieeexplore.ieee.org/servlet/opac?punumber=4610933 + /// + /// - Parameter other: The value to use when dividing this value. + /// - Returns: The remainder of this value divided by `other`. + /// + /// - precondition: rhs must be greater than zero. + /// - SeeAlso: `formRemainder(dividingBy:)`, + /// `truncatingRemainder(dividingBy:)` + public func remainder(dividingBy rhs: Self) -> Self { + return self % rhs + } + + /// Replaces this value with the remainder of itself divided by the given + /// value. + /// + /// + /// + /// var x = 9 + /// x.formRemainder(dividingBy: 2) + /// // x == 1 + /// + /// - Parameter other: The value to use when dividing this value. + /// + /// - precondition: rhs must be greater than zero. + /// - SeeAlso: `remainder(dividingBy:)` + public mutating func formRemainder(dividingBy rhs: Self) { + self = self % rhs + } +} + +public extension IntegerArithmetic { + + /// Returns a Boolean value indicating whether this instance is less than the + /// given value. + /// + /// This method serves as the basis for the less-than operator (`<`) for + /// integer values. + /// + /// let x = 15 + /// x.isLessThan(20) + /// // true + /// + /// - Parameter other: The value to compare with this value. + /// - Returns: `true` if `other` is less than this value; otherwise, `false`. + public func isLessThan(_ other: Self) -> Bool { + return (self < other) + } + + /// Returns a Boolean value indicating whether this instance is less than or + /// equal to the given value. + /// + /// This method serves as the basis for the less-than operator (`<=`) for + /// integer values. + /// + /// let x = 15 + /// x.isLessThanOrEqualTo(20) + /// // true + /// + /// x.isLessThanOrEqualTo(15) + /// // true + /// + /// - Parameter other: The value to compare with this value. + /// - Returns: `true` if `other` is less than this value; otherwise, `false`. + public func isLessThanOrEqualTo(_ other: Self) -> Bool { + return (self <= other) + } + + /// Returns a Boolean value indicating whether this instance is greater than the + /// given value. + /// + /// let x = 25 + /// x.isGreaterThan(20) + /// // true + /// + /// let x = 15 + /// x.isGreaterThan(20) + /// // false + /// + /// This method serves as the basis for the greater-than operator (`>`) for + /// integer values. + /// + /// - Parameter other: The value to compare with this value. + /// - Returns: `true` if `other` is greater than this value; otherwise, `false`. + public func isGreaterThan(_ other: Self) -> Bool { + return (self > other) + } + + /// Returns a Boolean value indicating whether this instance is greater than + /// or equal to the given value. + /// + /// let x = 25 + /// x.isGreaterThanOrEqualTo(20) + /// // true + /// + /// let x = 15 + /// x.isGreaterThanOrEqualTo(20) + /// // false + /// + /// let x = 20 + /// x.isGreaterThanOrEqualTo(20) + /// // true + /// + /// This method serves as the basis for the greater-than operator (`>=`) for + /// integer values. + /// + /// - Parameter other: The value to compare with this value. + /// - Returns: `true` if `other` is greater than or equal to this this value; otherwise, `false`. + public func isGreaterThanOrEqualTo(_ other: Self) -> Bool { + return (self >= other) + } +} + +public extension IntegerArithmetic { + + /// Returns a Boolean value indicating whether this instance is equal to the + /// given value. + /// + /// This method serves as the basis for the equal-to operator (`==`) for + /// integer values. When comparing two values with this method, `-0` + /// is equal to `+0`. For example: + /// + /// let x = 15 + /// x.isEqual(to: 15) + /// // true + /// x == 15 + /// // true + /// x.isEqual(to: 17) + /// // false + /// + /// - Parameter other: The value to compare with this value. + /// - Returns: `true` if `other` has the same value as this instance; + /// otherwise, `false`. + public func isEqual(to other: Self) -> Bool { + return self == other + } + + /// Returns a Boolean value indicating whether this instance is NOT equal to + /// the given value. + /// - Parameter other: The value to compare with this value. + /// - Returns: `true` if `other` is a different value from this instance; + /// otherwise, `false`. + public func isDifferent(from other: Self) -> Bool { + return (self.isEqual(to: other) == false) + } +} + +public extension IntegerArithmetic { + + /// Returns a Boolean value indicating whether this instance is equal to the + /// given value. + /// + /// This method serves as the basis for the equal-to operator (`==`) for + /// integer values. When comparing two values with this method, `-0` + /// is equal to `+0`. For example: + /// + /// let x = 15 + /// x.isEqual(to: 15.0) + /// // true + /// x == 15.0 + /// // true + /// x.isEqual(to: 17.0) + /// // false + /// + /// - Parameter other: The value to compare with this value. + /// - Returns: `true` if `other` has the same value as this instance; + /// otherwise, `false`. + public func isEqual(to other: F) -> Bool where F: FloatingPoint { + return F(self.toIntMax()).isEqual(to: other) + } + + /// Returns a Boolean value indicating whether this instance is NOT equal to + /// the given value. + /// - Parameter other: The value to compare with this value. + /// - Returns: `true` if `other` is a different value from this instance; + /// otherwise, `false`. + public func isDifferent(from other: F) -> Bool where F: FloatingPoint { + return F(self.toIntMax()).isDifferent(from: other) + } +} + +public extension IntegerArithmetic { + + /// Returns the lesser of the two given values. + /// + /// 10.minimum(-25) + /// // -25 + /// + /// - Parameter other: Another integer value. + /// - Returns: The minimum of this instance and `other`. + /// - SeeAlso: `min(:)` + public func minimum(_ other: Self) -> Self { + return Swift.min(self, other) + } + + /// Returns the greater of the two given values. + /// + /// 10.maximum(-25) + /// // 10 + /// + /// - Parameter other: Another integer value. + /// - Returns: The greater of this instance and `other`. + /// - SeeAlso: `max(:)` + public func maximum(_ other: Self) -> Self { + return Swift.max(self, other) + } + + /// Returns the lesser of the two given values. + /// + /// 10.minimum(-25) + /// // -25 + /// + /// - Parameter other: Another integer value. + /// - Returns: The minimum of this instance and `other`. + /// - SeeAlso: `minimum(:)` + public mutating func min(_ other: Self) { + self = self.minimum(other) + } + + /// Returns the greater of the two given values. + /// + /// 10.maximum(-25) + /// // 10 + /// + /// - Parameter other: Another integer value. + /// - Returns: The greater of this instance and `other`. + /// - SeeAlso: `maximum(:)` + public mutating func max(_ other: Self) { + self = self.maximum(other) + } +} + +public extension IntegerArithmetic { + + /// Returns the lesser of the two given values. + /// + /// 10.minimum(-25.0) + /// // -25.0 + /// + /// - Parameter other: Another integer value. + /// - Returns: The minimum of this instance and `other`. + public func minimum(_ other: F) -> F where F: FloatingPoint { + return F(self.toIntMax()).minimum(other) + } + + /// Returns the greater of the two given values. + /// + /// 10.maximum(-25.0) + /// // 10.0 + /// + /// - Parameter other: Another integer value. + /// - Returns: The greater of this instance and `other`. + public func maximum(_ other: F) -> F where F: FloatingPoint { + return F(self.toIntMax()).maximum(other) + } +} + +public extension IntegerArithmetic where Self: SignedInteger { + + /// Returns the absolute value of this instance + public func absolute() -> Self { + return Swift.abs(self) + } + + /// Replaces this value with its additive inverse. + /// + /// This example uses the `negate()` method to + /// negate the value of the variable `x`: + /// + /// var x = 21 + /// x.negate() + /// // x == -21 + /// + /// - SeeAlso: `negated()` + public mutating func negate() { + self = self.negated() + } + + /// Returns the additive inverse of this value. + /// + /// This method serves as the basis for the + /// negation operator (prefixed `-`). For example: + /// + /// let x = 21 + /// let y = x.negated() + /// // y == -21 + /// + /// - Returns: The additive inverse of this value. + /// + /// - SeeAlso: `negate()` + public func negated() -> Self { + return -self + } +} + +public extension Integer { + + /// converts this `Integer` instance to a `NSNumber` instance. + public var asNumber: NSNumber { + return NSNumber(value: self.toIntMax()) + } +} + +public extension SignedInteger { + + /// create a SignedInteger from a Boolean + public init(_ v: Bool) { + if v { + self.init(1) + } + else { + self.init(0) + } + } + + /// Returns a integer value that is raised to the power of `p`. + /// - parameter p: an integer power. + public func power(_ p: Self) -> Self { + let result = Double(self.toIntMax()).power(p) + let integer = IntMax(result) + return Self(integer) + } + + /// returns the square value of this instance. + public var square: Self { + return self.power(2) + } + + /// returns the cube value of this instance. + public var cube: Self { + return self.power(3) + } +} + +public extension UnsignedInteger { + + /// create a UnsignedInteger from a Boolean + public init(_ v: Bool) { + if v { + self.init(1) + } + else { + self.init(0) + } + } + + /// Returns a integer value that is raised to the power of `p`. + /// - parameter p: an integer power. + public func power(_ p: Self) -> Self { + let result = Double(self.toUIntMax()).power(p) + let integer = UIntMax(result) + return Self(integer) + } + + /// returns the square value of this instance. + public var square: Self { + return self.power(2) + } + + /// returns the cube value of this instance. + public var cube: Self { + return self.power(3) + } +} diff --git a/Example/Pods/Ents/Ents/Classes/types/collections/AverageCollection.swift b/Example/Pods/Ents/Ents/Classes/types/collections/AverageCollection.swift new file mode 100644 index 0000000..17df7af --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/types/collections/AverageCollection.swift @@ -0,0 +1,96 @@ +// +// AverageCollection.swift +// Ents +// +// Created by Georges Boumis on 25/08/2017. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public struct AverageCollection: RangeReplaceableCollection, RandomAccessCollection where E: Integer { + private let storage: [E] + + public init() { + self.init([] as [E]) + } + public init(_ storage: [E]) { + self.storage = storage + } + + public var startIndex: Array.Index { return self.storage.startIndex } + public var endIndex: Array.Index { return self.storage.endIndex } + public subscript(i: Array.Index) -> E { return self.storage[i] } + public func index(after i: Array.Index) -> Array.Index { return self.storage.index(after: i) } + + enum Error: Swift.Error { + case empty + } + + public mutating func replaceSubrange(_ subrange: Range, with newElements: C) where C : Collection, C.Iterator.Element == E { + var array = self.storage + array.replaceSubrange(subrange, with: newElements) + self = AverageCollection(array) + } +} + + + +extension AverageCollection where E: SignedInteger { + + public func average() throws -> F where F: FloatingPoint { + guard self.hasElements else { throw AverageCollection.Error.empty } + return self.reduce(F(0.toIntMax()), { (res, next) -> F in + return res + F(next.toIntMax()) + }).divided(by: F(self.count.toIntMax())) + } + + public func average() throws -> I where I: SignedInteger { + guard self.hasElements else { throw AverageCollection.Error.empty } + return self.reduce(I(0.toIntMax()), { (res, next) -> I in + return res + I(next.toIntMax()) + }).divided(by: I(self.count.toIntMax())) + } + + public func median() throws -> F where F: FloatingPoint { + guard self.hasElements else { throw AverageCollection.Error.empty } + let odd = self.count % 2 != 0 + if odd { + return F(self.middle!.toIntMax()) + } + else { + return F(self.lowerMiddle!.toIntMax() + self.upperMiddle!.toIntMax()) + .divided(by: F(2.toIntMax())) + } + } +} + +extension AverageCollection where E: UnsignedInteger { + + public func average() throws -> F where F: FloatingPoint { + guard self.hasElements else { throw AverageCollection.Error.empty } + return self.reduce(F(UInt(0).toUIntMax()), { (res, next) -> F in + return res + F(next.toUIntMax()) + }).divided(by: F(UIntMax(self.count.toIntMax()))) + } + + public func average() throws -> U where U: UnsignedInteger { + guard self.hasElements else { throw AverageCollection.Error.empty } + return self.reduce(U(UInt(0).toUIntMax()), { (res, next) -> U in + return res + U(next.toUIntMax()) + }).divided(by: U(UIntMax(self.count.toIntMax()))) + } + + public func median() throws -> F where F: FloatingPoint { + guard self.hasElements else { throw AverageCollection.Error.empty } + let odd = self.count % 2 != 0 + if odd { + return F(self.middle!.toUIntMax()) + } + else { + return F(self.lowerMiddle!.toUIntMax() + self.upperMiddle!.toUIntMax()) + .divided(by: F(2.toIntMax())) + } + } +} diff --git a/Example/Pods/Ents/Ents/Classes/types/collections/FIFO.swift b/Example/Pods/Ents/Ents/Classes/types/collections/FIFO.swift new file mode 100644 index 0000000..0473181 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/types/collections/FIFO.swift @@ -0,0 +1,89 @@ +// +// FIFO.swift +// Ents +// +// Created by Georges Boumis on 09/05/2017. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +/// An efficient variable-size FIFO queue of elements of type 'Element' +public struct FIFO: Queue { + + fileprivate var left: Array + fileprivate var right: Array + + public typealias Indices = CountableRange + public var indices: Indices { + return self.startIndex.., right: Array) { + self.left = left + self.right = right + } + + //MARK: Queue conformance + /// Add an element to the back of the queue. + /// - Parameter element: the element to enqueue + /// - Complexity: O(1) + public mutating func enqueue(_ element: Element) { + self.right.append(element) + } + + /// Removes front of the queue. + /// - Returns: the front element of the queue or 'nil' in case of an empty queue + /// - Complexity: O(1) + public mutating func dequeue() -> Element? { + if self.left.isEmpty { + self.left = self.right.reversed() + self.right.removeAll() + } + return self.left.popLast() + } + + + //MARK: Collection conformance + public var startIndex: Int { return 0 } + public var endIndex: Int { return self.left.count + self.right.count } + + public func index(after i: Int) -> Int { + precondition(i < self.endIndex) + return i + 1 + } + + public subscript(_ index: Int) -> Element { + precondition((0..: Collection { + public typealias Index = ListIndex + + public let startIndex: Index + public let endIndex: Index + + public subscript(index: Index) -> Element { + switch index.node { + case .end: fatalError("Subscript out of range") + case let .node(element, _): return element + } + } + + public func index(after i: Index) -> Index { + switch i.node { + case .end: fatalError("Subscript out of range") + case let .node(_, next): return Index(node: next, tag: i.tag-1) + } + } + + public var count: Int { + return self.startIndex.tag - self.endIndex.tag + } +} + +// creating +extension List: ExpressibleByArrayLiteral { + + public init(arrayLiteral elements: Element...) { + self.startIndex = ListIndex(node: elements.reversed().reduce(.end) { $0.cons($1) }, + tag: elements.count) + self.endIndex = ListIndex(node: .end, tag: 0) + } +} + +// slicing +extension List { + public typealias SubSequence = List + + public subscript(bounds: Range) -> SubSequence { + return List(startIndex: bounds.lowerBound, + endIndex: bounds.upperBound) + } +} + +public extension List { + + public func cons(_ element: Element) -> List { + + let startIndex = self.startIndex + let newStartIndex = ListIndex(node: startIndex.node.cons(element), + tag: startIndex.tag + 1) + return List(startIndex: newStartIndex, endIndex: self.endIndex) + } + + public func car() -> Element? { + return self.startIndex.node.car() + } + + public func cdr() -> List { + let newStartIndex = ListIndex(node: self.startIndex.node.cdr(), tag: self.startIndex.tag-1) + return List(startIndex: newStartIndex, endIndex: self.endIndex) + } +} + + + +//public extension List { +// public init() { self = .end } +// +// public init(_ element: Element) { +// self = .node(element, next: .end) +// } +// +// /// Return a new list by prepending a node with value `element` to the +// /// front of a list. +// public func cons(_ element: Element) -> List { +// return .node(element, next: self) +// } +// +// public func car() -> Element? { +// switch self { +// case .end: return nil +// case let .node(element, _): return element +// } +// } +// +// public func cdr() -> List { +// switch self { +// case .end: return .end +// case let .node(_, next): return next +// } +// } +//} + +extension List: CustomStringConvertible { + + public var description: String { + let elements = self.map { String(describing: $0) }.joined(separator: ",") + return "List[\(elements)]" + } +} + +extension List: Stack { + + public mutating func push(_ element: Element) { + self = self.cons(element) + } + + public mutating func pop() -> Element? { + let element = self.car() + self = self.cdr() + return element + } +} + + +//extension List { +// public func == (lhs: List, rhs: List) -> Bool where E: Equatable { +// return lhs.elementsEqual(rhs) +// } +//} + + + +extension List: IteratorProtocol, Sequence { + public mutating func next() -> Element? { + return self.pop() + } +} + + + +public struct ListIndex: CustomStringConvertible { + fileprivate let node: ListNode + fileprivate let tag: Int + + public var description: String { + return String(describing: type(of: self)) + "(\(self.tag))" + } +} + +extension ListIndex: Comparable { + + public static func == (lhs: ListIndex, rhs: ListIndex) -> Bool { + return (lhs.tag == rhs.tag) + } + + public static func < (lhs: ListIndex, rhs: ListIndex) -> Bool { + // start index has the highest tag, endIndex the lowest + return (lhs.tag > rhs.tag) + } +} + + +//MARK: Private implementation of ListNode + + +fileprivate enum ListNode { + case end + indirect case node(Element, next: ListNode) + + func cons(_ element: Element) -> ListNode { + return .node(element, next: self) + } + + func car() -> Element? { + switch self { + case .end: return nil + case let .node(element, _): return element + } + } + + func cdr() -> ListNode { + switch self { + case .end: + return .end + case let .node(_, next): + return next + } + } +} + + diff --git a/Example/Pods/Ents/Ents/Classes/types/collections/Queue.swift b/Example/Pods/Ents/Ents/Classes/types/collections/Queue.swift new file mode 100644 index 0000000..0d0c6dc --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/types/collections/Queue.swift @@ -0,0 +1,22 @@ +// +// Queue.swift +// Ents +// +// Created by Georges Boumis on 09/05/2017. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +/// A type that can 'enqueue' and 'dequeue' elements. +public protocol Queue: Collection { + /// The type of elements held in 'self' + associatedtype Element + + /// Enqueue 'element' to 'self' + mutating func enqueue(_ element: Element) + /// Dequeue an element from 'self' + mutating func dequeue() -> Element? +} + diff --git a/Example/Pods/Ents/Ents/Classes/types/collections/SortedCollection.swift b/Example/Pods/Ents/Ents/Classes/types/collections/SortedCollection.swift new file mode 100644 index 0000000..814c3f2 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/types/collections/SortedCollection.swift @@ -0,0 +1,44 @@ +// +// SortedCollection.swift +// Ents +// +// Created by Georges Boumis on 09/05/2017. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public struct SortedCollection: Collection, RangeReplaceableCollection where Element: Comparable { + fileprivate let _array: [Element] + + public init() { + self.init(collection: []) + } + + public init(collection: [Element]) { + self._array = collection.sorted() + } + + //MARK: Collection conformance + public var startIndex: Int { return self._array.startIndex } + public var endIndex: Int { return self._array.endIndex } + public subscript(i: Int) -> Element { return self._array[i] } + public func index(after i: Int) -> Int { return self._array.index(after: i) } + + //MARK: RangeReplaceableCollection conformance + // performance non optimal + public mutating func replaceSubrange(_ subrange: Range, with newElements: C) where C : Collection, C.Iterator.Element == Element { + var array = self._array + array.replaceSubrange(subrange, with: newElements) + self = SortedCollection(collection: array) + } +} + +extension SortedCollection: CustomStringConvertible { + + public var description: String { + return String(describing: type(of: self)) + + "\(self._array)" + } +} diff --git a/Example/Pods/Ents/Ents/Classes/types/collections/Stack.swift b/Example/Pods/Ents/Ents/Classes/types/collections/Stack.swift new file mode 100644 index 0000000..6350dd4 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/types/collections/Stack.swift @@ -0,0 +1,34 @@ +// +// Stack.swift +// Ents +// +// Created by Georges Boumis on 10/05/2017. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +/// A LIFO stack type with constant-time push and pop operations +public protocol Stack { + /// The type of element held stored in the stack + associatedtype Element + + /// Pushes `element` onot the top of `self` + /// - Complexity: O(1) + mutating func push(_ element: Element) + + /// Removes the topmast element of `self` and returns it. + /// or `nil` if `self` is empty. + /// - Complexity: O(1) + mutating func pop() -> Element? +} + +extension Array: Stack { + public mutating func push(_ element: Element) { + self.append(element) + } + public mutating func pop() -> Element? { + return self.popLast() + } +} diff --git a/Example/Pods/Ents/Ents/Classes/types/collections/UniqueCollection.swift b/Example/Pods/Ents/Ents/Classes/types/collections/UniqueCollection.swift new file mode 100644 index 0000000..55f1b7d --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/types/collections/UniqueCollection.swift @@ -0,0 +1,52 @@ +// +// UniqueCollection.swift +// Ents +// +// Created by Georges Boumis on 06/07/2017. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +/// Non efficient unique collection based on == operator +public struct UniqueCollection: Collection, RangeReplaceableCollection where Element: Equatable { + fileprivate let _array: [Element] + + public init() { + self.init(collection: []) + } + + public init(collection: [Element]) { + var array: [Element] = Array() + array.reserveCapacity(collection.count) + collection.forEach { _,element in + guard not(array.contains(element)) else { return } + array.append(element) + } + self._array = array + } + + //MARK: Collection conformance + public var startIndex: Int { return self._array.startIndex } + public var endIndex: Int { return self._array.endIndex } + public subscript(i: Int) -> Element { return self._array[i] } + public func index(after i: Int) -> Int { return self._array.index(after: i) } + + //MARK: RangeReplaceableCollection conformance + // performance non optimal + public mutating func replaceSubrange(_ subrange: Range, with newElements: C) where C : Collection, C.Iterator.Element == Element { + var array = self._array + array.replaceSubrange(subrange, with: newElements) + self = UniqueCollection(collection: array) + } +} + +extension UniqueCollection: CustomStringConvertible { + + public var description: String { + return String(describing: type(of: self)) + + "\(self._array)" + } +} + diff --git a/Example/Pods/Ents/Ents/Classes/utils/Alarm.swift b/Example/Pods/Ents/Ents/Classes/utils/Alarm.swift new file mode 100644 index 0000000..c20263d --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/utils/Alarm.swift @@ -0,0 +1,138 @@ +// +// Alarm.swift +// Ents +// +// Created by Georges Boumis on 10/08/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public final class Alarm { + final fileprivate let notifyBlock: (() -> Void)! + final fileprivate var lazyTimer: Lazy! + final let queue: DispatchQueue + final let interval: TimeInterval + final let tolerance: TimeInterval + final let repeats: Bool + final let userInfo: AnyObject? + final let name: String + + fileprivate enum State { + case scheduled + case idle + } + final fileprivate var state: Alarm.State = Alarm.State.idle + + /// An Alarm that fires after a specified interval of time + public init(interval: TimeInterval = 1, + tolerance: TimeInterval = 0, + repeats: Bool = false, + name: String = "", + userInfo: AnyObject? = nil, + queue: DispatchQueue = DispatchQueue.main, + _ notifyBlock: @escaping () -> Void) { + self.notifyBlock = notifyBlock + self.interval = interval + self.repeats = repeats + self.tolerance = tolerance + self.queue = queue + self.userInfo = userInfo + self.name = name + + assert(not(self.name.isEmpty), + "Ents.Alarm: please name your alarms.") + + self.lazyTimer = Lazy(initialize: { [unowned self] in + // should use [unowned self] but it leaks + return Timer(timeInterval: self.interval, + target: self, + selector: #selector(self._timerFired), + userInfo: self.userInfo, + repeats: self.repeats) + }, invalidate: { (timer) in + timer.invalidate() + }) + } + + + /// An Alarm that fires on a specific date + /// - Parameter date: a date in the future, otherwise the initializer fails + public convenience init?(date: Date, + tolerance: TimeInterval = 0, + name: String = "", + userInfo: AnyObject? = nil, + queue: DispatchQueue = DispatchQueue.main, + _ notifyBlock: @escaping () -> Void) { + let interval = date.timeIntervalSinceNow + guard interval > 0 else { return nil } + self.init(interval: interval, + tolerance: tolerance, + repeats: false, + name: name, + userInfo: userInfo, + queue: queue, + notifyBlock) + } + + deinit { + self._cancel() + } + + public final func schedule() { + self._perform { + self._schedule() + } + } + + public final func cancel() { + self._perform { + self._cancel() + } + } +} + +// Swift 3 +fileprivate extension DispatchQueue { + + fileprivate class var _currentLabel: String { + return String(validatingUTF8: __dispatch_queue_get_label(nil))! + } +} + +extension Alarm { + + @objc final fileprivate func _timerFired(_ timer: Timer) { + guard timer.isValid else { + self.state = Alarm.State.idle + return + } + self.notifyBlock() + if self.repeats == false { self.state = Alarm.State.idle } + } + + final fileprivate func _perform(_ block: @escaping () -> Void) { + if (self.queue.label == DispatchQueue._currentLabel) { + block() + } + else { + self.queue.sync { [weak self] in + guard let _ = self else { return } + block() + } + } + } + + final fileprivate func _schedule() { + guard self.state == Alarm.State.idle else { return } + RunLoop.current.add(self.lazyTimer.property, + forMode: RunLoopMode.commonModes) + self.state = Alarm.State.scheduled + } + + final fileprivate func _cancel() { + self.lazyTimer.invalidate() + self.state = Alarm.State.idle + } +} diff --git a/Example/Pods/Ents/Ents/Classes/utils/Chronometer.swift b/Example/Pods/Ents/Ents/Classes/utils/Chronometer.swift new file mode 100644 index 0000000..3b857c1 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/utils/Chronometer.swift @@ -0,0 +1,31 @@ +// +// Chronometer.swift +// Ents +// +// Created by Georges Boumis on 26/08/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation +import CoreFoundation + +public struct Chronometer { + private let start: CFAbsoluteTime + + public init() { + self.start = CFAbsoluteTimeGetCurrent() + } + + public var difference: CFTimeInterval { + let end = CFAbsoluteTimeGetCurrent() + return (end-start) + } +} + +extension Chronometer: CustomStringConvertible { + public var description: String { + let difference = self.difference + return String(describing: type(of: self)) + "(\(difference)s)" + } +} diff --git a/Example/Pods/Ents/Ents/Classes/utils/CompileConditionalBlock/CompileConditionalBlock.swift b/Example/Pods/Ents/Ents/Classes/utils/CompileConditionalBlock/CompileConditionalBlock.swift new file mode 100644 index 0000000..3edf0d6 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/utils/CompileConditionalBlock/CompileConditionalBlock.swift @@ -0,0 +1,14 @@ +// +// CompileConditionalBlock.swift +// Ents +// +// Created by Georges Boumis on 26/08/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public protocol CompileConditionalBlock { + func perform(_ block: () throws -> Void) rethrows +} diff --git a/Example/Pods/Ents/Ents/Classes/utils/CompileConditionalBlock/DebugReleaseBlock.swift b/Example/Pods/Ents/Ents/Classes/utils/CompileConditionalBlock/DebugReleaseBlock.swift new file mode 100644 index 0000000..f18c367 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/utils/CompileConditionalBlock/DebugReleaseBlock.swift @@ -0,0 +1,45 @@ +// +// DebugReleaseBlock.swift +// Ents +// +// Created by Georges Boumis on 26/08/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +//public protocol CompileCondition {} +// +//public protocol Debug: CompileCondition {} +//public protocol Release: CompileCondition {} +// +//public func CompileConditionalBlock(_ block: () throws -> T, alternative: (() throws -> T)? = nil) rethrows { +// if T is Debug { +// return try block() +// } +// else { +// return try alternative.unwrap(defaultValue: {return T}) +// } +//} + +public func DebugBlock(_ block: () throws -> Void) rethrows { + #if DEBUG + try block() + #endif +} + +public func ReleaseBlock(_ block: () throws -> Void) rethrows { + #if DEBUG + #else + try block() + #endif +} + +public func DebugReleaseBlock(debug: () throws -> Void, release: () throws -> Void) rethrows { + #if DEBUG + try debug() + #else + try release() + #endif +} diff --git a/Example/Pods/Ents/Ents/Classes/utils/Copying.swift b/Example/Pods/Ents/Ents/Classes/utils/Copying.swift new file mode 100644 index 0000000..02e55ea --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/utils/Copying.swift @@ -0,0 +1,14 @@ +// +// Copying.swift +// Ents +// +// Created by Georges Boumis on 09/02/2017. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public protocol Copying { + var copy: Self { get } +} diff --git a/Example/Pods/Ents/Ents/Classes/utils/DisplayLinkBlock.swift b/Example/Pods/Ents/Ents/Classes/utils/DisplayLinkBlock.swift new file mode 100644 index 0000000..08862df --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/utils/DisplayLinkBlock.swift @@ -0,0 +1,114 @@ +// +// DisplayLinkBlock.swift +// Ents +// +// Created by Georges Boumis on 05/09/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation +import QuartzCore + +public final class DisplayLinkBlock { + public typealias DisplayLinkLoopBlock = (TimeInterval) -> Void + public init(preferredFramesPerSecond: Int = 60, loop: @escaping DisplayLinkLoopBlock) { + self.block = loop + self.link = CADisplayLink(target: self, selector: #selector(self._loop)) + self.preferredFramesPerSecond = preferredFramesPerSecond + + self._registerForNotifications() + self._setupDisplayLink() + self._start() + } + + deinit { + self._invalidate() + NotificationCenter.default.removeObserver(self) + } + + public final func pause() { + self._pause() + } + + public final func resume() { + self._resume() + } + + // alias of pause + public final func stop() { + self._invalidate() + } + + final fileprivate var block: DisplayLinkLoopBlock + final fileprivate var link: CADisplayLink! + final public private(set) var preferredFramesPerSecond: Int { + get { + if #available(iOS 10.0, *) { + return self.link.preferredFramesPerSecond + } else { + return 60.divided(by: self.link.frameInterval) + } + } + set { + if #available(iOS 10.0, *) { + self.link.preferredFramesPerSecond = newValue + } else { + self.link.frameInterval = 60.divided(by: newValue) + } + } + } +} + +extension DisplayLinkBlock { + final fileprivate func _pause() { + self.link?.isPaused = true + } + + final fileprivate func _resume() { + self.link?.isPaused = false + } + + // alias of resume + final fileprivate func _start() { + self._resume() + } + + final fileprivate func _invalidate() { + self.pause() + self.link?.invalidate() + self.link = nil + } +} + +extension DisplayLinkBlock { + @objc final private func _willEnterForeground(_ notification: Notification) { + self._resume() + } + + @objc final private func _didEnterBackground(_ notification: Notification) { + self._pause() + } + + @objc final fileprivate func _loop(_ displayLink: CADisplayLink) { + let timestamp = TimeInterval(displayLink.timestamp) + self.block(timestamp) + } + + final fileprivate func _setupDisplayLink() { + self.pause() + self.link.add(to: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) + } + + final fileprivate func _registerForNotifications() { + let nc = NotificationCenter.default + nc.addObserver(self, + selector: #selector(self._willEnterForeground), + name: NSNotification.Name.UIApplicationWillEnterForeground, + object: nil) + nc.addObserver(self, + selector: #selector(self._didEnterBackground), + name: NSNotification.Name.UIApplicationDidEnterBackground, + object: nil) + } +} diff --git a/Example/Pods/Ents/Ents/Classes/utils/EnumCollection.swift b/Example/Pods/Ents/Ents/Classes/utils/EnumCollection.swift new file mode 100644 index 0000000..4f386e8 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/utils/EnumCollection.swift @@ -0,0 +1,53 @@ +// +// EnumCollection.swift +// Ents +// +// Created by Georges Boumis on 16/01/2017. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// +// source: https://theswiftdev.com/2017/01/05/18-swift-gist-generic-allvalues-for-enums/?utm_campaign=iOS%2BDev%2BWeekly&utm_medium=email&utm_source=iOS_Dev_Weekly_Issue_283 +// + +import Foundation + + +/// works only for contiguous enumerations starting from 0 +public protocol EnumCollection: RawRepresentable, Hashable { + static var allValues: [Self] { get } +} + +public extension EnumCollection where RawValue: Integer { + + static var allValues: [Self] { + var index: Self.RawValue = 0 + let increment: Self.RawValue = 1 + + return Array(AnyIterator { + let id: Self.RawValue = index + index += increment + return Self(rawValue: id) + }) + } +} + +public extension EnumCollection { + static func cases() -> AnySequence { + typealias S = Self + return AnySequence { () -> AnyIterator in + var raw = 0 + return AnyIterator { + let current: Self = withUnsafePointer(to: &raw) { $0.withMemoryRebound(to: S.self, capacity: 1) { $0.pointee } } + guard current.hashValue == raw else { return nil } +// guard current.rawValue.hashValue == raw else { return nil } + raw += 1 + return current + } + } + } + + static var allValues: [Self] { + return Array(self.cases()) + } +} + diff --git a/Example/Pods/Ents/Ents/Classes/utils/IDValue.swift b/Example/Pods/Ents/Ents/Classes/utils/IDValue.swift new file mode 100644 index 0000000..fdad6f4 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/utils/IDValue.swift @@ -0,0 +1,90 @@ +// +// IDValue.swift +// Ents +// +// Created by Georges Boumis on 03/04/2017. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public protocol IDValue: Equatable, CustomStringConvertible { + + associatedtype ID: Equatable + var rawValue: ID { get } + init(_ rawValue: ID) +} + +public extension IDValue { + + public var description: String { + return "\(self.rawValue)" + } +} + + +public extension IDValue { + + public static func ==(lhs: Self, rhs: Self) -> Bool { + return (lhs.rawValue == rhs.rawValue) + } + + public static func !=(lhs: Self, rhs: Self) -> Bool { + return !(lhs == rhs) + } +} + +public extension IDValue where ID: Comparable { + + public static func <(lhs: Self, rhs: Self) -> Bool { + return (lhs.rawValue < rhs.rawValue) + } + + public static func >(lhs: Self, rhs: Self) -> Bool { + return (lhs.rawValue > rhs.rawValue) + } + + public static func <=(lhs: Self, rhs: Self) -> Bool { + return (lhs.rawValue <= rhs.rawValue) + } + + public static func >=(lhs: Self, rhs: Self) -> Bool { + return (lhs.rawValue >= rhs.rawValue) + } +} + +public extension IDValue where ID: Hashable { + + public var hashValue: Int { + return self.rawValue.hashValue + } +} + +public extension IDValue where ID: ExpressibleByStringLiteral { + + typealias StringLiteralType = ID.StringLiteralType + typealias ExtendedGraphemeClusterLiteralType = ID.ExtendedGraphemeClusterLiteralType + typealias UnicodeScalarLiteralType = ID.UnicodeScalarLiteralType + + public init(stringLiteral value: StringLiteralType) { + self.init(ID(stringLiteral: value)) + } + + public init(extendedGraphemeClusterLiteral value: ExtendedGraphemeClusterLiteralType) { + self.init(ID(extendedGraphemeClusterLiteral: value)) + } + + public init(unicodeScalarLiteral value: UnicodeScalarLiteralType) { + self.init(ID(unicodeScalarLiteral: value)) + } +} + +public extension IDValue where ID: ExpressibleByIntegerLiteral { + + typealias IntegerLiteralType = ID.IntegerLiteralType + + public init(integerLiteral value: IntegerLiteralType) { + self.init(ID(integerLiteral: value)) + } +} diff --git a/Example/Pods/Ents/Ents/Classes/utils/Lazy.swift b/Example/Pods/Ents/Ents/Classes/utils/Lazy.swift new file mode 100644 index 0000000..dd7e120 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/utils/Lazy.swift @@ -0,0 +1,42 @@ +// +// Lazy.swift +// Ents +// +// Created by Georges Boumis on 11/08/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public final class Lazy { + final private var _thing: T? = nil + + public typealias InitializeBlock = () -> T + public typealias PropertyBlock = (T) -> Void + + final private let initializeBlock: InitializeBlock + final private let invalidateBlock: PropertyBlock + + public final var initialized: Bool { + return self._thing.nonOptional + } + + public init(initialize: @escaping InitializeBlock, invalidate: @escaping PropertyBlock) { + self.initializeBlock = initialize + self.invalidateBlock = invalidate + } + + public final var property: T { + if self._thing.optional { + self._thing = self.initializeBlock() + } + return self._thing! + } + + public final func invalidate() { + guard self._thing.nonOptional else { return } + self.invalidateBlock(self.property) + self._thing = nil + } +} diff --git a/Example/Pods/Ents/Ents/Classes/utils/NoImplicitAnimationBlock.swift b/Example/Pods/Ents/Ents/Classes/utils/NoImplicitAnimationBlock.swift new file mode 100644 index 0000000..9204b92 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/utils/NoImplicitAnimationBlock.swift @@ -0,0 +1,22 @@ +// +// NoImplicitAnimationBlock.swift +// Ents +// +// Created by Georges Boumis on 06/09/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public func NoImplicitAnimation(_ block: () throws -> Void) rethrows { + CATransaction.begin(); defer { CATransaction.commit() } + CATransaction.setDisableActions(true) + try block() +} + +public func ImplicitAnimation(withDuration duration: CFTimeInterval, _ block: () throws -> Void) rethrows { + CATransaction.begin(); defer { CATransaction.commit() } + CATransaction.setAnimationDuration(duration) + try block() +} diff --git a/Example/Pods/Ents/Ents/Classes/utils/NonEmptyArray.swift b/Example/Pods/Ents/Ents/Classes/utils/NonEmptyArray.swift new file mode 100644 index 0000000..a9e858e --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/utils/NonEmptyArray.swift @@ -0,0 +1,188 @@ +// +// NonEmptyArray.swift +// Ents +// +// Created by Georges Boumis on 10/15/16. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public struct InvalidArrayError: Error { } + +public struct NonEmptyArray { + + public typealias CollectionType = Array + fileprivate var elements: CollectionType + + public init?(array: [Element]) { + guard !array.isEmpty else { + return nil + } + self.elements = array + } + + public init(elements: Element...) { + self.elements = elements + } + + public init?(_ sequence: S) where S.Iterator.Element == Element { + self.init(array: CollectionType(sequence)) + } + + public init?() { + return nil + } + + public var count: Int { + return elements.count + } + + public var first: Element { + return elements.first! + } + + public var last: Element { + return elements.last! + } + + public var isEmpty: Bool { + return false + } + + public func min(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> Element { + return try elements.min(by: areInIncreasingOrder)! + } + + public func max(by areInIncreasingOrder: (Element, Element) throws -> Bool) rethrows -> Element { + return try elements.max(by: areInIncreasingOrder)! + } + + public mutating func insert(contentsOf collection: C, at index: Index) where C.Iterator.Element == Element { + elements.insert(contentsOf: collection, at: index) + } + + public mutating func insert(_ newElement: Element, at index: Index) { + elements.insert(newElement, at: index) + } + + public mutating func append(_ newElement: Element) { + elements.append(newElement) + } + + public func appending(_ newElement: Element) -> NonEmptyArray { + var copy = self + copy.append(newElement) + return copy + } + + public mutating func remove(at index: Index) throws { + if elements.count == 1 { + throw InvalidArrayError() + } + elements.remove(at: index) + } + + public mutating func removeFirst() throws { + if elements.count == 1 { + throw InvalidArrayError() + } + elements.removeFirst() + } + + public mutating func removeFirst(_ n: Index) throws { + if elements.count <= n { + throw InvalidArrayError() + } + elements.removeFirst(n) + } + + public mutating func removeLast() throws { + if elements.count == 1 { + throw InvalidArrayError() + } + elements.removeLast() + } + + public mutating func removeLast(_ n: Index) throws { + if elements.count <= n { + throw InvalidArrayError() + } + elements.removeLast(n) + } + + public mutating func popLast() throws -> Element { + if elements.count == 1 { + throw InvalidArrayError() + } + return elements.popLast()! + } +} + +extension NonEmptyArray: CustomStringConvertible { + public var description: String { + return elements.description + } +} + +extension NonEmptyArray: CustomDebugStringConvertible { + public var debugDescription: String { + return elements.debugDescription + } +} + +extension NonEmptyArray: Collection { + public typealias Index = CollectionType.Index + + public var startIndex: Index { + return self.elements.startIndex + } + + public var endIndex: Index { + return self.elements.startIndex + } + + public subscript(_ index: Index) -> Element { + return self.elements[index] + } + + public func index(after i: Index) -> Index { + return self.elements.index(after: i) + } +} + +extension NonEmptyArray where Element: Comparable { + public func min() -> Element { + return elements.min()! + } + + public func max() -> Element { + return elements.max()! + } + + public mutating func sort() { + elements.sort() + } +} + +extension NonEmptyArray where Element: Equatable { + public static func ==(lhs: NonEmptyArray, rhs: NonEmptyArray) -> Bool { + return lhs.elements == rhs.elements + } + + public static func !=(lhs: NonEmptyArray, rhs: NonEmptyArray) -> Bool { + return lhs.elements != rhs.elements + } +} + +//extension Optional> { +// func append(_ element: Element) { +// switch self { +// case let Optional.some(array): +// array.append(element) +// case Optional.none: +// self = [element] +// } +// } +//} diff --git a/Example/Pods/Ents/Ents/Classes/utils/ReadabilityUtilities.swift b/Example/Pods/Ents/Ents/Classes/utils/ReadabilityUtilities.swift new file mode 100644 index 0000000..40cce4b --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/utils/ReadabilityUtilities.swift @@ -0,0 +1,20 @@ +// +// ReadabilityUtilities.swift +// Ents +// +// Created by Georges Boumis on 17/08/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public func by(_ element: Element) -> Element { + return element +} + +public func with(_ o: Element, _ block: (inout Element) -> Void) -> Element { + var e = o + block(&e) + return e +} diff --git a/Example/Pods/Ents/Ents/Classes/utils/TimedBlock.swift b/Example/Pods/Ents/Ents/Classes/utils/TimedBlock.swift new file mode 100644 index 0000000..18e3f86 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/utils/TimedBlock.swift @@ -0,0 +1,17 @@ +// +// TimedBlock.swift +// Ents +// +// Created by Georges Boumis on 26/08/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + + +public func TimedBlock(_ block: () throws -> Void) rethrows -> CFTimeInterval { + let chrono = Chronometer() + try block() + return chrono.difference +} diff --git a/Example/Pods/Ents/Ents/Classes/utils/Types.swift b/Example/Pods/Ents/Ents/Classes/utils/Types.swift new file mode 100644 index 0000000..a080717 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/utils/Types.swift @@ -0,0 +1,13 @@ +// +// Types.swift +// Ents +// +// Created by Georges Boumis on 2/10/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public typealias Degrees = Double +public typealias Radians = Double diff --git a/Example/Pods/Ents/Ents/Classes/utils/Value.swift b/Example/Pods/Ents/Ents/Classes/utils/Value.swift new file mode 100644 index 0000000..b4b7eb6 --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/utils/Value.swift @@ -0,0 +1,346 @@ +// +// Value.swift +// EntsKit +// +// Created by Georges Boumis on 13/06/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + + +public protocol Value: Comparable, Equatable, CustomStringConvertible { + associatedtype T: Comparable, Equatable + var value: T { get } + init(value: T) +} + +//MARK: Act as a CustomStringConvertible + +extension Value { + + public var description: String { + return "\(self.value)" + } +} + +//MARK: Act as a Equatable + +extension Value { + + public static func ==(lhs: Self, rhs: Self) -> Bool { + return (lhs.value == rhs.value) + } + + public static func !=(lhs: Self, rhs: Self) -> Bool { + return !(lhs == rhs) + } +} + +//MARK: Act as a Comparable + +extension Value { + + public static func >(lhs: Self, rhs: Self) -> Bool { + return (lhs.value > rhs.value) + } + + public static func <(lhs: Self, rhs: Self) -> Bool { + return (lhs.value < rhs.value) + } + + public static func <=(lhs: Self, rhs: Self) -> Bool { + return (lhs.value <= rhs.value) + } + + public static func >=(lhs: Self, rhs: Self) -> Bool { + return (lhs.value >= rhs.value) + } +} + +//MARK: Act as a Hashable + +extension Value where T: Hashable { + + public var hashValue: Int { + return self.value.hashValue + } +} + +//MARK: Act as a IntegerArithmetic + +extension Value where T: IntegerArithmetic { + + public static func ==(lhs: Self, rhs: T) -> Bool { + return (lhs.value == rhs) + } + + public static func +(lhs: Self, rhs: Self) -> Self { + return lhs + rhs.value + } + + public static func -(lhs: Self, rhs: Self) -> Self { + return lhs - rhs.value + } + + public static func *(lhs: Self, rhs: Self) -> Self { + return lhs * rhs.value + } + + public static func /(lhs: Self, rhs: Self) -> Self { + return lhs / rhs.value + } + + public static func %(lhs: Self, rhs: Self) -> Self { + return lhs % rhs.value + } + + + // + public static func +(lhs: Self, rhs: T) -> Self { + return Self(value: lhs.value + rhs) + } + + public static func -(lhs: Self, rhs: T) -> Self { + return Self(value: lhs.value - rhs) + } + + public static func *(lhs: Self, rhs: T) -> Self { + return Self(value: lhs.value * rhs) + } + + public static func /(lhs: Self, rhs: T) -> Self { + return Self(value: lhs.value / rhs) + } + + public static func %(lhs: Self, rhs: T) -> Self { + return Self(value: lhs.value % rhs) + } + + public func toIntMax() -> IntMax { + return self.value.toIntMax() + } + + public static func addWithOverflow(_ lhs: Self, _ rhs: Self) -> (Self, overflow: Bool) { + return Self.addWithOverflow(lhs, rhs.value) + } + + public static func subtractWithOverflow(_ lhs: Self, _ rhs: Self) -> (Self, overflow: Bool) { + return Self.subtractWithOverflow(lhs, rhs.value) + } + + public static func multiplyWithOverflow(_ lhs: Self, _ rhs: Self) -> (Self, overflow: Bool) { + return Self.multiplyWithOverflow(lhs, rhs.value) + } + + public static func divideWithOverflow(_ lhs: Self, _ rhs: Self) -> (Self, overflow: Bool) { + return Self.divideWithOverflow(lhs, rhs.value) + } + + public static func remainderWithOverflow(_ lhs: Self, _ rhs: Self) -> (Self, overflow: Bool) { + return Self.remainderWithOverflow(lhs, rhs.value) + } + + // + + public static func addWithOverflow(_ lhs: Self, _ rhs: T) -> (Self, overflow: Bool) { + let res = T.addWithOverflow(lhs.value, rhs) + return (Self(value: res.0), overflow: res.overflow) + } + + public static func subtractWithOverflow(_ lhs: Self, _ rhs: T) -> (Self, overflow: Bool) { + let res = T.subtractWithOverflow(lhs.value, rhs) + return (Self(value: res.0), overflow: res.overflow) + } + + public static func multiplyWithOverflow(_ lhs: Self, _ rhs: T) -> (Self, overflow: Bool) { + let res = T.multiplyWithOverflow(lhs.value, rhs) + return (Self(value: res.0), overflow: res.overflow) + } + + public static func divideWithOverflow(_ lhs: Self, _ rhs: T) -> (Self, overflow: Bool) { + let res = T.divideWithOverflow(lhs.value, rhs) + return (Self(value: res.0), overflow: res.overflow) + } + + public static func remainderWithOverflow(_ lhs: Self, _ rhs: T) -> (Self, overflow: Bool) { + let res = T.remainderWithOverflow(lhs.value, rhs) + return (Self(value: res.0), overflow: res.overflow) + } + + // + + public static func +=(lhs: inout Self, rhs: Self) { + lhs = lhs + rhs.value + } + + public static func -=(lhs: inout Self, rhs: Self) { + lhs = lhs - rhs.value + } + + public static func *=(lhs: inout Self, rhs: Self) { + lhs = lhs * rhs.value + } + + public static func /=(lhs: inout Self, rhs: Self) { + lhs = lhs / rhs.value + } + + public static func %=(lhs: inout Self, rhs: Self) { + lhs = lhs % rhs.value + } + + // + + public static func +=(lhs: inout Self, rhs: T) { + lhs = Self(value: lhs.value + rhs) + } + + public static func -=(lhs: inout Self, rhs: T) { + lhs = Self(value: lhs.value - rhs) + } + + public static func *=(lhs: inout Self, rhs: T) { + lhs = Self(value: lhs.value * rhs) + } + + public static func /=(lhs: inout Self, rhs: T) { + lhs = Self(value: lhs.value / rhs) + } + + public static func %=(lhs: inout Self, rhs: T) { + lhs = Self(value: lhs.value % rhs) + } +} + +//MARK: Act as a SignedInteger + +extension Value where T: SignedInteger { + + public func absolute() -> Self { + return Self(value: self.value.absolute()) + } + + public func negated() -> Self { + return Self(value: self.value.negated()) + } + + public mutating func negate() { + self = self.negated() + } +} + +//MARK: Act as a FloatingPoint + +extension Value where T: FloatingPoint { + + public func adding(_ other: Self) -> Self { + return self.adding(other.value) + } + public func subtracting(_ other: Self) -> Self { + return self.subtracting(other.value) + } + public func multiplied(by other: Self) -> Self { + return self.multiplied(by: other.value) + } + public func divided(by other: Self) -> Self { + return self.divided(by: other.value) + } + + + public func adding(_ other: T) -> Self { + return Self(value: self.value.adding(other)) + } + public func subtracting(_ other: T) -> Self { + return Self(value: self.value.subtracting(other)) + } + public func multiplied(by other: T) -> Self { + return Self(value: self.value.multiplied(by: other)) + } + public func divided(by other: T) -> Self { + return Self(value: self.value.divided(by: other)) + } + + + public func negated() -> Self { + return Self(value: self.value.negated()) + } + + public func absolute() -> Self { + return Self(value: self.value.absolute()) + } + + + public func minimum(_ other: Self) -> Self { + return Self(value: self.value.minimum(other.value)) + } + + public func maximum(_ other: Self) -> Self { + return Self(value: self.value.maximum(other.value)) + } +} + +//MARK: Act as a Strideable + +extension Value where T: Strideable { + + public func distance(to other: Self) -> T.Stride { + return self.value.distance(to: other.value) + } + + public func advanced(by amount: T.Stride) -> Self { + return Self(value: self.value.advanced(by: amount)) + } +} + + +//MARK: Operators + +prefix public func -(x: V) -> V where V: Value, V.T : SignedNumber { + return V(value: -x.value) +} + +prefix public func +(x: V) -> V where V: Value { + return x +} + +public func +(lhs: V, rhs: V) -> V where V: Value, V.T: IntegerArithmetic { + return V(value: lhs.value + rhs.value) +} + +public func -(lhs: V, rhs: V) -> V where V: Value, V.T: IntegerArithmetic { + return V(value: lhs.value - rhs.value) +} + +public func *(lhs: V, rhs: V) -> V where V: Value, V.T: IntegerArithmetic { + return V(value: lhs.value * rhs.value) +} + +public func /(lhs: V, rhs: V) -> V where V: Value, V.T: IntegerArithmetic { + return V(value: lhs.value / rhs.value) +} + +public func %(lhs: V, rhs: V) -> V where V: Value, V.T: IntegerArithmetic { + return V(value: lhs.value % rhs.value) +} + + +//MARK: Act as a Collection + +extension Value where T: Collection { + + public typealias Element = T.Iterator.Element + public typealias Index = T.Index + public typealias IndexDistance = T.IndexDistance + public typealias Iterator = T.Iterator + + public func makeIterator() -> Iterator { return self.value.makeIterator() } + public var startIndex: Index { return self.value.startIndex } + public var endIndex: Index { return self.value.endIndex } + public var count: IndexDistance { return self.value.count } + public subscript(i: Index) -> Element { return self.value[i] } + public func index(after i: Index) -> Index { return self.value.index(after: i) } + + +} diff --git a/Example/Pods/Ents/Ents/Classes/utils/Weak.swift b/Example/Pods/Ents/Ents/Classes/utils/Weak.swift new file mode 100644 index 0000000..db3fbab --- /dev/null +++ b/Example/Pods/Ents/Ents/Classes/utils/Weak.swift @@ -0,0 +1,19 @@ +// +// Weak.swift +// Ents +// +// Created by Georges Boumis on 30/09/2016. +// Copyright © 2016-2017 Georges Boumis. +// Licensed under MIT (https://github.com/averello/Ents/blob/master/LICENSE) +// + +import Foundation + +public final class Weak { + + public weak var value: Reference? + + public init(_ value: Reference) { + self.value = value + } +} diff --git a/Example/Pods/Ents/LICENSE b/Example/Pods/Ents/LICENSE new file mode 100644 index 0000000..32d286b --- /dev/null +++ b/Example/Pods/Ents/LICENSE @@ -0,0 +1,21 @@ +Ents + +Copyright (c) 2016-2017 Georges Boumis + +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/Example/Pods/Ents/README.md b/Example/Pods/Ents/README.md new file mode 100644 index 0000000..24f482f --- /dev/null +++ b/Example/Pods/Ents/README.md @@ -0,0 +1,27 @@ +# Ents + +Ents is a collection of different little extensions to existent structs, +classes and protocols of the standard library, as well as new classes. + +## Example + +To run the example project, clone the repo, and run `pod install` from the Example directory first. + +## Requirements + +## Installation + +Ents is available through [CocoaPods](http://cocoapods.org). To install +it, simply add the following line to your Podfile: + +```ruby +pod "Ents" +``` + +## Author + +Georges Boumis, developer.george.boumis@gmail.com + +## License + +Ents is available under the MIT license. See the LICENSE file for more info. diff --git a/Example/Pods/Local Podspecs/ContentKit.podspec.json b/Example/Pods/Local Podspecs/ContentKit.podspec.json new file mode 100644 index 0000000..91936fb --- /dev/null +++ b/Example/Pods/Local Podspecs/ContentKit.podspec.json @@ -0,0 +1,30 @@ +{ + "name": "ContentKit", + "version": "1.6.5", + "summary": "Manage content.", + "description": "TODO: Add long description of the pod here.", + "homepage": "https://github.com/averello/ContentKit", + "license": { + "type": "Apache 2.0", + "file": "LICENSE" + }, + "authors": { + "Georges Boumis": "developer.george.boumis@gmail.com" + }, + "source": { + "git": "https://github.com/averello/ContentKit.git", + "tag": "1.6.5" + }, + "platforms": { + "ios": "8.0" + }, + "source_files": "ContentKit/Classes/**/*", + "dependencies": { + "Ents": [ + + ], + "RepresentationKit": [ + + ] + } +} diff --git a/Example/Pods/Local Podspecs/Ents.podspec.json b/Example/Pods/Local Podspecs/Ents.podspec.json new file mode 100644 index 0000000..03c47d0 --- /dev/null +++ b/Example/Pods/Local Podspecs/Ents.podspec.json @@ -0,0 +1,25 @@ +{ + "name": "Ents", + "version": "1.17", + "summary": "A collection of handy extensions for Swift.", + "description": "TODO: Add long description of the pod here.", + "homepage": "https://github.com/averello/Ents", + "license": { + "type": "MIT", + "file": "LICENSE" + }, + "authors": { + "Georges Boumis": "developer.george.boumis@gmail.com" + }, + "source": { + "git": "https://github.com/averello/Ents.git", + "tag": "1.17" + }, + "platforms": { + "ios": "8.0" + }, + "source_files": "Ents/Classes/**/*", + "xcconfig": { + "OTHER_SWIFT_FLAGS[config=Debug]": "-DDEBUG" + } +} diff --git a/Example/Pods/Local Podspecs/LogKit.podspec.json b/Example/Pods/Local Podspecs/LogKit.podspec.json new file mode 100644 index 0000000..93d39a7 --- /dev/null +++ b/Example/Pods/Local Podspecs/LogKit.podspec.json @@ -0,0 +1,30 @@ +{ + "name": "LogKit", + "version": "1.1.6", + "summary": "Quick logging based on representations of objects.", + "description": "TODO: Add long description of the pod here.", + "homepage": "https://github.com/averello/LogKit", + "license": { + "type": "MIT", + "file": "LICENSE" + }, + "authors": { + "Georges Boumis": "developer.george.boumis@gmail.com" + }, + "source": { + "git": "https://github.com/averello/LogKit.git", + "tag": "1.1.6" + }, + "platforms": { + "ios": "8.0" + }, + "source_files": "LogKit/Classes/**/*", + "dependencies": { + "RepresentationKit": [ + + ], + "ContentKit": [ + + ] + } +} diff --git a/Example/Pods/Local Podspecs/RepresentationKit.podspec.json b/Example/Pods/Local Podspecs/RepresentationKit.podspec.json new file mode 100644 index 0000000..60e917e --- /dev/null +++ b/Example/Pods/Local Podspecs/RepresentationKit.podspec.json @@ -0,0 +1,22 @@ +{ + "name": "RepresentationKit", + "version": "1.1.4", + "summary": "Create representation of objects.", + "description": "TODO: Add long description of the pod here.", + "homepage": "https://github.com/averello/RepresentationKit", + "license": { + "type": "Apache 2.0", + "file": "LICENSE" + }, + "authors": { + "Georges Boumis": "developer.george.boumis@gmail.com" + }, + "source": { + "git": "https://github.com/averello/RepresentationKit.git", + "tag": "1.1.4" + }, + "platforms": { + "ios": "8.0" + }, + "source_files": "RepresentationKit/Classes/**/*" +} diff --git a/Example/Pods/Manifest.lock b/Example/Pods/Manifest.lock new file mode 100644 index 0000000..7325e16 --- /dev/null +++ b/Example/Pods/Manifest.lock @@ -0,0 +1,46 @@ +PODS: + - ContentKit (1.6.5): + - Ents + - RepresentationKit + - Ents (1.17) + - LogKit (1.1.6): + - ContentKit + - RepresentationKit + - RepresentationKit (1.1.4) + +DEPENDENCIES: + - ContentKit (from `https://github.com/averello/ContentKit.git`) + - Ents (from `https://github.com/averello/Ents.git`) + - LogKit (from `../`) + - RepresentationKit (from `https://github.com/averello/RepresentationKit.git`) + +EXTERNAL SOURCES: + ContentKit: + :git: https://github.com/averello/ContentKit.git + Ents: + :git: https://github.com/averello/Ents.git + LogKit: + :path: "../" + RepresentationKit: + :git: https://github.com/averello/RepresentationKit.git + +CHECKOUT OPTIONS: + ContentKit: + :commit: ef561a488f2cde6731a76a163184578ec01fb0af + :git: https://github.com/averello/ContentKit.git + Ents: + :commit: 580e1880a334135f775b2cf1ef20f0e1a1540f1d + :git: https://github.com/averello/Ents.git + RepresentationKit: + :commit: 13a45a3a9e3e93def7662d6f7719e9fe4920f5d3 + :git: https://github.com/averello/RepresentationKit.git + +SPEC CHECKSUMS: + ContentKit: b0ded7d9d57f77ca3c87261c97d606b4ea9f7bdf + Ents: f7469b80b3507e2bbc936c96b2cf61e79c0ce809 + LogKit: 580d198cb760af1e217ae6af12c26d04b0f14a6b + RepresentationKit: 1ae7749916ed014403db30f3d38204d7e000dbd1 + +PODFILE CHECKSUM: 806623dc0beef0c14dd3cf055f7d62d4cb652c7c + +COCOAPODS: 1.2.1 diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj new file mode 100644 index 0000000..0b922b7 --- /dev/null +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -0,0 +1,1511 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 045D018CD1D310B695D481764A36E8D2 /* JSONRepresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = E92A32E650DFD9A75A407D17D1F5352E /* JSONRepresentation.swift */; }; + 1008A29C3E570FF4B6456B41205EFB21 /* OnceAudio.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3FF5033C468EEB1729E6817D288752F /* OnceAudio.swift */; }; + 101D61D57A3ABA54DA5ADFBC94EEE070 /* UIImageViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C5614EBC657E1DBCC8D6893DB1B33ED3 /* UIImageViewExtensions.swift */; }; + 1360C7EBE8B197F536C4BEC5C7FE2BA2 /* AudibleContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F59EA93F00E45A0A8E5F604DD1AEB39 /* AudibleContent.swift */; }; + 13E522F840584DD210A9E57D57D46E0B /* ReadabilityUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7C43BDDF1D1A491F51ABFF5853CA3513 /* ReadabilityUtilities.swift */; }; + 1E39EC900BA9DBBC7A920075C472433D /* BinaryFloatingPointExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 702B7F2A20EC3154C2C6318FC731E43F /* BinaryFloatingPointExtensions.swift */; }; + 1F108BDDC3EC3B6E91FAA1E86D34DDFB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24E1335958698A6FFB51A9DDFC964243 /* Foundation.framework */; }; + 2047244DA5A94FEC6894599EC600AE6E /* AnyImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = E90FEB205D0F1B80A28DD4C96DAB5DCD /* AnyImage.swift */; }; + 2169EF8E35AE70389EF28078C6FA5515 /* DoubleExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDD709C530ABBA607137D21862B9CAAA /* DoubleExtensions.swift */; }; + 22CE2B2B497EA9409744FBFE033B44B2 /* DisplayLinkBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 513B93B9EA97807CFED63285CB78AC97 /* DisplayLinkBlock.swift */; }; + 246DD623B393E21842DDCA4F97724ED5 /* Text.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09EC24BC215211F302BB233781D9670C /* Text.swift */; }; + 25D9CC692AF18F46C65536A7590AE1F1 /* UniqueCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2C10859A19E37E50B2A0AC6B6B829753 /* UniqueCollection.swift */; }; + 2B027E8EA5259060A656FDF481B4A42E /* CGSizeExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 875B9C43FDCFD0385868E818076F8548 /* CGSizeExtensions.swift */; }; + 2DDA59CF2EC64A6EC3727AC7FD2E8E74 /* DeepArrayRepresentationBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32D27D656177C950E02992F19E023684 /* DeepArrayRepresentationBuilder.swift */; }; + 2E956874F139F4902AD36878B7297B2B /* SetAlgebraExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B808DD2B6638EDDC3AC8316C0EACA705 /* SetAlgebraExtensions.swift */; }; + 30DBB190ABE454C7D14EAAD3524EB370 /* Pods-LogKit_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 1095F0F47D1C16758B352EA734847EE5 /* Pods-LogKit_Tests-dummy.m */; }; + 31E4DAAC857343DA47D4A9530F777DCD /* Stack.swift in Sources */ = {isa = PBXBuildFile; fileRef = F67F4AA3BE5D9FA50D9F95E50AD38347 /* Stack.swift */; }; + 3484EFC502D077667B30549B42E26471 /* LogKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 159B36DB3F9374DD7CDDEC163711B53E /* LogKit-dummy.m */; }; + 391C5C2343BBE538509C9B2D51DFCDDA /* CGFloatExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1086DFEC0126A55D735AE187A5FE4EF4 /* CGFloatExtensions.swift */; }; + 3A1CBCD1FCADBBABAFFFE61107821550 /* ScaledImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1DF60175E700AB38A4FA53925CC3F7F5 /* ScaledImage.swift */; }; + 3B0872F8C53A1997A083B777AB05761F /* AnyAudio.swift in Sources */ = {isa = PBXBuildFile; fileRef = F92955F87C2AA96FCD732E109620B07F /* AnyAudio.swift */; }; + 3DCAAAF445C4E69FD69E83BE630BF784 /* OnDiskLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1E413795E3ADA368B85036B6C158F81 /* OnDiskLog.swift */; }; + 3EFD2F345C817CCC25B1133DDF64E727 /* SortedCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79EA6939A3D6B0AEDA0FFB554B3D6DE0 /* SortedCollection.swift */; }; + 3F1665CD7FBFBB382C48F13C40E94709 /* ContentKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D3190A2ACE55D44CFDE3E460F29CB383 /* ContentKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 460D407A67F5F8F7127F947364ED2C00 /* Chronometer.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE41FA8A55195422DD4F4AE929DAAB14 /* Chronometer.swift */; }; + 4A35E78CCACA3C84328C7A134E3D871D /* UIContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79E6D3E4E4C1F97471BD731AB64BA978 /* UIContent.swift */; }; + 4A585823454DB0E6BCC34A8F3A043050 /* LogRepresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 87387AFA509C651DAEB1CC4B946BAF22 /* LogRepresentation.swift */; }; + 4B04193462F640D246D267D34C8DE7C1 /* CollectionTypeExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94BBC0C2F03C2426E6FF9D6983821435 /* CollectionTypeExtensions.swift */; }; + 4CFD965510956A251D067A4F70E1F90C /* EnumCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1A0ED481D97024F7D2CCD0B236771F8 /* EnumCollection.swift */; }; + 5179CAFE694E671560893AAF71861711 /* JSONRepresentationBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D10C47C17CC68AB59F2C9D7485B59E5 /* JSONRepresentationBuilder.swift */; }; + 5278364CA91D805A98EC75DBB4D90579 /* CATransform3DExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 169C240860C5027AC7A8C03AC8EA9D6D /* CATransform3DExtensions.swift */; }; + 533C786E5D1A599362BB906D01F7A49A /* LogKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A94637E5367D22A6FDF0EE1952AE0459 /* LogKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5442E7F9E341EAFAD3E99B8D8CF38739 /* DictionaryExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = FFF77A32FE99289C9864A05AC2166DD0 /* DictionaryExtension.swift */; }; + 56C4D008C1753A16EB28C5E5C56725A6 /* CollectionExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 09F5A2ADF104306540E1E3EB3B3D3604 /* CollectionExtensions.swift */; }; + 589FA60E6ACD8B6243033B551E226428 /* CGAffineTransformExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03D6123DBBC13EE1A156897FCD1B5467 /* CGAffineTransformExtensions.swift */; }; + 5E488C685F4B5EF34F627458BE6768C2 /* Sorting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 680C21CCC7AF00D6C3F116751C986A4A /* Sorting.swift */; }; + 645BCEE74DBE854968A39DE39348133B /* CGPointExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19A2AE45EF0E4C44ED43282C62056374 /* CGPointExtensions.swift */; }; + 65D09E2FD6FF1F746FE766E9ABE2FDC3 /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E95753714B840DEE4EA9E555E395C3A /* Queue.swift */; }; + 689651C81B9DD8B3F9B94B0ADFFAB223 /* AverageCollection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EA38264E4B55235E274A4D233D3275B /* AverageCollection.swift */; }; + 6AB8A1F89BFEFE98313D298308C4D29A /* RepresentationKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7BEA5B1EDBF502B6F115FB78BCE30BCC /* RepresentationKit-dummy.m */; }; + 6B12A84AD9F954973A8506FD385CBC1C /* OptionalExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2774EE8574BCB2945D00345E24491DF7 /* OptionalExtensions.swift */; }; + 6B666192BBFCFEC6872B92C2E9D56CA3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24E1335958698A6FFB51A9DDFC964243 /* Foundation.framework */; }; + 6E4087BB5327E647C40475B77A5D7349 /* Log.swift in Sources */ = {isa = PBXBuildFile; fileRef = 98AF873E37C022A992060809888B6738 /* Log.swift */; }; + 73902AF2AEFB55918B5A934EEA16E4E7 /* TextualContentKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 066619DD3ED38134ED1946AC8537EE29 /* TextualContentKey.swift */; }; + 75DE42078436E17A6AFA720C88BA9901 /* UIImageExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1BA852F9CB4B2ABD9CA0A711AECA34B /* UIImageExtensions.swift */; }; + 7B43FCAE0042A9B058893165969D439C /* Types.swift in Sources */ = {isa = PBXBuildFile; fileRef = E17201C20007837D84BD599986B91F25 /* Types.swift */; }; + 8083A36D569FAD6D455F5AA925AC9379 /* AnyText.swift in Sources */ = {isa = PBXBuildFile; fileRef = B991C679799F6863C8B705217B03B698 /* AnyText.swift */; }; + 829FF8ACECB305965180C1DB3FA3C4E7 /* BidirectionalCollectionExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = AA93C9A33E2A26C2789C2C0516B323A8 /* BidirectionalCollectionExtensions.swift */; }; + 83D4D2727C78847B4C919DE8B6D0E1E7 /* DictionaryRepresentationBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = C20948A60653DC475F76FA296F399AF1 /* DictionaryRepresentationBuilder.swift */; }; + 851E7663EE5A0CE333489A4735E7032B /* Lazy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 231D84B39C432DAD075594F48D7EC3A2 /* Lazy.swift */; }; + 86C46533F5F4E6A48EF289CC2E6C4BA9 /* Weak.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84660F76717A36F9F6879126EFFA79EF /* Weak.swift */; }; + 8B53DFCD39BF0FB1078EF46EB591A860 /* ArrayRepresentationBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = D860A86018B5FCB9D7803CAC35C06086 /* ArrayRepresentationBuilder.swift */; }; + 8CCB91F9702939400CBCAD3C3DA4A553 /* FIFO.swift in Sources */ = {isa = PBXBuildFile; fileRef = 78D3149923C3C1989C067837C99F86B5 /* FIFO.swift */; }; + 8DF0268FE3693A9B3098FA01A2F47A0E /* CompileConditionalBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE204BEF3EAD8237A586468A893D6C50 /* CompileConditionalBlock.swift */; }; + 9160052076BB9727A6F8F6F67DF16F1B /* RandomAccessCollectionExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A260C63E746C1E731323F8A2CD9242F /* RandomAccessCollectionExtensions.swift */; }; + 91948D15116AF11724AC5BC97216DFD5 /* Representable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4AAA98B86DB52752575702126687B961 /* Representable.swift */; }; + 935FCE7FF349638993AD03841F758BCE /* TypedArrayRepresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5E12FAA1098DEAB790586669321BDED3 /* TypedArrayRepresentation.swift */; }; + 94BF39AD92020A13F76B65155456C171 /* RepresentationKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 866268525BEF2C15C2AB2CD471F4A8A3 /* RepresentationKit.framework */; }; + 95DD9B985CFE1DA70F13FAB1295CBBD3 /* UIViewPosition.swift in Sources */ = {isa = PBXBuildFile; fileRef = C1B5FA6E10232981B0406F22DAC7D95B /* UIViewPosition.swift */; }; + 97C2BE41B7785CCE5D50D73DA96CAB27 /* RepresentationKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7F78B318B3C5ADB09EEF8C833AEAF81E /* RepresentationKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 98F887D293F5D17A60709FBFF25839C3 /* VisualContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60AF6ED88ABC4AFB777C37C736FDFB8B /* VisualContent.swift */; }; + 993F7C09031D8985F04E4CAF6199DE92 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24E1335958698A6FFB51A9DDFC964243 /* Foundation.framework */; }; + 9C0985548D282D4C7314A6381F8F57B7 /* Content.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5037CFC1285E1D80958623CEDC7A4D3 /* Content.swift */; }; + 9FBA8CEE678A05DB276DC93CB9D70A52 /* Ents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EC3CA42BD4F9A419769BF193E9AB8237 /* Ents.framework */; }; + A0E7301574B943E681C7448BCD406DA9 /* NonEmptyArray.swift in Sources */ = {isa = PBXBuildFile; fileRef = F64F206B996292BB9CA990A9605BDC64 /* NonEmptyArray.swift */; }; + A422C054C25F126801A134A2862352BE /* VoidAudio.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37F4204CBF8DAD75EDD797AE8E2A992C /* VoidAudio.swift */; }; + A6F819BD4B9E2F746C9859FEBC2CE15F /* UIViewExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5F9D50860FB2207A9598DBFFFDA42409 /* UIViewExtensions.swift */; }; + A8193541D668B2B06FB5328C607E8D04 /* Alarm.swift in Sources */ = {isa = PBXBuildFile; fileRef = C4409C89AED3B0ED35281CE0D43DF993 /* Alarm.swift */; }; + AA5497E212133BBF4816661C012A9618 /* Ents.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EC3CA42BD4F9A419769BF193E9AB8237 /* Ents.framework */; }; + AE1B4274830166D09BD8790C0A6FD609 /* TypedArrayRepresentationBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = A81493B132D8F8B11DF71D2A3994748F /* TypedArrayRepresentationBuilder.swift */; }; + B224E9E0CE9C2147DE9CA9756A0C356D /* TextualContentRepresentationBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 83A9A05426B5F922280B0A5E167737A5 /* TextualContentRepresentationBuilder.swift */; }; + B4FE9491C72BD62762726156BE5EC36B /* TextualRepresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45F830406508AC74295FD29A12D550CF /* TextualRepresentation.swift */; }; + B93EE3A128A1C6818044C7B9F3B2549D /* SequenceExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C8164556670411A67840281EBFFF4164 /* SequenceExtensions.swift */; }; + B9A34A20C5A6077D2F7E740090DB24CD /* IDValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = B5474EC89EA5CDD133EA16AA20D9FF8D /* IDValue.swift */; }; + BCB2FDE44B3FDDA4CA7C1BEEE835C859 /* Value.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5180235D352C227048F6ED1C9C579620 /* Value.swift */; }; + BD133E4B269EF7DF903192510D570F5C /* CGRectExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70D19517CFDF96F196FCD45E6211BC67 /* CGRectExtensions.swift */; }; + BF498E46066C0232EE3CE2ADCFA7A0F8 /* BoolExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 27EC3FA0192E3748BC0C64EEFF91B1A7 /* BoolExtensions.swift */; }; + C18201DF90AE2593594100A2ED65E3F5 /* ArrayRepresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC48F81BC0AAC2FA9A0B0A38D6B70B19 /* ArrayRepresentation.swift */; }; + C3DE6C2BC9CD9304DE47FB360EDA5653 /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = 714602AA31BFB3C43C7A243DFAA31AF5 /* Image.swift */; }; + C895F96F2E72F699A2995059AAE58720 /* IntegerExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4ED07BC8866FF5D94A536ACF5DFB5930 /* IntegerExtensions.swift */; }; + CA8FBB8EA9110525E090D4F11D808642 /* InMemoryLog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07C3938516A22443F1A0E7B7BB098307 /* InMemoryLog.swift */; }; + CC33C11E8DD53002FF8149F261F3DA90 /* ContentKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FF2CBA25895BDA6D268CDB902720B054 /* ContentKit.framework */; }; + CCFC79DD700526751E247692580B1EED /* FloatingPointExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = B1841808FF00F197643DEE7D36C5283F /* FloatingPointExtensions.swift */; }; + CF246804BD88D122DA669923AD361543 /* ContentKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = AB8DD3E655596E8BD51F8D0C0A49C0C6 /* ContentKit-dummy.m */; }; + CFF5A424FF39FC9E93E305E7A83CEFC1 /* NoImplicitAnimationBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE713C5159B9E029F9150FE1050FB01D /* NoImplicitAnimationBlock.swift */; }; + D2AD536447E611EF24B930CCD05D7B9E /* Pods-LogKit_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 456AC8A4CA136A2FC8F0630F72F608BB /* Pods-LogKit_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + D325F4D7D07F6B88133DA7CDD62DF147 /* DictionaryRepresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = D74CE5B7ED957A76C2C5BFB7E324E41D /* DictionaryRepresentation.swift */; }; + D4A631B86169795A9F3D972A26B68960 /* Audio.swift in Sources */ = {isa = PBXBuildFile; fileRef = CFF25D7144A45D654D7C4F22E1957B38 /* Audio.swift */; }; + D824CA9646B621A2F8751D6EE1F39077 /* TimedBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4244737726F921B302D32C056C105597 /* TimedBlock.swift */; }; + DB5A6A34B9B2D0A341AB32BE0DA206E2 /* DynamicallyDisablingAudio.swift in Sources */ = {isa = PBXBuildFile; fileRef = A28A958F1D6B7472191522166BAE72B6 /* DynamicallyDisablingAudio.swift */; }; + DBD9334A0F8E478652926B5901F687EE /* List.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9E781EB1726AED1B642533CDD8A040B /* List.swift */; }; + E11ED8842EEEE5862C0A174C7EBBC765 /* DebugReleaseBlock.swift in Sources */ = {isa = PBXBuildFile; fileRef = FA53F7FC1734CFCA0B02CCAC4847F4B2 /* DebugReleaseBlock.swift */; }; + E4095C9451E9347FE83B1DF04C385468 /* RangeReplaceableCollectionExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18B51CD3C18AE686ACA3D4C35C08D454 /* RangeReplaceableCollectionExtensions.swift */; }; + E770824511705456A4110FE8FE5715A4 /* Ents-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B661AE303C39A6D207BFC05E74F18E5 /* Ents-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + E7F067F278E125E53FD98249CFE6513D /* DictionaryExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B6954C92E18BA405358ABAD3D786D6D /* DictionaryExtensions.swift */; }; + E893BB978CABF76BF3D7666AA15A4DDA /* Ents-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = CA8B50B72A308AB8F11DB3AC8935382F /* Ents-dummy.m */; }; + EC82ACE54FA695D0071A84E0CAB47474 /* CALayerExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F45BE91D32F2881D80238767EB340AC /* CALayerExtensions.swift */; }; + EFD9453CA01C79DD3065E4F26C2C040E /* Identity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 23C3E8CCEB3F6C68B7C28B647E7502DE /* Identity.swift */; }; + F10C7C23C2EB32C9F738E9DA420BC13A /* CachedImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45FF3ED70A3B41057E1BA5B5AF237CE8 /* CachedImage.swift */; }; + F5E0C38A99D9104A8A3D6CE94059E0BA /* Representation.swift in Sources */ = {isa = PBXBuildFile; fileRef = EAB7AC54D3EAD6E3DABA5A8770E45765 /* Representation.swift */; }; + F7C799409DCBA2CC46218D468E4E41EF /* Types.swift in Sources */ = {isa = PBXBuildFile; fileRef = 129D50CB208AAA3DE1D227B89018E4C9 /* Types.swift */; }; + F7EDA3C695A1115F54CC49E40AE8013A /* RepresentationKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 866268525BEF2C15C2AB2CD471F4A8A3 /* RepresentationKit.framework */; }; + F985E109FA27CA0850B42D1EE10AF838 /* Copying.swift in Sources */ = {isa = PBXBuildFile; fileRef = B568F30039C5EE44FA0145A764EDEB5F /* Copying.swift */; }; + FBB7BE92EC6DAD51AE62C9C0070EF1B6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24E1335958698A6FFB51A9DDFC964243 /* Foundation.framework */; }; + FC31FA424EF09142430B004FC9CB97AB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 24E1335958698A6FFB51A9DDFC964243 /* Foundation.framework */; }; + FCE69DBBA063F31965E91CC6195110F4 /* TimeExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D79E625B0FAAD2DFE42B2120FD01CC /* TimeExtensions.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 4E9E14FCEF62FCCC8E79868CAC681E4F /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 60FAB5B7F68D197BE65725FFBEC62C2E; + remoteInfo = Ents; + }; + 50088A72BAAFEDA8850AB5729C7485DB /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0956DD9334A7C3D9412367868BF95F3C; + remoteInfo = ContentKit; + }; + 7E62E20823DD9778BA35E272EBA5AD08 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 1F5FDFCEE2BEB4C22C7F534CED1321F4; + remoteInfo = LogKit; + }; + 896743E271F99B404FFFED2F9B235FF6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = E375D352808E657B7F12580FC767EF6E; + remoteInfo = RepresentationKit; + }; + A01CDA1BEB7A9F1B2A60EA9F57119882 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0956DD9334A7C3D9412367868BF95F3C; + remoteInfo = ContentKit; + }; + C99B242E2813CA74CE9408D3CDCCEFF2 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = E375D352808E657B7F12580FC767EF6E; + remoteInfo = RepresentationKit; + }; + CD826309F8AB9FBB6CBF09DCE92B8677 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 60FAB5B7F68D197BE65725FFBEC62C2E; + remoteInfo = Ents; + }; + D82F0C496C7B39E53B9B020B3965091E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = E375D352808E657B7F12580FC767EF6E; + remoteInfo = RepresentationKit; + }; + DC07E248F7ECE3C16934D6E37EA78F50 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = D41D8CD98F00B204E9800998ECF8427E /* Project object */; + proxyType = 1; + remoteGlobalIDString = 60FAB5B7F68D197BE65725FFBEC62C2E; + remoteInfo = Ents; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + 03D6123DBBC13EE1A156897FCD1B5467 /* CGAffineTransformExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CGAffineTransformExtensions.swift; path = Ents/Classes/extensions/geometry/CGAffineTransformExtensions.swift; sourceTree = ""; }; + 066619DD3ED38134ED1946AC8537EE29 /* TextualContentKey.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextualContentKey.swift; path = ContentKit/Classes/textual/TextualContentKey.swift; sourceTree = ""; }; + 07C3938516A22443F1A0E7B7BB098307 /* InMemoryLog.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = InMemoryLog.swift; sourceTree = ""; }; + 07FF0C1049D1C6B60EBE84CE7EC1E5BF /* RepresentationKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = RepresentationKit.modulemap; sourceTree = ""; }; + 08BD1E28C09423E390EBBCFB5FDAFB72 /* Pods-LogKit_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-LogKit_Tests-acknowledgements.markdown"; sourceTree = ""; }; + 09EC24BC215211F302BB233781D9670C /* Text.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Text.swift; path = ContentKit/Classes/textual/Text.swift; sourceTree = ""; }; + 09F5A2ADF104306540E1E3EB3B3D3604 /* CollectionExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CollectionExtensions.swift; path = RepresentationKit/Classes/extensions/CollectionExtensions.swift; sourceTree = ""; }; + 0A260C63E746C1E731323F8A2CD9242F /* RandomAccessCollectionExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RandomAccessCollectionExtensions.swift; path = Ents/Classes/extensions/collections/RandomAccessCollectionExtensions.swift; sourceTree = ""; }; + 0E95753714B840DEE4EA9E555E395C3A /* Queue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Queue.swift; path = Ents/Classes/types/collections/Queue.swift; sourceTree = ""; }; + 0FD21554CB1D024CAB63A4C38DFADE16 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 1086DFEC0126A55D735AE187A5FE4EF4 /* CGFloatExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CGFloatExtensions.swift; path = Ents/Classes/extensions/geometry/CGFloatExtensions.swift; sourceTree = ""; }; + 109306773E3354EDEC8DE8B4C8B8AD08 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 109504373DE9515CA2901645FD2A6A80 /* LogKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = LogKit.modulemap; sourceTree = ""; }; + 1095F0F47D1C16758B352EA734847EE5 /* Pods-LogKit_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-LogKit_Tests-dummy.m"; sourceTree = ""; }; + 129D50CB208AAA3DE1D227B89018E4C9 /* Types.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Types.swift; path = ContentKit/Classes/Types.swift; sourceTree = ""; }; + 159B36DB3F9374DD7CDDEC163711B53E /* LogKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "LogKit-dummy.m"; sourceTree = ""; }; + 169C240860C5027AC7A8C03AC8EA9D6D /* CATransform3DExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CATransform3DExtensions.swift; path = Ents/Classes/extensions/geometry/CATransform3DExtensions.swift; sourceTree = ""; }; + 18B51CD3C18AE686ACA3D4C35C08D454 /* RangeReplaceableCollectionExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = RangeReplaceableCollectionExtensions.swift; path = Ents/Classes/extensions/collections/RangeReplaceableCollectionExtensions.swift; sourceTree = ""; }; + 19A2AE45EF0E4C44ED43282C62056374 /* CGPointExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CGPointExtensions.swift; path = Ents/Classes/extensions/geometry/CGPointExtensions.swift; sourceTree = ""; }; + 1DF60175E700AB38A4FA53925CC3F7F5 /* ScaledImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ScaledImage.swift; path = ContentKit/Classes/visual/ScaledImage.swift; sourceTree = ""; }; + 1F45BE91D32F2881D80238767EB340AC /* CALayerExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CALayerExtensions.swift; path = Ents/Classes/extensions/geometry/CALayerExtensions.swift; sourceTree = ""; }; + 2244D3784310A951BB52AEF89546E6B8 /* ContentKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = ContentKit.framework; path = ContentKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 231D84B39C432DAD075594F48D7EC3A2 /* Lazy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Lazy.swift; path = Ents/Classes/utils/Lazy.swift; sourceTree = ""; }; + 23A81E75D80A3203CCB29B1680178F9D /* LogKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = LogKit.xcconfig; sourceTree = ""; }; + 23C3E8CCEB3F6C68B7C28B647E7502DE /* Identity.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Identity.swift; path = RepresentationKit/Classes/Representations/Identity.swift; sourceTree = ""; }; + 24E1335958698A6FFB51A9DDFC964243 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.3.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 2774EE8574BCB2945D00345E24491DF7 /* OptionalExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OptionalExtensions.swift; path = Ents/Classes/extensions/types/OptionalExtensions.swift; sourceTree = ""; }; + 27E6F0C213EA1E99F80B90850226A487 /* Ents-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Ents-prefix.pch"; sourceTree = ""; }; + 27EC3FA0192E3748BC0C64EEFF91B1A7 /* BoolExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BoolExtensions.swift; path = Ents/Classes/extensions/types/BoolExtensions.swift; sourceTree = ""; }; + 2C10859A19E37E50B2A0AC6B6B829753 /* UniqueCollection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UniqueCollection.swift; path = Ents/Classes/types/collections/UniqueCollection.swift; sourceTree = ""; }; + 2D10C47C17CC68AB59F2C9D7485B59E5 /* JSONRepresentationBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONRepresentationBuilder.swift; path = RepresentationKit/Classes/Builders/JSONRepresentationBuilder.swift; sourceTree = ""; }; + 2D352F66A930BDB6B9E6175C82F98A97 /* Ents.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Ents.framework; path = Ents.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 32D27D656177C950E02992F19E023684 /* DeepArrayRepresentationBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DeepArrayRepresentationBuilder.swift; path = RepresentationKit/Classes/Builders/DeepArrayRepresentationBuilder.swift; sourceTree = ""; }; + 3318EF5B04E64E5E20424F55A7F42CDB /* Pods-LogKit_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-LogKit_Tests.release.xcconfig"; sourceTree = ""; }; + 37F4204CBF8DAD75EDD797AE8E2A992C /* VoidAudio.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VoidAudio.swift; path = ContentKit/Classes/audible/VoidAudio.swift; sourceTree = ""; }; + 3878548365934BA474283B242F53253E /* RepresentationKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = RepresentationKit.framework; path = RepresentationKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B661AE303C39A6D207BFC05E74F18E5 /* Ents-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Ents-umbrella.h"; sourceTree = ""; }; + 3EA38264E4B55235E274A4D233D3275B /* AverageCollection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AverageCollection.swift; path = Ents/Classes/types/collections/AverageCollection.swift; sourceTree = ""; }; + 4244737726F921B302D32C056C105597 /* TimedBlock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TimedBlock.swift; path = Ents/Classes/utils/TimedBlock.swift; sourceTree = ""; }; + 456AC8A4CA136A2FC8F0630F72F608BB /* Pods-LogKit_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-LogKit_Tests-umbrella.h"; sourceTree = ""; }; + 45F830406508AC74295FD29A12D550CF /* TextualRepresentation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextualRepresentation.swift; path = ContentKit/Classes/textual/TextualRepresentation.swift; sourceTree = ""; }; + 45FF3ED70A3B41057E1BA5B5AF237CE8 /* CachedImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CachedImage.swift; path = ContentKit/Classes/visual/CachedImage.swift; sourceTree = ""; }; + 48A34368D6F7A6D6024880EE4A63B352 /* LogKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = LogKit.framework; path = LogKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 4A0821E427D67A71F16795D7AC9A453A /* RepresentationKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = RepresentationKit.xcconfig; sourceTree = ""; }; + 4AAA98B86DB52752575702126687B961 /* Representable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Representable.swift; path = RepresentationKit/Classes/Protocols/Representable.swift; sourceTree = ""; }; + 4B6954C92E18BA405358ABAD3D786D6D /* DictionaryExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DictionaryExtensions.swift; path = Ents/Classes/extensions/collections/DictionaryExtensions.swift; sourceTree = ""; }; + 4ED07BC8866FF5D94A536ACF5DFB5930 /* IntegerExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IntegerExtensions.swift; path = Ents/Classes/extensions/types/numbers/IntegerExtensions.swift; sourceTree = ""; }; + 4F59EA93F00E45A0A8E5F604DD1AEB39 /* AudibleContent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AudibleContent.swift; path = ContentKit/Classes/audible/AudibleContent.swift; sourceTree = ""; }; + 512D07A15981B7FD0693F210842EC4E2 /* ContentKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = ContentKit.modulemap; sourceTree = ""; }; + 513B93B9EA97807CFED63285CB78AC97 /* DisplayLinkBlock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DisplayLinkBlock.swift; path = Ents/Classes/utils/DisplayLinkBlock.swift; sourceTree = ""; }; + 5180235D352C227048F6ED1C9C579620 /* Value.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Value.swift; path = Ents/Classes/utils/Value.swift; sourceTree = ""; }; + 535A51EAFC1802F2131F8CF3BF71C064 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 53D79E625B0FAAD2DFE42B2120FD01CC /* TimeExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TimeExtensions.swift; path = Ents/Classes/extensions/TimeExtensions.swift; sourceTree = ""; }; + 55F6811D8B7207FA0EAD4C4BEDB0E82C /* Pods-LogKit_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = "Pods-LogKit_Tests.modulemap"; sourceTree = ""; }; + 5E12FAA1098DEAB790586669321BDED3 /* TypedArrayRepresentation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TypedArrayRepresentation.swift; path = RepresentationKit/Classes/Representations/TypedArrayRepresentation.swift; sourceTree = ""; }; + 5F9D50860FB2207A9598DBFFFDA42409 /* UIViewExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIViewExtensions.swift; path = Ents/Classes/extensions/geometry/UIViewExtensions.swift; sourceTree = ""; }; + 60AF6ED88ABC4AFB777C37C736FDFB8B /* VisualContent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = VisualContent.swift; path = ContentKit/Classes/visual/VisualContent.swift; sourceTree = ""; }; + 61F17C88C347A791B396A7E6E1A2B886 /* Pods-LogKit_Tests-resources.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-LogKit_Tests-resources.sh"; sourceTree = ""; }; + 680C21CCC7AF00D6C3F116751C986A4A /* Sorting.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Sorting.swift; path = Ents/Classes/extensions/collections/Sorting.swift; sourceTree = ""; }; + 6F3B160D34BEF29511A1D27A8FB9E714 /* Pods-LogKit_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-LogKit_Tests.debug.xcconfig"; sourceTree = ""; }; + 702B7F2A20EC3154C2C6318FC731E43F /* BinaryFloatingPointExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BinaryFloatingPointExtensions.swift; path = Ents/Classes/extensions/types/numbers/BinaryFloatingPointExtensions.swift; sourceTree = ""; }; + 70D19517CFDF96F196FCD45E6211BC67 /* CGRectExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CGRectExtensions.swift; path = Ents/Classes/extensions/geometry/CGRectExtensions.swift; sourceTree = ""; }; + 714602AA31BFB3C43C7A243DFAA31AF5 /* Image.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Image.swift; path = ContentKit/Classes/visual/Image.swift; sourceTree = ""; }; + 78D3149923C3C1989C067837C99F86B5 /* FIFO.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FIFO.swift; path = Ents/Classes/types/collections/FIFO.swift; sourceTree = ""; }; + 79E6D3E4E4C1F97471BD731AB64BA978 /* UIContent.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIContent.swift; path = ContentKit/Classes/visual/UIContent.swift; sourceTree = ""; }; + 79EA6939A3D6B0AEDA0FFB554B3D6DE0 /* SortedCollection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SortedCollection.swift; path = Ents/Classes/types/collections/SortedCollection.swift; sourceTree = ""; }; + 7BEA5B1EDBF502B6F115FB78BCE30BCC /* RepresentationKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "RepresentationKit-dummy.m"; sourceTree = ""; }; + 7C43BDDF1D1A491F51ABFF5853CA3513 /* ReadabilityUtilities.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ReadabilityUtilities.swift; path = Ents/Classes/utils/ReadabilityUtilities.swift; sourceTree = ""; }; + 7F78B318B3C5ADB09EEF8C833AEAF81E /* RepresentationKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RepresentationKit-umbrella.h"; sourceTree = ""; }; + 83A9A05426B5F922280B0A5E167737A5 /* TextualContentRepresentationBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TextualContentRepresentationBuilder.swift; path = ContentKit/Classes/textual/TextualContentRepresentationBuilder.swift; sourceTree = ""; }; + 84660F76717A36F9F6879126EFFA79EF /* Weak.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Weak.swift; path = Ents/Classes/utils/Weak.swift; sourceTree = ""; }; + 866268525BEF2C15C2AB2CD471F4A8A3 /* RepresentationKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RepresentationKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 87387AFA509C651DAEB1CC4B946BAF22 /* LogRepresentation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = LogRepresentation.swift; sourceTree = ""; }; + 875B9C43FDCFD0385868E818076F8548 /* CGSizeExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CGSizeExtensions.swift; path = Ents/Classes/extensions/geometry/CGSizeExtensions.swift; sourceTree = ""; }; + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; + 94BBC0C2F03C2426E6FF9D6983821435 /* CollectionTypeExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CollectionTypeExtensions.swift; path = Ents/Classes/extensions/collections/CollectionTypeExtensions.swift; sourceTree = ""; }; + 98AF873E37C022A992060809888B6738 /* Log.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = Log.swift; sourceTree = ""; }; + A28A958F1D6B7472191522166BAE72B6 /* DynamicallyDisablingAudio.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DynamicallyDisablingAudio.swift; path = ContentKit/Classes/audible/DynamicallyDisablingAudio.swift; sourceTree = ""; }; + A4E4647084579C2A7CAD278B23C0EC49 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + A69097ABCEDF94FA928C678E37E3609F /* LogKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "LogKit-prefix.pch"; sourceTree = ""; }; + A7F9957A1C6B8E46C5269DEC8C422237 /* RepresentationKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "RepresentationKit-prefix.pch"; sourceTree = ""; }; + A81493B132D8F8B11DF71D2A3994748F /* TypedArrayRepresentationBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = TypedArrayRepresentationBuilder.swift; path = RepresentationKit/Classes/Builders/TypedArrayRepresentationBuilder.swift; sourceTree = ""; }; + A94637E5367D22A6FDF0EE1952AE0459 /* LogKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "LogKit-umbrella.h"; sourceTree = ""; }; + A9D19E515CC9BAADB6390D212F065EBF /* Pods-LogKit_Tests-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-LogKit_Tests-frameworks.sh"; sourceTree = ""; }; + AA93C9A33E2A26C2789C2C0516B323A8 /* BidirectionalCollectionExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = BidirectionalCollectionExtensions.swift; path = Ents/Classes/extensions/collections/BidirectionalCollectionExtensions.swift; sourceTree = ""; }; + AB3B6EC56820D21ECE983B5FEEEB839A /* Pods-LogKit_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-LogKit_Tests-acknowledgements.plist"; sourceTree = ""; }; + AB8DD3E655596E8BD51F8D0C0A49C0C6 /* ContentKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ContentKit-dummy.m"; sourceTree = ""; }; + AE204BEF3EAD8237A586468A893D6C50 /* CompileConditionalBlock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = CompileConditionalBlock.swift; path = Ents/Classes/utils/CompileConditionalBlock/CompileConditionalBlock.swift; sourceTree = ""; }; + B0593BE4902CF2D0B717491EBB9D2B91 /* Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B1841808FF00F197643DEE7D36C5283F /* FloatingPointExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FloatingPointExtensions.swift; path = Ents/Classes/extensions/types/numbers/FloatingPointExtensions.swift; sourceTree = ""; }; + B5037CFC1285E1D80958623CEDC7A4D3 /* Content.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Content.swift; path = ContentKit/Classes/content/Content.swift; sourceTree = ""; }; + B5474EC89EA5CDD133EA16AA20D9FF8D /* IDValue.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = IDValue.swift; path = Ents/Classes/utils/IDValue.swift; sourceTree = ""; }; + B568F30039C5EE44FA0145A764EDEB5F /* Copying.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Copying.swift; path = Ents/Classes/utils/Copying.swift; sourceTree = ""; }; + B808DD2B6638EDDC3AC8316C0EACA705 /* SetAlgebraExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SetAlgebraExtensions.swift; path = Ents/Classes/extensions/collections/SetAlgebraExtensions.swift; sourceTree = ""; }; + B991C679799F6863C8B705217B03B698 /* AnyText.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyText.swift; path = ContentKit/Classes/textual/AnyText.swift; sourceTree = ""; }; + B9E781EB1726AED1B642533CDD8A040B /* List.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = List.swift; path = Ents/Classes/types/collections/List.swift; sourceTree = ""; }; + BAEEE6E3C5DEBD266EE2DCF0A8783840 /* Pods_LogKit_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_LogKit_Tests.framework; path = "Pods-LogKit_Tests.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; + C1B5FA6E10232981B0406F22DAC7D95B /* UIViewPosition.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIViewPosition.swift; path = Ents/Classes/extensions/geometry/UIViewPosition.swift; sourceTree = ""; }; + C1BA852F9CB4B2ABD9CA0A711AECA34B /* UIImageExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIImageExtensions.swift; path = ContentKit/Classes/visual/UIImageExtensions.swift; sourceTree = ""; }; + C20948A60653DC475F76FA296F399AF1 /* DictionaryRepresentationBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DictionaryRepresentationBuilder.swift; path = RepresentationKit/Classes/Builders/DictionaryRepresentationBuilder.swift; sourceTree = ""; }; + C3FF5033C468EEB1729E6817D288752F /* OnceAudio.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = OnceAudio.swift; path = ContentKit/Classes/audible/OnceAudio.swift; sourceTree = ""; }; + C4409C89AED3B0ED35281CE0D43DF993 /* Alarm.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alarm.swift; path = Ents/Classes/utils/Alarm.swift; sourceTree = ""; }; + C5614EBC657E1DBCC8D6893DB1B33ED3 /* UIImageViewExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIImageViewExtensions.swift; path = ContentKit/Classes/visual/UIImageViewExtensions.swift; sourceTree = ""; }; + C8164556670411A67840281EBFFF4164 /* SequenceExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SequenceExtensions.swift; path = Ents/Classes/extensions/collections/SequenceExtensions.swift; sourceTree = ""; }; + CA8B50B72A308AB8F11DB3AC8935382F /* Ents-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Ents-dummy.m"; sourceTree = ""; }; + CFF25D7144A45D654D7C4F22E1957B38 /* Audio.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Audio.swift; path = ContentKit/Classes/audible/Audio.swift; sourceTree = ""; }; + D3190A2ACE55D44CFDE3E460F29CB383 /* ContentKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ContentKit-umbrella.h"; sourceTree = ""; }; + D74CE5B7ED957A76C2C5BFB7E324E41D /* DictionaryRepresentation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DictionaryRepresentation.swift; path = RepresentationKit/Classes/Representations/DictionaryRepresentation.swift; sourceTree = ""; }; + D8352B570A82EA0132DA409E67FE6AD3 /* Ents.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Ents.xcconfig; sourceTree = ""; }; + D860A86018B5FCB9D7803CAC35C06086 /* ArrayRepresentationBuilder.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ArrayRepresentationBuilder.swift; path = RepresentationKit/Classes/Builders/ArrayRepresentationBuilder.swift; sourceTree = ""; }; + E17201C20007837D84BD599986B91F25 /* Types.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Types.swift; path = Ents/Classes/utils/Types.swift; sourceTree = ""; }; + E1A0ED481D97024F7D2CCD0B236771F8 /* EnumCollection.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = EnumCollection.swift; path = Ents/Classes/utils/EnumCollection.swift; sourceTree = ""; }; + E1E413795E3ADA368B85036B6C158F81 /* OnDiskLog.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = OnDiskLog.swift; sourceTree = ""; }; + E4B680600EA64951B88B18B03D1BA74C /* ContentKit.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ContentKit.xcconfig; sourceTree = ""; }; + E90FEB205D0F1B80A28DD4C96DAB5DCD /* AnyImage.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyImage.swift; path = ContentKit/Classes/visual/AnyImage.swift; sourceTree = ""; }; + E92A32E650DFD9A75A407D17D1F5352E /* JSONRepresentation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = JSONRepresentation.swift; path = RepresentationKit/Classes/Representations/JSONRepresentation.swift; sourceTree = ""; }; + EAB7AC54D3EAD6E3DABA5A8770E45765 /* Representation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Representation.swift; path = RepresentationKit/Classes/Protocols/Representation.swift; sourceTree = ""; }; + EC3CA42BD4F9A419769BF193E9AB8237 /* Ents.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Ents.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + EC48F81BC0AAC2FA9A0B0A38D6B70B19 /* ArrayRepresentation.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ArrayRepresentation.swift; path = RepresentationKit/Classes/Representations/ArrayRepresentation.swift; sourceTree = ""; }; + EE713C5159B9E029F9150FE1050FB01D /* NoImplicitAnimationBlock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NoImplicitAnimationBlock.swift; path = Ents/Classes/utils/NoImplicitAnimationBlock.swift; sourceTree = ""; }; + F64F206B996292BB9CA990A9605BDC64 /* NonEmptyArray.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = NonEmptyArray.swift; path = Ents/Classes/utils/NonEmptyArray.swift; sourceTree = ""; }; + F67F4AA3BE5D9FA50D9F95E50AD38347 /* Stack.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Stack.swift; path = Ents/Classes/types/collections/Stack.swift; sourceTree = ""; }; + F86893FADEA11F95B91C7DB420CA0FF4 /* Ents.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; path = Ents.modulemap; sourceTree = ""; }; + F92955F87C2AA96FCD732E109620B07F /* AnyAudio.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = AnyAudio.swift; path = ContentKit/Classes/audible/AnyAudio.swift; sourceTree = ""; }; + FA53F7FC1734CFCA0B02CCAC4847F4B2 /* DebugReleaseBlock.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DebugReleaseBlock.swift; path = Ents/Classes/utils/CompileConditionalBlock/DebugReleaseBlock.swift; sourceTree = ""; }; + FDD709C530ABBA607137D21862B9CAAA /* DoubleExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DoubleExtensions.swift; path = Ents/Classes/extensions/types/numbers/DoubleExtensions.swift; sourceTree = ""; }; + FE41FA8A55195422DD4F4AE929DAAB14 /* Chronometer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Chronometer.swift; path = Ents/Classes/utils/Chronometer.swift; sourceTree = ""; }; + FF2CBA25895BDA6D268CDB902720B054 /* ContentKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ContentKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + FF3C899DAC9121E548E40685ECAA9885 /* ContentKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ContentKit-prefix.pch"; sourceTree = ""; }; + FFF77A32FE99289C9864A05AC2166DD0 /* DictionaryExtension.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DictionaryExtension.swift; path = RepresentationKit/Classes/extensions/DictionaryExtension.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 3859373C2FAD28C4AB44A06928A5DB83 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1F108BDDC3EC3B6E91FAA1E86D34DDFB /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 4834E9DA521AB13A41ADB5F229F69908 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 993F7C09031D8985F04E4CAF6199DE92 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 5412AFABBE1CC9951FA721A52F8438CC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + CC33C11E8DD53002FF8149F261F3DA90 /* ContentKit.framework in Frameworks */, + 9FBA8CEE678A05DB276DC93CB9D70A52 /* Ents.framework in Frameworks */, + 6B666192BBFCFEC6872B92C2E9D56CA3 /* Foundation.framework in Frameworks */, + 94BF39AD92020A13F76B65155456C171 /* RepresentationKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D968A107E99FC51DB0ED81351522F72A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + AA5497E212133BBF4816661C012A9618 /* Ents.framework in Frameworks */, + FC31FA424EF09142430B004FC9CB97AB /* Foundation.framework in Frameworks */, + F7EDA3C695A1115F54CC49E40AE8013A /* RepresentationKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DCDBE95FACEF25EB325C7D5C1F379C5A /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + FBB7BE92EC6DAD51AE62C9C0070EF1B6 /* Foundation.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 02CB42273BBFC752CE04AEEB102F8E4C /* Ents */ = { + isa = PBXGroup; + children = ( + C4409C89AED3B0ED35281CE0D43DF993 /* Alarm.swift */, + 3EA38264E4B55235E274A4D233D3275B /* AverageCollection.swift */, + AA93C9A33E2A26C2789C2C0516B323A8 /* BidirectionalCollectionExtensions.swift */, + 702B7F2A20EC3154C2C6318FC731E43F /* BinaryFloatingPointExtensions.swift */, + 27EC3FA0192E3748BC0C64EEFF91B1A7 /* BoolExtensions.swift */, + 1F45BE91D32F2881D80238767EB340AC /* CALayerExtensions.swift */, + 169C240860C5027AC7A8C03AC8EA9D6D /* CATransform3DExtensions.swift */, + 03D6123DBBC13EE1A156897FCD1B5467 /* CGAffineTransformExtensions.swift */, + 1086DFEC0126A55D735AE187A5FE4EF4 /* CGFloatExtensions.swift */, + 19A2AE45EF0E4C44ED43282C62056374 /* CGPointExtensions.swift */, + 70D19517CFDF96F196FCD45E6211BC67 /* CGRectExtensions.swift */, + 875B9C43FDCFD0385868E818076F8548 /* CGSizeExtensions.swift */, + FE41FA8A55195422DD4F4AE929DAAB14 /* Chronometer.swift */, + 94BBC0C2F03C2426E6FF9D6983821435 /* CollectionTypeExtensions.swift */, + AE204BEF3EAD8237A586468A893D6C50 /* CompileConditionalBlock.swift */, + B568F30039C5EE44FA0145A764EDEB5F /* Copying.swift */, + FA53F7FC1734CFCA0B02CCAC4847F4B2 /* DebugReleaseBlock.swift */, + 4B6954C92E18BA405358ABAD3D786D6D /* DictionaryExtensions.swift */, + 513B93B9EA97807CFED63285CB78AC97 /* DisplayLinkBlock.swift */, + FDD709C530ABBA607137D21862B9CAAA /* DoubleExtensions.swift */, + E1A0ED481D97024F7D2CCD0B236771F8 /* EnumCollection.swift */, + 78D3149923C3C1989C067837C99F86B5 /* FIFO.swift */, + B1841808FF00F197643DEE7D36C5283F /* FloatingPointExtensions.swift */, + B5474EC89EA5CDD133EA16AA20D9FF8D /* IDValue.swift */, + 4ED07BC8866FF5D94A536ACF5DFB5930 /* IntegerExtensions.swift */, + 231D84B39C432DAD075594F48D7EC3A2 /* Lazy.swift */, + B9E781EB1726AED1B642533CDD8A040B /* List.swift */, + EE713C5159B9E029F9150FE1050FB01D /* NoImplicitAnimationBlock.swift */, + F64F206B996292BB9CA990A9605BDC64 /* NonEmptyArray.swift */, + 2774EE8574BCB2945D00345E24491DF7 /* OptionalExtensions.swift */, + 0E95753714B840DEE4EA9E555E395C3A /* Queue.swift */, + 0A260C63E746C1E731323F8A2CD9242F /* RandomAccessCollectionExtensions.swift */, + 18B51CD3C18AE686ACA3D4C35C08D454 /* RangeReplaceableCollectionExtensions.swift */, + 7C43BDDF1D1A491F51ABFF5853CA3513 /* ReadabilityUtilities.swift */, + C8164556670411A67840281EBFFF4164 /* SequenceExtensions.swift */, + B808DD2B6638EDDC3AC8316C0EACA705 /* SetAlgebraExtensions.swift */, + 79EA6939A3D6B0AEDA0FFB554B3D6DE0 /* SortedCollection.swift */, + 680C21CCC7AF00D6C3F116751C986A4A /* Sorting.swift */, + F67F4AA3BE5D9FA50D9F95E50AD38347 /* Stack.swift */, + 4244737726F921B302D32C056C105597 /* TimedBlock.swift */, + 53D79E625B0FAAD2DFE42B2120FD01CC /* TimeExtensions.swift */, + E17201C20007837D84BD599986B91F25 /* Types.swift */, + 5F9D50860FB2207A9598DBFFFDA42409 /* UIViewExtensions.swift */, + C1B5FA6E10232981B0406F22DAC7D95B /* UIViewPosition.swift */, + 2C10859A19E37E50B2A0AC6B6B829753 /* UniqueCollection.swift */, + 5180235D352C227048F6ED1C9C579620 /* Value.swift */, + 84660F76717A36F9F6879126EFFA79EF /* Weak.swift */, + 9988CDBCCA53523E784EA412A366C46B /* Support Files */, + ); + name = Ents; + path = Ents; + sourceTree = ""; + }; + 030C4AF6C409E3821EEB959DBF5F38F4 /* LogKit */ = { + isa = PBXGroup; + children = ( + 2F8BAA4AC227E8D12950F94E83FA9168 /* Classes */, + ); + name = LogKit; + path = LogKit; + sourceTree = ""; + }; + 07620A44050C4C6A2A6F5A501915751F /* Development Pods */ = { + isa = PBXGroup; + children = ( + E2733EABEAA52B7D085CA62E9B9E4173 /* LogKit */, + ); + name = "Development Pods"; + sourceTree = ""; + }; + 2F27920412F4510A653DF32333C106B6 /* iOS */ = { + isa = PBXGroup; + children = ( + 24E1335958698A6FFB51A9DDFC964243 /* Foundation.framework */, + ); + name = iOS; + sourceTree = ""; + }; + 2F8BAA4AC227E8D12950F94E83FA9168 /* Classes */ = { + isa = PBXGroup; + children = ( + 07C3938516A22443F1A0E7B7BB098307 /* InMemoryLog.swift */, + 98AF873E37C022A992060809888B6738 /* Log.swift */, + 87387AFA509C651DAEB1CC4B946BAF22 /* LogRepresentation.swift */, + E1E413795E3ADA368B85036B6C158F81 /* OnDiskLog.swift */, + ); + name = Classes; + path = Classes; + sourceTree = ""; + }; + 51C3F322DA69DA5C6EB16188E3A6FAA2 /* ContentKit */ = { + isa = PBXGroup; + children = ( + F92955F87C2AA96FCD732E109620B07F /* AnyAudio.swift */, + E90FEB205D0F1B80A28DD4C96DAB5DCD /* AnyImage.swift */, + B991C679799F6863C8B705217B03B698 /* AnyText.swift */, + 4F59EA93F00E45A0A8E5F604DD1AEB39 /* AudibleContent.swift */, + CFF25D7144A45D654D7C4F22E1957B38 /* Audio.swift */, + 45FF3ED70A3B41057E1BA5B5AF237CE8 /* CachedImage.swift */, + B5037CFC1285E1D80958623CEDC7A4D3 /* Content.swift */, + A28A958F1D6B7472191522166BAE72B6 /* DynamicallyDisablingAudio.swift */, + 714602AA31BFB3C43C7A243DFAA31AF5 /* Image.swift */, + C3FF5033C468EEB1729E6817D288752F /* OnceAudio.swift */, + 1DF60175E700AB38A4FA53925CC3F7F5 /* ScaledImage.swift */, + 09EC24BC215211F302BB233781D9670C /* Text.swift */, + 066619DD3ED38134ED1946AC8537EE29 /* TextualContentKey.swift */, + 83A9A05426B5F922280B0A5E167737A5 /* TextualContentRepresentationBuilder.swift */, + 45F830406508AC74295FD29A12D550CF /* TextualRepresentation.swift */, + 129D50CB208AAA3DE1D227B89018E4C9 /* Types.swift */, + 79E6D3E4E4C1F97471BD731AB64BA978 /* UIContent.swift */, + C1BA852F9CB4B2ABD9CA0A711AECA34B /* UIImageExtensions.swift */, + C5614EBC657E1DBCC8D6893DB1B33ED3 /* UIImageViewExtensions.swift */, + 60AF6ED88ABC4AFB777C37C736FDFB8B /* VisualContent.swift */, + 37F4204CBF8DAD75EDD797AE8E2A992C /* VoidAudio.swift */, + A721DB02744A49A5D22EA3DDA548944A /* Support Files */, + ); + name = ContentKit; + path = ContentKit; + sourceTree = ""; + }; + 6D1C81F79EC016A5E9F7504724F9F422 /* Frameworks */ = { + isa = PBXGroup; + children = ( + FF2CBA25895BDA6D268CDB902720B054 /* ContentKit.framework */, + EC3CA42BD4F9A419769BF193E9AB8237 /* Ents.framework */, + 866268525BEF2C15C2AB2CD471F4A8A3 /* RepresentationKit.framework */, + 2F27920412F4510A653DF32333C106B6 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + 753B5449FC2AB2B6EBC8FF03F376ABCF /* Pods-LogKit_Tests */ = { + isa = PBXGroup; + children = ( + 0FD21554CB1D024CAB63A4C38DFADE16 /* Info.plist */, + 55F6811D8B7207FA0EAD4C4BEDB0E82C /* Pods-LogKit_Tests.modulemap */, + 08BD1E28C09423E390EBBCFB5FDAFB72 /* Pods-LogKit_Tests-acknowledgements.markdown */, + AB3B6EC56820D21ECE983B5FEEEB839A /* Pods-LogKit_Tests-acknowledgements.plist */, + 1095F0F47D1C16758B352EA734847EE5 /* Pods-LogKit_Tests-dummy.m */, + A9D19E515CC9BAADB6390D212F065EBF /* Pods-LogKit_Tests-frameworks.sh */, + 61F17C88C347A791B396A7E6E1A2B886 /* Pods-LogKit_Tests-resources.sh */, + 456AC8A4CA136A2FC8F0630F72F608BB /* Pods-LogKit_Tests-umbrella.h */, + 6F3B160D34BEF29511A1D27A8FB9E714 /* Pods-LogKit_Tests.debug.xcconfig */, + 3318EF5B04E64E5E20424F55A7F42CDB /* Pods-LogKit_Tests.release.xcconfig */, + ); + name = "Pods-LogKit_Tests"; + path = "Target Support Files/Pods-LogKit_Tests"; + sourceTree = ""; + }; + 7DB346D0F39D3F0E887471402A8071AB = { + isa = PBXGroup; + children = ( + 93A4A3777CF96A4AAC1D13BA6DCCEA73 /* Podfile */, + 07620A44050C4C6A2A6F5A501915751F /* Development Pods */, + 6D1C81F79EC016A5E9F7504724F9F422 /* Frameworks */, + FF3224FB367AA8EE59F4404FCED54310 /* Pods */, + 8710F0ED62BB6F45E2B879926B556735 /* Products */, + 8C2E6A133C4212A76795DDE2A2AC347D /* Targets Support Files */, + ); + sourceTree = ""; + }; + 8655A26A9C49AD9A831D1EB991C92115 /* Support Files */ = { + isa = PBXGroup; + children = ( + 109306773E3354EDEC8DE8B4C8B8AD08 /* Info.plist */, + 109504373DE9515CA2901645FD2A6A80 /* LogKit.modulemap */, + 23A81E75D80A3203CCB29B1680178F9D /* LogKit.xcconfig */, + 159B36DB3F9374DD7CDDEC163711B53E /* LogKit-dummy.m */, + A69097ABCEDF94FA928C678E37E3609F /* LogKit-prefix.pch */, + A94637E5367D22A6FDF0EE1952AE0459 /* LogKit-umbrella.h */, + ); + name = "Support Files"; + path = "Example/Pods/Target Support Files/LogKit"; + sourceTree = ""; + }; + 8710F0ED62BB6F45E2B879926B556735 /* Products */ = { + isa = PBXGroup; + children = ( + 2244D3784310A951BB52AEF89546E6B8 /* ContentKit.framework */, + 2D352F66A930BDB6B9E6175C82F98A97 /* Ents.framework */, + 48A34368D6F7A6D6024880EE4A63B352 /* LogKit.framework */, + BAEEE6E3C5DEBD266EE2DCF0A8783840 /* Pods_LogKit_Tests.framework */, + 3878548365934BA474283B242F53253E /* RepresentationKit.framework */, + ); + name = Products; + sourceTree = ""; + }; + 8C2E6A133C4212A76795DDE2A2AC347D /* Targets Support Files */ = { + isa = PBXGroup; + children = ( + 753B5449FC2AB2B6EBC8FF03F376ABCF /* Pods-LogKit_Tests */, + ); + name = "Targets Support Files"; + sourceTree = ""; + }; + 9988CDBCCA53523E784EA412A366C46B /* Support Files */ = { + isa = PBXGroup; + children = ( + F86893FADEA11F95B91C7DB420CA0FF4 /* Ents.modulemap */, + D8352B570A82EA0132DA409E67FE6AD3 /* Ents.xcconfig */, + CA8B50B72A308AB8F11DB3AC8935382F /* Ents-dummy.m */, + 27E6F0C213EA1E99F80B90850226A487 /* Ents-prefix.pch */, + 3B661AE303C39A6D207BFC05E74F18E5 /* Ents-umbrella.h */, + 535A51EAFC1802F2131F8CF3BF71C064 /* Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/Ents"; + sourceTree = ""; + }; + A721DB02744A49A5D22EA3DDA548944A /* Support Files */ = { + isa = PBXGroup; + children = ( + 512D07A15981B7FD0693F210842EC4E2 /* ContentKit.modulemap */, + E4B680600EA64951B88B18B03D1BA74C /* ContentKit.xcconfig */, + AB8DD3E655596E8BD51F8D0C0A49C0C6 /* ContentKit-dummy.m */, + FF3C899DAC9121E548E40685ECAA9885 /* ContentKit-prefix.pch */, + D3190A2ACE55D44CFDE3E460F29CB383 /* ContentKit-umbrella.h */, + A4E4647084579C2A7CAD278B23C0EC49 /* Info.plist */, + ); + name = "Support Files"; + path = "../Target Support Files/ContentKit"; + sourceTree = ""; + }; + B557CE23FFAABE96CA1D4292404179B5 /* RepresentationKit */ = { + isa = PBXGroup; + children = ( + EC48F81BC0AAC2FA9A0B0A38D6B70B19 /* ArrayRepresentation.swift */, + D860A86018B5FCB9D7803CAC35C06086 /* ArrayRepresentationBuilder.swift */, + 09F5A2ADF104306540E1E3EB3B3D3604 /* CollectionExtensions.swift */, + 32D27D656177C950E02992F19E023684 /* DeepArrayRepresentationBuilder.swift */, + FFF77A32FE99289C9864A05AC2166DD0 /* DictionaryExtension.swift */, + D74CE5B7ED957A76C2C5BFB7E324E41D /* DictionaryRepresentation.swift */, + C20948A60653DC475F76FA296F399AF1 /* DictionaryRepresentationBuilder.swift */, + 23C3E8CCEB3F6C68B7C28B647E7502DE /* Identity.swift */, + E92A32E650DFD9A75A407D17D1F5352E /* JSONRepresentation.swift */, + 2D10C47C17CC68AB59F2C9D7485B59E5 /* JSONRepresentationBuilder.swift */, + 4AAA98B86DB52752575702126687B961 /* Representable.swift */, + EAB7AC54D3EAD6E3DABA5A8770E45765 /* Representation.swift */, + 5E12FAA1098DEAB790586669321BDED3 /* TypedArrayRepresentation.swift */, + A81493B132D8F8B11DF71D2A3994748F /* TypedArrayRepresentationBuilder.swift */, + EBDE4CC47E7EC92952D9020F71FADCF6 /* Support Files */, + ); + name = RepresentationKit; + path = RepresentationKit; + sourceTree = ""; + }; + E2733EABEAA52B7D085CA62E9B9E4173 /* LogKit */ = { + isa = PBXGroup; + children = ( + 030C4AF6C409E3821EEB959DBF5F38F4 /* LogKit */, + 8655A26A9C49AD9A831D1EB991C92115 /* Support Files */, + ); + name = LogKit; + path = ../..; + sourceTree = ""; + }; + EBDE4CC47E7EC92952D9020F71FADCF6 /* Support Files */ = { + isa = PBXGroup; + children = ( + B0593BE4902CF2D0B717491EBB9D2B91 /* Info.plist */, + 07FF0C1049D1C6B60EBE84CE7EC1E5BF /* RepresentationKit.modulemap */, + 4A0821E427D67A71F16795D7AC9A453A /* RepresentationKit.xcconfig */, + 7BEA5B1EDBF502B6F115FB78BCE30BCC /* RepresentationKit-dummy.m */, + A7F9957A1C6B8E46C5269DEC8C422237 /* RepresentationKit-prefix.pch */, + 7F78B318B3C5ADB09EEF8C833AEAF81E /* RepresentationKit-umbrella.h */, + ); + name = "Support Files"; + path = "../Target Support Files/RepresentationKit"; + sourceTree = ""; + }; + FF3224FB367AA8EE59F4404FCED54310 /* Pods */ = { + isa = PBXGroup; + children = ( + 51C3F322DA69DA5C6EB16188E3A6FAA2 /* ContentKit */, + 02CB42273BBFC752CE04AEEB102F8E4C /* Ents */, + B557CE23FFAABE96CA1D4292404179B5 /* RepresentationKit */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 17BA0F55E7353BEC1590307E9204EA69 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + E770824511705456A4110FE8FE5715A4 /* Ents-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 7E7D74032C877533EBA49A05A611D859 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + D2AD536447E611EF24B930CCD05D7B9E /* Pods-LogKit_Tests-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CBA2F276CFC1463B9EBADC41EAF786D4 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 3F1665CD7FBFBB382C48F13C40E94709 /* ContentKit-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D4D78E2A2E88DA1CC42EF55E039CF90B /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 533C786E5D1A599362BB906D01F7A49A /* LogKit-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DD1838FDE2EA543B4ECED5ACDA591474 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C2BE41B7785CCE5D50D73DA96CAB27 /* RepresentationKit-umbrella.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 0956DD9334A7C3D9412367868BF95F3C /* ContentKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = CB62C020E957A8DBAAB5F345A052F130 /* Build configuration list for PBXNativeTarget "ContentKit" */; + buildPhases = ( + 855DA9EF83E0CF50F684F57C881FCC73 /* Sources */, + D968A107E99FC51DB0ED81351522F72A /* Frameworks */, + CBA2F276CFC1463B9EBADC41EAF786D4 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 0906CF163C8466FA8135663AC1C078E3 /* PBXTargetDependency */, + B8CF67F929CAD853B5C0C78C532DAA09 /* PBXTargetDependency */, + ); + name = ContentKit; + productName = ContentKit; + productReference = 2244D3784310A951BB52AEF89546E6B8 /* ContentKit.framework */; + productType = "com.apple.product-type.framework"; + }; + 1F5FDFCEE2BEB4C22C7F534CED1321F4 /* LogKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = 495F67D1982D7AAF5F7C5C18B66F3E96 /* Build configuration list for PBXNativeTarget "LogKit" */; + buildPhases = ( + 3EAE158789C1C4E294FF6EFEB66ECF6F /* Sources */, + 5412AFABBE1CC9951FA721A52F8438CC /* Frameworks */, + D4D78E2A2E88DA1CC42EF55E039CF90B /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + 759AD824812F0606C4F22083E078DC2D /* PBXTargetDependency */, + 008C87921534F6A7DC999D9A6AFF7C56 /* PBXTargetDependency */, + DCDE771061D5DD49C48CE8C36371020F /* PBXTargetDependency */, + ); + name = LogKit; + productName = LogKit; + productReference = 48A34368D6F7A6D6024880EE4A63B352 /* LogKit.framework */; + productType = "com.apple.product-type.framework"; + }; + 60FAB5B7F68D197BE65725FFBEC62C2E /* Ents */ = { + isa = PBXNativeTarget; + buildConfigurationList = 9D9050A1AF8EC3272A8E7DFE9EBA6BE3 /* Build configuration list for PBXNativeTarget "Ents" */; + buildPhases = ( + 0EE74E1161E1798EDADF8F6890330D42 /* Sources */, + 4834E9DA521AB13A41ADB5F229F69908 /* Frameworks */, + 17BA0F55E7353BEC1590307E9204EA69 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Ents; + productName = Ents; + productReference = 2D352F66A930BDB6B9E6175C82F98A97 /* Ents.framework */; + productType = "com.apple.product-type.framework"; + }; + 770F1E5F97BA48B1DA3738C2D5DB7D2A /* Pods-LogKit_Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0FD84966490FD62102F54655D88FAF10 /* Build configuration list for PBXNativeTarget "Pods-LogKit_Tests" */; + buildPhases = ( + DDE2642E46D6DD29DC6D35529BADF77E /* Sources */, + 3859373C2FAD28C4AB44A06928A5DB83 /* Frameworks */, + 7E7D74032C877533EBA49A05A611D859 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + C76B599785E2B34D43036F3CA82B09AB /* PBXTargetDependency */, + 638F87F56528ED0DBC8D783DB74160FD /* PBXTargetDependency */, + 7163C1C3237377A68A004505C93685BA /* PBXTargetDependency */, + A45182C4DE858069050180B9430D7043 /* PBXTargetDependency */, + ); + name = "Pods-LogKit_Tests"; + productName = "Pods-LogKit_Tests"; + productReference = BAEEE6E3C5DEBD266EE2DCF0A8783840 /* Pods_LogKit_Tests.framework */; + productType = "com.apple.product-type.framework"; + }; + E375D352808E657B7F12580FC767EF6E /* RepresentationKit */ = { + isa = PBXNativeTarget; + buildConfigurationList = A5E99A17A2F90E9E2B125DFE3BEAC4A2 /* Build configuration list for PBXNativeTarget "RepresentationKit" */; + buildPhases = ( + 892B9C801BE62D2FABF1B495BC38501E /* Sources */, + DCDBE95FACEF25EB325C7D5C1F379C5A /* Frameworks */, + DD1838FDE2EA543B4ECED5ACDA591474 /* Headers */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = RepresentationKit; + productName = RepresentationKit; + productReference = 3878548365934BA474283B242F53253E /* RepresentationKit.framework */; + productType = "com.apple.product-type.framework"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + D41D8CD98F00B204E9800998ECF8427E /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0830; + LastUpgradeCheck = 0700; + }; + buildConfigurationList = 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + ); + mainGroup = 7DB346D0F39D3F0E887471402A8071AB; + productRefGroup = 8710F0ED62BB6F45E2B879926B556735 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 0956DD9334A7C3D9412367868BF95F3C /* ContentKit */, + 60FAB5B7F68D197BE65725FFBEC62C2E /* Ents */, + 1F5FDFCEE2BEB4C22C7F534CED1321F4 /* LogKit */, + 770F1E5F97BA48B1DA3738C2D5DB7D2A /* Pods-LogKit_Tests */, + E375D352808E657B7F12580FC767EF6E /* RepresentationKit */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXSourcesBuildPhase section */ + 0EE74E1161E1798EDADF8F6890330D42 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A8193541D668B2B06FB5328C607E8D04 /* Alarm.swift in Sources */, + 689651C81B9DD8B3F9B94B0ADFFAB223 /* AverageCollection.swift in Sources */, + 829FF8ACECB305965180C1DB3FA3C4E7 /* BidirectionalCollectionExtensions.swift in Sources */, + 1E39EC900BA9DBBC7A920075C472433D /* BinaryFloatingPointExtensions.swift in Sources */, + BF498E46066C0232EE3CE2ADCFA7A0F8 /* BoolExtensions.swift in Sources */, + EC82ACE54FA695D0071A84E0CAB47474 /* CALayerExtensions.swift in Sources */, + 5278364CA91D805A98EC75DBB4D90579 /* CATransform3DExtensions.swift in Sources */, + 589FA60E6ACD8B6243033B551E226428 /* CGAffineTransformExtensions.swift in Sources */, + 391C5C2343BBE538509C9B2D51DFCDDA /* CGFloatExtensions.swift in Sources */, + 645BCEE74DBE854968A39DE39348133B /* CGPointExtensions.swift in Sources */, + BD133E4B269EF7DF903192510D570F5C /* CGRectExtensions.swift in Sources */, + 2B027E8EA5259060A656FDF481B4A42E /* CGSizeExtensions.swift in Sources */, + 460D407A67F5F8F7127F947364ED2C00 /* Chronometer.swift in Sources */, + 4B04193462F640D246D267D34C8DE7C1 /* CollectionTypeExtensions.swift in Sources */, + 8DF0268FE3693A9B3098FA01A2F47A0E /* CompileConditionalBlock.swift in Sources */, + F985E109FA27CA0850B42D1EE10AF838 /* Copying.swift in Sources */, + E11ED8842EEEE5862C0A174C7EBBC765 /* DebugReleaseBlock.swift in Sources */, + E7F067F278E125E53FD98249CFE6513D /* DictionaryExtensions.swift in Sources */, + 22CE2B2B497EA9409744FBFE033B44B2 /* DisplayLinkBlock.swift in Sources */, + 2169EF8E35AE70389EF28078C6FA5515 /* DoubleExtensions.swift in Sources */, + E893BB978CABF76BF3D7666AA15A4DDA /* Ents-dummy.m in Sources */, + 4CFD965510956A251D067A4F70E1F90C /* EnumCollection.swift in Sources */, + 8CCB91F9702939400CBCAD3C3DA4A553 /* FIFO.swift in Sources */, + CCFC79DD700526751E247692580B1EED /* FloatingPointExtensions.swift in Sources */, + B9A34A20C5A6077D2F7E740090DB24CD /* IDValue.swift in Sources */, + C895F96F2E72F699A2995059AAE58720 /* IntegerExtensions.swift in Sources */, + 851E7663EE5A0CE333489A4735E7032B /* Lazy.swift in Sources */, + DBD9334A0F8E478652926B5901F687EE /* List.swift in Sources */, + CFF5A424FF39FC9E93E305E7A83CEFC1 /* NoImplicitAnimationBlock.swift in Sources */, + A0E7301574B943E681C7448BCD406DA9 /* NonEmptyArray.swift in Sources */, + 6B12A84AD9F954973A8506FD385CBC1C /* OptionalExtensions.swift in Sources */, + 65D09E2FD6FF1F746FE766E9ABE2FDC3 /* Queue.swift in Sources */, + 9160052076BB9727A6F8F6F67DF16F1B /* RandomAccessCollectionExtensions.swift in Sources */, + E4095C9451E9347FE83B1DF04C385468 /* RangeReplaceableCollectionExtensions.swift in Sources */, + 13E522F840584DD210A9E57D57D46E0B /* ReadabilityUtilities.swift in Sources */, + B93EE3A128A1C6818044C7B9F3B2549D /* SequenceExtensions.swift in Sources */, + 2E956874F139F4902AD36878B7297B2B /* SetAlgebraExtensions.swift in Sources */, + 3EFD2F345C817CCC25B1133DDF64E727 /* SortedCollection.swift in Sources */, + 5E488C685F4B5EF34F627458BE6768C2 /* Sorting.swift in Sources */, + 31E4DAAC857343DA47D4A9530F777DCD /* Stack.swift in Sources */, + D824CA9646B621A2F8751D6EE1F39077 /* TimedBlock.swift in Sources */, + FCE69DBBA063F31965E91CC6195110F4 /* TimeExtensions.swift in Sources */, + 7B43FCAE0042A9B058893165969D439C /* Types.swift in Sources */, + A6F819BD4B9E2F746C9859FEBC2CE15F /* UIViewExtensions.swift in Sources */, + 95DD9B985CFE1DA70F13FAB1295CBBD3 /* UIViewPosition.swift in Sources */, + 25D9CC692AF18F46C65536A7590AE1F1 /* UniqueCollection.swift in Sources */, + BCB2FDE44B3FDDA4CA7C1BEEE835C859 /* Value.swift in Sources */, + 86C46533F5F4E6A48EF289CC2E6C4BA9 /* Weak.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 3EAE158789C1C4E294FF6EFEB66ECF6F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CA8FBB8EA9110525E090D4F11D808642 /* InMemoryLog.swift in Sources */, + 6E4087BB5327E647C40475B77A5D7349 /* Log.swift in Sources */, + 3484EFC502D077667B30549B42E26471 /* LogKit-dummy.m in Sources */, + 4A585823454DB0E6BCC34A8F3A043050 /* LogRepresentation.swift in Sources */, + 3DCAAAF445C4E69FD69E83BE630BF784 /* OnDiskLog.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 855DA9EF83E0CF50F684F57C881FCC73 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3B0872F8C53A1997A083B777AB05761F /* AnyAudio.swift in Sources */, + 2047244DA5A94FEC6894599EC600AE6E /* AnyImage.swift in Sources */, + 8083A36D569FAD6D455F5AA925AC9379 /* AnyText.swift in Sources */, + 1360C7EBE8B197F536C4BEC5C7FE2BA2 /* AudibleContent.swift in Sources */, + D4A631B86169795A9F3D972A26B68960 /* Audio.swift in Sources */, + F10C7C23C2EB32C9F738E9DA420BC13A /* CachedImage.swift in Sources */, + 9C0985548D282D4C7314A6381F8F57B7 /* Content.swift in Sources */, + CF246804BD88D122DA669923AD361543 /* ContentKit-dummy.m in Sources */, + DB5A6A34B9B2D0A341AB32BE0DA206E2 /* DynamicallyDisablingAudio.swift in Sources */, + C3DE6C2BC9CD9304DE47FB360EDA5653 /* Image.swift in Sources */, + 1008A29C3E570FF4B6456B41205EFB21 /* OnceAudio.swift in Sources */, + 3A1CBCD1FCADBBABAFFFE61107821550 /* ScaledImage.swift in Sources */, + 246DD623B393E21842DDCA4F97724ED5 /* Text.swift in Sources */, + 73902AF2AEFB55918B5A934EEA16E4E7 /* TextualContentKey.swift in Sources */, + B224E9E0CE9C2147DE9CA9756A0C356D /* TextualContentRepresentationBuilder.swift in Sources */, + B4FE9491C72BD62762726156BE5EC36B /* TextualRepresentation.swift in Sources */, + F7C799409DCBA2CC46218D468E4E41EF /* Types.swift in Sources */, + 4A35E78CCACA3C84328C7A134E3D871D /* UIContent.swift in Sources */, + 75DE42078436E17A6AFA720C88BA9901 /* UIImageExtensions.swift in Sources */, + 101D61D57A3ABA54DA5ADFBC94EEE070 /* UIImageViewExtensions.swift in Sources */, + 98F887D293F5D17A60709FBFF25839C3 /* VisualContent.swift in Sources */, + A422C054C25F126801A134A2862352BE /* VoidAudio.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 892B9C801BE62D2FABF1B495BC38501E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C18201DF90AE2593594100A2ED65E3F5 /* ArrayRepresentation.swift in Sources */, + 8B53DFCD39BF0FB1078EF46EB591A860 /* ArrayRepresentationBuilder.swift in Sources */, + 56C4D008C1753A16EB28C5E5C56725A6 /* CollectionExtensions.swift in Sources */, + 2DDA59CF2EC64A6EC3727AC7FD2E8E74 /* DeepArrayRepresentationBuilder.swift in Sources */, + 5442E7F9E341EAFAD3E99B8D8CF38739 /* DictionaryExtension.swift in Sources */, + D325F4D7D07F6B88133DA7CDD62DF147 /* DictionaryRepresentation.swift in Sources */, + 83D4D2727C78847B4C919DE8B6D0E1E7 /* DictionaryRepresentationBuilder.swift in Sources */, + EFD9453CA01C79DD3065E4F26C2C040E /* Identity.swift in Sources */, + 045D018CD1D310B695D481764A36E8D2 /* JSONRepresentation.swift in Sources */, + 5179CAFE694E671560893AAF71861711 /* JSONRepresentationBuilder.swift in Sources */, + 91948D15116AF11724AC5BC97216DFD5 /* Representable.swift in Sources */, + F5E0C38A99D9104A8A3D6CE94059E0BA /* Representation.swift in Sources */, + 6AB8A1F89BFEFE98313D298308C4D29A /* RepresentationKit-dummy.m in Sources */, + 935FCE7FF349638993AD03841F758BCE /* TypedArrayRepresentation.swift in Sources */, + AE1B4274830166D09BD8790C0A6FD609 /* TypedArrayRepresentationBuilder.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DDE2642E46D6DD29DC6D35529BADF77E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 30DBB190ABE454C7D14EAAD3524EB370 /* Pods-LogKit_Tests-dummy.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 008C87921534F6A7DC999D9A6AFF7C56 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Ents; + target = 60FAB5B7F68D197BE65725FFBEC62C2E /* Ents */; + targetProxy = CD826309F8AB9FBB6CBF09DCE92B8677 /* PBXContainerItemProxy */; + }; + 0906CF163C8466FA8135663AC1C078E3 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Ents; + target = 60FAB5B7F68D197BE65725FFBEC62C2E /* Ents */; + targetProxy = DC07E248F7ECE3C16934D6E37EA78F50 /* PBXContainerItemProxy */; + }; + 638F87F56528ED0DBC8D783DB74160FD /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = Ents; + target = 60FAB5B7F68D197BE65725FFBEC62C2E /* Ents */; + targetProxy = 4E9E14FCEF62FCCC8E79868CAC681E4F /* PBXContainerItemProxy */; + }; + 7163C1C3237377A68A004505C93685BA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = LogKit; + target = 1F5FDFCEE2BEB4C22C7F534CED1321F4 /* LogKit */; + targetProxy = 7E62E20823DD9778BA35E272EBA5AD08 /* PBXContainerItemProxy */; + }; + 759AD824812F0606C4F22083E078DC2D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = ContentKit; + target = 0956DD9334A7C3D9412367868BF95F3C /* ContentKit */; + targetProxy = 50088A72BAAFEDA8850AB5729C7485DB /* PBXContainerItemProxy */; + }; + A45182C4DE858069050180B9430D7043 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = RepresentationKit; + target = E375D352808E657B7F12580FC767EF6E /* RepresentationKit */; + targetProxy = 896743E271F99B404FFFED2F9B235FF6 /* PBXContainerItemProxy */; + }; + B8CF67F929CAD853B5C0C78C532DAA09 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = RepresentationKit; + target = E375D352808E657B7F12580FC767EF6E /* RepresentationKit */; + targetProxy = C99B242E2813CA74CE9408D3CDCCEFF2 /* PBXContainerItemProxy */; + }; + C76B599785E2B34D43036F3CA82B09AB /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = ContentKit; + target = 0956DD9334A7C3D9412367868BF95F3C /* ContentKit */; + targetProxy = A01CDA1BEB7A9F1B2A60EA9F57119882 /* PBXContainerItemProxy */; + }; + DCDE771061D5DD49C48CE8C36371020F /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + name = RepresentationKit; + target = E375D352808E657B7F12580FC767EF6E /* RepresentationKit */; + targetProxy = D82F0C496C7B39E53B9B020B3965091E /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin XCBuildConfiguration section */ + 26CC1D76C835575B4684EC53D03C9281 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D8352B570A82EA0132DA409E67FE6AD3 /* Ents.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/Ents/Ents-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Ents/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Ents/Ents.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = Ents; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 345CC476DF4A7516DBD2220CF5035FF3 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = NO; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_DEBUG=1", + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + ONLY_ACTIVE_ARCH = YES; + PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + }; + name = Debug; + }; + 49C74DFCD200AC077CD496383A45A770 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6F3B160D34BEF29511A1D27A8FB9E714 /* Pods-LogKit_Tests.debug.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Target Support Files/Pods-LogKit_Tests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_LogKit_Tests; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 61C8E7E4EBCCFDD66F3FDA9B14FBBD87 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 3318EF5B04E64E5E20424F55A7F42CDB /* Pods-LogKit_Tests.release.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = "Target Support Files/Pods-LogKit_Tests/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACH_O_TYPE = staticlib; + MODULEMAP_FILE = "Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = ""; + OTHER_LIBTOOLFLAGS = ""; + PODS_ROOT = "$(SRCROOT)"; + PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; + PRODUCT_NAME = Pods_LogKit_Tests; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 717E77604BFBB04BEAF56608A1CB2EDE /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGNING_REQUIRED = NO; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_PREPROCESSOR_DEFINITIONS = ( + "POD_CONFIGURATION_RELEASE=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.3; + PROVISIONING_PROFILE_SPECIFIER = NO_SIGNING/; + STRIP_INSTALLED_PRODUCT = NO; + SYMROOT = "${SRCROOT}/../build"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 71D21C0E4A7E012181185DD5ED2F9C2E /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4A0821E427D67A71F16795D7AC9A453A /* RepresentationKit.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/RepresentationKit/RepresentationKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/RepresentationKit/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/RepresentationKit/RepresentationKit.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = RepresentationKit; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 95DDA935B3B62D5A19AA141C1220F2AD /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E4B680600EA64951B88B18B03D1BA74C /* ContentKit.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/ContentKit/ContentKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/ContentKit/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/ContentKit/ContentKit.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = ContentKit; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + A2C44C385BAFB2CC0EDF48107F959010 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 4A0821E427D67A71F16795D7AC9A453A /* RepresentationKit.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/RepresentationKit/RepresentationKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/RepresentationKit/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/RepresentationKit/RepresentationKit.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = RepresentationKit; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + C387D400550AEFA0AA44323938235EAE /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 23A81E75D80A3203CCB29B1680178F9D /* LogKit.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/LogKit/LogKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/LogKit/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/LogKit/LogKit.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = LogKit; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + DC5AA8337344ED018EB5B19F4464281E /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E4B680600EA64951B88B18B03D1BA74C /* ContentKit.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/ContentKit/ContentKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/ContentKit/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/ContentKit/ContentKit.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = ContentKit; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + F208D56593241377108A62016DFFD783 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = D8352B570A82EA0132DA409E67FE6AD3 /* Ents.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/Ents/Ents-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/Ents/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/Ents/Ents.modulemap"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = Ents; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + F75980F49EEAFE5785A4F54A527C2092 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 23A81E75D80A3203CCB29B1680178F9D /* LogKit.xcconfig */; + buildSettings = { + CODE_SIGN_IDENTITY = ""; + "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; + "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_PREFIX_HEADER = "Target Support Files/LogKit/LogKit-prefix.pch"; + INFOPLIST_FILE = "Target Support Files/LogKit/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MODULEMAP_FILE = "Target Support Files/LogKit/LogKit.modulemap"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = LogKit; + SDKROOT = iphoneos; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 0FD84966490FD62102F54655D88FAF10 /* Build configuration list for PBXNativeTarget "Pods-LogKit_Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 49C74DFCD200AC077CD496383A45A770 /* Debug */, + 61C8E7E4EBCCFDD66F3FDA9B14FBBD87 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 2D8E8EC45A3A1A1D94AE762CB5028504 /* Build configuration list for PBXProject "Pods" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 345CC476DF4A7516DBD2220CF5035FF3 /* Debug */, + 717E77604BFBB04BEAF56608A1CB2EDE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 495F67D1982D7AAF5F7C5C18B66F3E96 /* Build configuration list for PBXNativeTarget "LogKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + F75980F49EEAFE5785A4F54A527C2092 /* Debug */, + C387D400550AEFA0AA44323938235EAE /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 9D9050A1AF8EC3272A8E7DFE9EBA6BE3 /* Build configuration list for PBXNativeTarget "Ents" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 26CC1D76C835575B4684EC53D03C9281 /* Debug */, + F208D56593241377108A62016DFFD783 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A5E99A17A2F90E9E2B125DFE3BEAC4A2 /* Build configuration list for PBXNativeTarget "RepresentationKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A2C44C385BAFB2CC0EDF48107F959010 /* Debug */, + 71D21C0E4A7E012181185DD5ED2F9C2E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CB62C020E957A8DBAAB5F345A052F130 /* Build configuration list for PBXNativeTarget "ContentKit" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + DC5AA8337344ED018EB5B19F4464281E /* Debug */, + 95DDA935B3B62D5A19AA141C1220F2AD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = D41D8CD98F00B204E9800998ECF8427E /* Project object */; +} diff --git a/Example/Pods/RepresentationKit/LICENSE b/Example/Pods/RepresentationKit/LICENSE new file mode 100644 index 0000000..8dada3e --- /dev/null +++ b/Example/Pods/RepresentationKit/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Example/Pods/RepresentationKit/README.md b/Example/Pods/RepresentationKit/README.md new file mode 100644 index 0000000..69d9b86 --- /dev/null +++ b/Example/Pods/RepresentationKit/README.md @@ -0,0 +1,73 @@ +# RepresentationKit + +Influenced by [Printers instead of getters](http://www.yegor256.com/2016/04/05/printers-instead-of-getters.html) + +## Example + +To run the example project, clone the repo, and run `pod install` from the Example directory first. + +## Code Example + +```swift +struct Book { + let name: String + let edition: String +} + +extension Book: Representable { + func represent(using representation: Representation) -> Representation { + return representation + .with(key: "name", value: self.name) + .with(key: "edition", value: self.edition) + } +} + +extension Book: CustomStringConvertible { + var description: String { + return "Book(\(self.name),\(self.edition))" + } +} + +let books = (0..<2).map { Book(name: "Book \($0)", edition: "Edition \($0)") } +print("Books = \(books)") +// Prints "Books = [Book(Book 0,Edition 0), Book(Book 1,Edition 1)]" + +let arrayRep = ArrayRepresentationBuilder() +let dictRep = DictionaryRepresentationBuilder() + +let arrayResuslt: ArrayRepresentationBuilder = books[0].represent(using: arrayRep) +print(arrayResuslt.array) +// Prints ["Book 0", "Edition 0"] + +let dictResuslt: DictionaryRepresentation = books[0].represent(using: dictRep) +print(dictResuslt.dictionary) +// Prints ["name": "Book 0", "edition": "Edition 0"] + +let dictionaryRepresentationOfAnArray: DictionaryRepresentation = books.represent(using: dictRep) +print(dictionaryRepresentationOfAnArray.dictionary) +// Prints ["0": Book(Book 0,Edition 0), "1": Book(Book 1,Edition 1)] + +let deepRep = DeepArrayRepresentationBuilder(representation: JSONRepresentationBuilder()) +let deepRepRes: DeepArrayRepresentationBuilder = books.represent(using: deepRep) +print(deepRepRes.array.map { $0.dictionary }) +// Prints [["name": "Book 0", "edition": "Edition 0"], ["name": "Book 1", "edition": "Edition 1"]] +``` + +## Requirements + +## Installation + +RepresentationKit is available through [CocoaPods](http://cocoapods.org). To install +it, simply add the following line to your Podfile: + +```ruby +pod "RepresentationKit" +``` + +## Author + +Georges Boumis, developer.george.boumis@gmail.com + +## License + +RepresentationKit is available under the Apache 2.0 license. See the LICENSE file for more info. diff --git a/Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/ArrayRepresentationBuilder.swift b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/ArrayRepresentationBuilder.swift new file mode 100644 index 0000000..49054bd --- /dev/null +++ b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/ArrayRepresentationBuilder.swift @@ -0,0 +1,46 @@ +// +// ArrayRepresentationBuilder.swift +// RepresentationKit +// +// Created by Georges Boumis on 05/05/2017. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +final public class ArrayRepresentationBuilder: ArrayRepresentation { + final private let _array: [Any] + final public var array: [Any] { + return self._array + } + + public init() { + self._array = [] + } + + private init(_ array: [Any]) { + self._array = array + } + + final public func with(key: Key, value: Value) -> Representation where Key: LosslessStringConvertible & Hashable { + var array: [Any] = self._array + array.append(value) + return ArrayRepresentationBuilder(array) + } +} diff --git a/Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/DeepArrayRepresentationBuilder.swift b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/DeepArrayRepresentationBuilder.swift new file mode 100644 index 0000000..97a906c --- /dev/null +++ b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/DeepArrayRepresentationBuilder.swift @@ -0,0 +1,56 @@ +// +// DeepArrayRepresentationBuilder.swift +// RepresentationKit +// +// Created by Georges Boumis on 20/08/2017. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +final public class DeepArrayRepresentationBuilder: TypedArrayRepresentation where Rep: Representation { + + public typealias Element = Rep + + final private let representation: Rep + + final private let _array: [Rep] + public var array: [Element] { + return self._array + } + + public init(representation: Rep) { + self.representation = representation + self._array = [] + } + + private init(_ array: [Element], representation: Rep) { + self.representation = representation + self._array = array + } + + final public func with(key: Key, value: Value) -> Representation where Key: LosslessStringConvertible & Hashable { + guard let v = value as? Representable else { + return self + } + var array: [Element] = self._array + array.append(v.represent(using: self.representation) as! Rep) + return DeepArrayRepresentationBuilder(array, representation: self.representation) + } +} diff --git a/Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/DictionaryRepresentationBuilder.swift b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/DictionaryRepresentationBuilder.swift new file mode 100644 index 0000000..8eee922 --- /dev/null +++ b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/DictionaryRepresentationBuilder.swift @@ -0,0 +1,46 @@ +// +// DictionaryRepresentationBuilder.swift +// RepresentationKit +// +// Created by Georges Boumis on 20/6/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + + +/// Building a Dictionary Representation of a conforming object +final public class DictionaryRepresentationBuilder: DictionaryRepresentation { + final public let dictionary: [String : Any] + + public convenience init() { + self.init(dictionary: [:]) + } + + public init(dictionary: [String: Any]) { + self.dictionary = dictionary + } + + final public func with(key: Key, value: Value) -> Representation where Key: LosslessStringConvertible & Hashable { + var dictionary = self.dictionary + dictionary[String(key)] = value + return DictionaryRepresentationBuilder(dictionary: dictionary) + } + +} diff --git a/Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/JSONRepresentationBuilder.swift b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/JSONRepresentationBuilder.swift new file mode 100644 index 0000000..263cff2 --- /dev/null +++ b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/JSONRepresentationBuilder.swift @@ -0,0 +1,55 @@ +// +// JSONRepresentationBuilder.swift +// RepresentationKit +// +// Created by Georges Boumis on 20/6/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + + +/// The conforming class can be represented as a JSON string +final public class JSONRepresentationBuilder: JSONRepresentation { + final private let builder: DictionaryRepresentationBuilder + final public var string: String { + return self.json + } + + final public var dictionary: [String : Any] { + return self.builder.dictionary + } + + public convenience init() { + self.init(dictionary: [:]) + } + + public init(dictionary: [String : Any]) { + self.builder = DictionaryRepresentationBuilder(dictionary: dictionary) + } + + private init(builder: DictionaryRepresentationBuilder) { + self.builder = builder + } + + final public func with(key: Key, value: Value) -> Representation where Key: LosslessStringConvertible & Hashable { + let dictRep: DictionaryRepresentationBuilder = self.builder.with(key: key, value: value) + return JSONRepresentationBuilder(builder: dictRep) + } +} diff --git a/Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/TypedArrayRepresentationBuilder.swift b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/TypedArrayRepresentationBuilder.swift new file mode 100644 index 0000000..1a23902 --- /dev/null +++ b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Builders/TypedArrayRepresentationBuilder.swift @@ -0,0 +1,47 @@ +// +// TypedArrayRepresentationBuilder.swift +// RepresentationKit +// +// Created by Georges Boumis on 20/08/2017. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +final public class TypedArrayRepresentationBuilder: TypedArrayRepresentation { + public typealias Element = E + final private let _array: [Element] + final public var array: [Element] { + return self._array + } + + public init() { + self._array = [] + } + + private init(_ array: [Element]) { + self._array = array + } + + final public func with(key: Key, value: Value) -> Representation where Key: LosslessStringConvertible & Hashable { + var array: [Element] = self._array + array.append(value as! Element) + return TypedArrayRepresentationBuilder(array) + } +} diff --git a/Example/Pods/RepresentationKit/RepresentationKit/Classes/Protocols/Representable.swift b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Protocols/Representable.swift new file mode 100644 index 0000000..3e9192d --- /dev/null +++ b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Protocols/Representable.swift @@ -0,0 +1,61 @@ +// +// Representable.swift +// RepresentationKit +// +// Created by Georges Boumis on 20/6/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +/// This protocol describes the requirements for an object to be `Representable`. +/// The sole requirement of a `Representable` is to fill the `Representation` +/// given with key-value pairs that describe the object. +/// +public protocol Representable { + + /// Returns a `Representation` enriched with the key-value pairs describing + /// this instance. + /// - Parameter representation: the representation to fill + func represent(using representation: Representation) -> Representation +} + +public extension Representable { + + /// Returns a `Representation` enriched with the key-value pairs describing + /// this instance. + /// This is a strongly typed alternative + /// - Parameter representation: the representation to fill + public func represent(using representation: Rep) -> Rep where Rep: Representation { + return self.represent(using: representation) as! Rep + } + + /// Default empty representation. This default implementation does nothing. + /// - Parameter representation: the representation to fill + public func represent(using representation: Representation) -> Representation { + return representation + } +} + +public extension CustomStringConvertible where Self : Representable { + + public func represent(using representation: Representation) -> Representation { + return representation.with(key: "description", value: self.description) + } +} diff --git a/Example/Pods/RepresentationKit/RepresentationKit/Classes/Protocols/Representation.swift b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Protocols/Representation.swift new file mode 100644 index 0000000..c89fc78 --- /dev/null +++ b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Protocols/Representation.swift @@ -0,0 +1,69 @@ +// +// JSONTransformation.swift +// RepresentationKit +// +// Created by Georges Boumis on 10/06/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + + +/// This protocol describes possible representation of objects. +/// The sole requirement of a `Representation` is to return a new `Representation`, +/// probably enriched, with a given (key,value) pair. +/// +/// How each `Representation` represents the given data is an implementation +/// detail. +public protocol Representation { + + /// Returns a `Representation` probably enriched, with the given (key,value) pair. + /// - Parameters: + /// - key: a key to identify the value + /// - value: a value + func with(key: Key, value: Value) -> Representation where Key: LosslessStringConvertible & Hashable +} + +public extension Representation { + + /// Returns a `Representation` probably enriched, with the given (key,value) + /// pair. This is a strongly typed alternative + /// + /// - Parameters: + /// - key: a key to identify the value + /// - value: a value + public func with(key: Key, value: Value) -> Rep + where Key: LosslessStringConvertible & Hashable, Rep: Representation { + return self.with(key: key, value: value) as! Rep + } + + /// Returns a `Representation` probably enriched, with the given (key,value) + /// pair, only if the `validate` closure evaluates to a non-optional value. + /// - Parameters: + /// - key: a key to identify the value + /// - value: a value + /// - validate: a closure that takes the value and returns the value if + /// to validate or `nil` to invalidate. - parameter: a + public func potentiallyWith(key: Key, value: Value, _ validate: (Value) -> Validated?) -> Representation where Key: LosslessStringConvertible & Hashable { + guard let v = validate(value) else { return self } + return self.with(key: key, value: v) + } +} + + diff --git a/Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/ArrayRepresentation.swift b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/ArrayRepresentation.swift new file mode 100644 index 0000000..6d4fd21 --- /dev/null +++ b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/ArrayRepresentation.swift @@ -0,0 +1,67 @@ +// +// ArrayRepresentation.swift +// RepresentationKit +// +// Created by Georges Boumis on 07/10/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + + +/// Describes an array representation. Also the conforming class can be +/// represented itself. +/// +/// struct Book: Representable { +/// let name: String +/// let edition: String +/// +/// func represent(using representation: Representation) -> Representation { +/// return representation +/// .with(key: "name", value: self.name) +/// .with(key: "edition", value: self.edition) +/// } +/// } +/// +/// let book = Book(name: "Super title", edition: "Pepper's") +/// +/// var representation: ArrayRepresentation = /* */ +/// representation = book.represent(using: representation) +/// +/// print(representation.array) +/// // Prints ["Super title", "Pepper's"] +/// +/// - SeeAlso: `TypedArrayRepresentation` +public protocol ArrayRepresentation: Representation, Representable { + + /// the array of the represented values. + var array: [Any] { get } +} + +public extension ArrayRepresentation { + + public func represent(using representation: Rep) -> Rep where Rep: Representation { + var r = representation + + for (index,element) in self.array.enumerated() { + r = r.with(key: "\(index)", value: element) as! Rep + } + return r + } +} diff --git a/Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/DictionaryRepresentation.swift b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/DictionaryRepresentation.swift new file mode 100644 index 0000000..c08381a --- /dev/null +++ b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/DictionaryRepresentation.swift @@ -0,0 +1,62 @@ +// +// DictionaryRepresentation.swift +// RepresentationKit +// +// Created by Georges Boumis on 20/6/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +/// Describes a dictionary representation. Also the conforming class can be +/// represented itself. +/// +/// struct Book: Representable { +/// let name: String +/// let edition: String +/// +/// func represent(using representation: Representation) -> Representation { +/// return representation +/// .with(key: "name", value: self.name) +/// .with(key: "edition", value: self.edition) +/// } +/// } +/// +/// let book = Book(name: "Super title", edition: "Pepper's") +/// +/// var representation: DictionaryRepresentation = /* */ +/// representation = book.represent(using: representation) +/// +/// print(representation.dictionary) +/// // Prints ["name" : "Super title", "edition" : "Pepper's"] +/// +public protocol DictionaryRepresentation: Representation, Representable { + + /// the dictionary thats contains all the key-value pairs + var dictionary: [String: Any] { get } +} + +public extension DictionaryRepresentation { + + public func represent(using representation: Representation) -> Representation { + return self.dictionary.reduce(representation) { (rep, pair) -> Representation in + rep.with(key: pair.0, value: pair.1) + } + } +} diff --git a/Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/Identity.swift b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/Identity.swift new file mode 100644 index 0000000..35804da --- /dev/null +++ b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/Identity.swift @@ -0,0 +1,37 @@ +// +// Identity.swift +// RepresentationKit +// +// Created by Georges Boumis on 29/06/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +public protocol Identity { + func identify() -> [String : Any] +} + +public extension Identity where Self: Representable { + public func identify() -> [String : Any] { + let representation: DictionaryRepresentation = self.represent(using: DictionaryRepresentationBuilder()) + return representation.dictionary + } +} + diff --git a/Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/JSONRepresentation.swift b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/JSONRepresentation.swift new file mode 100644 index 0000000..06b3c01 --- /dev/null +++ b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/JSONRepresentation.swift @@ -0,0 +1,82 @@ +// +// JSONRepresentation.swift +// RepresentationKit +// +// Created by Georges Boumis on 20/6/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +/// Describes a json representation. Also the conforming class can be +/// represented itself. +/// +/// struct Book: Representable { +/// let name: String +/// let edition: String +/// +/// func represent(using representation: Representation) -> Representation { +/// return representation +/// .with(key: "name", value: self.name) +/// .with(key: "edition", value: self.edition) +/// } +/// } +/// +/// let book = Book(name: "Super title", edition: "Pepper's") +/// +/// var representation: DictionaryRepresentation = /* */ +/// representation = book.represent(using: representation) +/// +/// print(representation.dictionary) +/// // Prints ["name" : "Super title", "edition" : "Pepper's"] +/// +public protocol JSONRepresentation: DictionaryRepresentation { + + /// the json string representation + var json: String { get } + + /// the json data representation + var jsonData: Data? { get } +} + +public extension JSONRepresentation { + + var jsonData: Data? { + do { + var data : Data? = nil + let dictionary = self.dictionary + try data = JSONSerialization.data(withJSONObject: dictionary, options: []) + let json = (String(data: data!, encoding: String.Encoding.utf8))! + "\n" + data = json.data(using: String.Encoding.utf8) + return data + } catch {} + return nil; + } + + var json: String { + if let dt = self.jsonData { + return NSString(data: dt, encoding: String.Encoding.utf8.rawValue)! as String + } + return ""; + } + + var string: String { + return self.json + } +} diff --git a/Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/TypedArrayRepresentation.swift b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/TypedArrayRepresentation.swift new file mode 100644 index 0000000..d7f54c8 --- /dev/null +++ b/Example/Pods/RepresentationKit/RepresentationKit/Classes/Representations/TypedArrayRepresentation.swift @@ -0,0 +1,67 @@ +// +// TypedArrayRepresentation.swift +// RepresentationKit +// +// Created by Georges Boumis on 20/08/2017. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +/// Describes an array representation. Also the conforming class can be +/// represented itself. +/// +/// struct Book: Representable { +/// let name: String +/// let edition: String +/// +/// func represent(using representation: Representation) -> Representation { +/// return representation +/// .with(key: "name", value: self.name) +/// .with(key: "edition", value: self.edition) +/// } +/// } +/// +/// let book = Book(name: "Super title", edition: "Pepper's") +/// +/// var representation: TypedArrayRepresentation = /* TypedArrayRepresentationImpl */ +/// representation = book.represent(using: representation) +/// +/// print(representation.array) // here representation.array is a [String] +/// // Prints ["Super title", "Pepper's"] +/// +/// - SeeAlso: `ArrayRepresentation` +public protocol TypedArrayRepresentation: Representation, Representable { + associatedtype Element + + /// the typed array of the represented values. + var array: [Element] { get } +} + +public extension TypedArrayRepresentation { + + public func represent(using representation: Rep) -> Rep where Rep: Representation { + var r = representation + + for (index,element) in self.array.enumerated() { + r = r.with(key: "\(index)", value: element) as! Rep + } + return r + } +} diff --git a/Example/Pods/RepresentationKit/RepresentationKit/Classes/extensions/CollectionExtensions.swift b/Example/Pods/RepresentationKit/RepresentationKit/Classes/extensions/CollectionExtensions.swift new file mode 100644 index 0000000..e13b4bd --- /dev/null +++ b/Example/Pods/RepresentationKit/RepresentationKit/Classes/extensions/CollectionExtensions.swift @@ -0,0 +1,37 @@ +// +// CollectionExtensions.swift +// RepresentationKit +// +// Created by Georges Boumis on 20/08/2017. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +public extension Collection where Self.Iterator.Element: Representable { + + public func represent(using representation: Rep) -> Rep where Rep: Representation { + var r = representation + + for (index,element) in self.enumerated() { + r = r.with(key: "\(index)", value: element) as! Rep + } + return r + } +} diff --git a/Example/Pods/RepresentationKit/RepresentationKit/Classes/extensions/DictionaryExtension.swift b/Example/Pods/RepresentationKit/RepresentationKit/Classes/extensions/DictionaryExtension.swift new file mode 100644 index 0000000..f8f5f7b --- /dev/null +++ b/Example/Pods/RepresentationKit/RepresentationKit/Classes/extensions/DictionaryExtension.swift @@ -0,0 +1,36 @@ +// +// DictionaryExtension.swift +// RepresentationKit +// +// Created by Georges Boumis on 20/08/2017. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation + +extension Dictionary where Key: LosslessStringConvertible { + + public func represent(using representation: Rep) -> Rep where Rep: Representation { + return self.reduce(representation) { (rep, pair) -> Rep in + let key = pair.key + let value = pair.value + return rep.with(key: key, value: value) as! Rep + } + } +} diff --git a/Example/Pods/Target Support Files/ContentKit/ContentKit-dummy.m b/Example/Pods/Target Support Files/ContentKit/ContentKit-dummy.m new file mode 100644 index 0000000..eee0a28 --- /dev/null +++ b/Example/Pods/Target Support Files/ContentKit/ContentKit-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_ContentKit : NSObject +@end +@implementation PodsDummy_ContentKit +@end diff --git a/Example/Pods/Target Support Files/ContentKit/ContentKit-prefix.pch b/Example/Pods/Target Support Files/ContentKit/ContentKit-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Example/Pods/Target Support Files/ContentKit/ContentKit-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Example/Pods/Target Support Files/ContentKit/ContentKit-umbrella.h b/Example/Pods/Target Support Files/ContentKit/ContentKit-umbrella.h new file mode 100644 index 0000000..fab8bac --- /dev/null +++ b/Example/Pods/Target Support Files/ContentKit/ContentKit-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double ContentKitVersionNumber; +FOUNDATION_EXPORT const unsigned char ContentKitVersionString[]; + diff --git a/Example/Pods/Target Support Files/ContentKit/ContentKit.modulemap b/Example/Pods/Target Support Files/ContentKit/ContentKit.modulemap new file mode 100644 index 0000000..7465ec2 --- /dev/null +++ b/Example/Pods/Target Support Files/ContentKit/ContentKit.modulemap @@ -0,0 +1,6 @@ +framework module ContentKit { + umbrella header "ContentKit-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/ContentKit/ContentKit.xcconfig b/Example/Pods/Target Support Files/ContentKit/ContentKit.xcconfig new file mode 100644 index 0000000..90b8c78 --- /dev/null +++ b/Example/Pods/Target Support Files/ContentKit/ContentKit.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/ContentKit +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/Ents" "$PODS_CONFIGURATION_BUILD_DIR/RepresentationKit" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/ContentKit +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Example/Pods/Target Support Files/ContentKit/Info.plist b/Example/Pods/Target Support Files/ContentKit/Info.plist new file mode 100644 index 0000000..509b5d9 --- /dev/null +++ b/Example/Pods/Target Support Files/ContentKit/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.6.5 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/Ents/Ents-dummy.m b/Example/Pods/Target Support Files/Ents/Ents-dummy.m new file mode 100644 index 0000000..b5e94c9 --- /dev/null +++ b/Example/Pods/Target Support Files/Ents/Ents-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Ents : NSObject +@end +@implementation PodsDummy_Ents +@end diff --git a/Example/Pods/Target Support Files/Ents/Ents-prefix.pch b/Example/Pods/Target Support Files/Ents/Ents-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Example/Pods/Target Support Files/Ents/Ents-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Example/Pods/Target Support Files/Ents/Ents-umbrella.h b/Example/Pods/Target Support Files/Ents/Ents-umbrella.h new file mode 100644 index 0000000..e6ee990 --- /dev/null +++ b/Example/Pods/Target Support Files/Ents/Ents-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double EntsVersionNumber; +FOUNDATION_EXPORT const unsigned char EntsVersionString[]; + diff --git a/Example/Pods/Target Support Files/Ents/Ents.modulemap b/Example/Pods/Target Support Files/Ents/Ents.modulemap new file mode 100644 index 0000000..3031280 --- /dev/null +++ b/Example/Pods/Target Support Files/Ents/Ents.modulemap @@ -0,0 +1,6 @@ +framework module Ents { + umbrella header "Ents-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Ents/Ents.xcconfig b/Example/Pods/Target Support Files/Ents/Ents.xcconfig new file mode 100644 index 0000000..fdb9fb6 --- /dev/null +++ b/Example/Pods/Target Support Files/Ents/Ents.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/Ents +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +OTHER_SWIFT_FLAGS[config=Debug] = -DDEBUG +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/Ents +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Example/Pods/Target Support Files/Ents/Info.plist b/Example/Pods/Target Support Files/Ents/Info.plist new file mode 100644 index 0000000..823aefa --- /dev/null +++ b/Example/Pods/Target Support Files/Ents/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.17.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/LogKit/Info.plist b/Example/Pods/Target Support Files/LogKit/Info.plist new file mode 100644 index 0000000..c243c02 --- /dev/null +++ b/Example/Pods/Target Support Files/LogKit/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.1.6 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/LogKit/LogKit-dummy.m b/Example/Pods/Target Support Files/LogKit/LogKit-dummy.m new file mode 100644 index 0000000..2594128 --- /dev/null +++ b/Example/Pods/Target Support Files/LogKit/LogKit-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_LogKit : NSObject +@end +@implementation PodsDummy_LogKit +@end diff --git a/Example/Pods/Target Support Files/LogKit/LogKit-prefix.pch b/Example/Pods/Target Support Files/LogKit/LogKit-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Example/Pods/Target Support Files/LogKit/LogKit-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Example/Pods/Target Support Files/LogKit/LogKit-umbrella.h b/Example/Pods/Target Support Files/LogKit/LogKit-umbrella.h new file mode 100644 index 0000000..589d459 --- /dev/null +++ b/Example/Pods/Target Support Files/LogKit/LogKit-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double LogKitVersionNumber; +FOUNDATION_EXPORT const unsigned char LogKitVersionString[]; + diff --git a/Example/Pods/Target Support Files/LogKit/LogKit.modulemap b/Example/Pods/Target Support Files/LogKit/LogKit.modulemap new file mode 100644 index 0000000..2d7c45a --- /dev/null +++ b/Example/Pods/Target Support Files/LogKit/LogKit.modulemap @@ -0,0 +1,6 @@ +framework module LogKit { + umbrella header "LogKit-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/LogKit/LogKit.xcconfig b/Example/Pods/Target Support Files/LogKit/LogKit.xcconfig new file mode 100644 index 0000000..49cfbc9 --- /dev/null +++ b/Example/Pods/Target Support Files/LogKit/LogKit.xcconfig @@ -0,0 +1,11 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/LogKit +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/ContentKit" "$PODS_CONFIGURATION_BUILD_DIR/Ents" "$PODS_CONFIGURATION_BUILD_DIR/RepresentationKit" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Example/Pods/Target Support Files/Pods-LogKit_Tests/Info.plist b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Info.plist new file mode 100644 index 0000000..2243fe6 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0.0 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-acknowledgements.markdown b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-acknowledgements.markdown new file mode 100644 index 0000000..06f41f7 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-acknowledgements.markdown @@ -0,0 +1,643 @@ +# Acknowledgements +This application makes use of the following third party libraries: + +## ContentKit + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +## Ents + +Ents + +Copyright (c) 2016-2017 Georges Boumis + +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. + + +## LogKit + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + +## RepresentationKit + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +Generated by CocoaPods - https://cocoapods.org diff --git a/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-acknowledgements.plist b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-acknowledgements.plist new file mode 100644 index 0000000..96a1af5 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-acknowledgements.plist @@ -0,0 +1,693 @@ + + + + + PreferenceSpecifiers + + + FooterText + This application makes use of the following third party libraries: + Title + Acknowledgements + Type + PSGroupSpecifier + + + FooterText + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + License + Apache 2.0 + Title + ContentKit + Type + PSGroupSpecifier + + + FooterText + Ents + +Copyright (c) 2016-2017 Georges Boumis <developer.george.boumis@gmail.com> + +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. + + License + MIT + Title + Ents + Type + PSGroupSpecifier + + + FooterText + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + License + MIT + Title + LogKit + Type + PSGroupSpecifier + + + FooterText + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + + License + Apache 2.0 + Title + RepresentationKit + Type + PSGroupSpecifier + + + FooterText + Generated by CocoaPods - https://cocoapods.org + Title + + Type + PSGroupSpecifier + + + StringsTable + Acknowledgements + Title + Acknowledgements + + diff --git a/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-dummy.m b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-dummy.m new file mode 100644 index 0000000..02be6b4 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_Pods_LogKit_Tests : NSObject +@end +@implementation PodsDummy_Pods_LogKit_Tests +@end diff --git a/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-frameworks.sh b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-frameworks.sh new file mode 100755 index 0000000..e9dc90b --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-frameworks.sh @@ -0,0 +1,105 @@ +#!/bin/sh +set -e + +echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" +mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + +SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" + +install_framework() +{ + if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then + local source="${BUILT_PRODUCTS_DIR}/$1" + elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then + local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" + elif [ -r "$1" ]; then + local source="$1" + fi + + local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + + if [ -L "${source}" ]; then + echo "Symlinked..." + source="$(readlink "${source}")" + fi + + # use filter instead of exclude so missing patterns dont' throw errors + echo "rsync -av --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" + rsync -av --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" + + local basename + basename="$(basename -s .framework "$1")" + binary="${destination}/${basename}.framework/${basename}" + if ! [ -r "$binary" ]; then + binary="${destination}/${basename}" + fi + + # Strip invalid architectures so "fat" simulator / device frameworks work on device + if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then + strip_invalid_archs "$binary" + fi + + # Resign the code if required by the build settings to avoid unstable apps + code_sign_if_enabled "${destination}/$(basename "$1")" + + # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. + if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then + local swift_runtime_libs + swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u && exit ${PIPESTATUS[0]}) + for lib in $swift_runtime_libs; do + echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" + rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" + code_sign_if_enabled "${destination}/${lib}" + done + fi +} + +# Signs a framework with the provided identity +code_sign_if_enabled() { + if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" -a "${CODE_SIGNING_REQUIRED}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then + # Use the current code_sign_identitiy + echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" + local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS} --preserve-metadata=identifier,entitlements '$1'" + + if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + code_sign_cmd="$code_sign_cmd &" + fi + echo "$code_sign_cmd" + eval "$code_sign_cmd" + fi +} + +# Strip invalid architectures +strip_invalid_archs() { + binary="$1" + # Get architectures for current file + archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | rev)" + stripped="" + for arch in $archs; do + if ! [[ "${VALID_ARCHS}" == *"$arch"* ]]; then + # Strip non-valid architectures in-place + lipo -remove "$arch" -output "$binary" "$binary" || exit 1 + stripped="$stripped $arch" + fi + done + if [[ "$stripped" ]]; then + echo "Stripped $binary of architectures:$stripped" + fi +} + + +if [[ "$CONFIGURATION" == "Debug" ]]; then + install_framework "$BUILT_PRODUCTS_DIR/ContentKit/ContentKit.framework" + install_framework "$BUILT_PRODUCTS_DIR/Ents/Ents.framework" + install_framework "$BUILT_PRODUCTS_DIR/LogKit/LogKit.framework" + install_framework "$BUILT_PRODUCTS_DIR/RepresentationKit/RepresentationKit.framework" +fi +if [[ "$CONFIGURATION" == "Release" ]]; then + install_framework "$BUILT_PRODUCTS_DIR/ContentKit/ContentKit.framework" + install_framework "$BUILT_PRODUCTS_DIR/Ents/Ents.framework" + install_framework "$BUILT_PRODUCTS_DIR/LogKit/LogKit.framework" + install_framework "$BUILT_PRODUCTS_DIR/RepresentationKit/RepresentationKit.framework" +fi +if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then + wait +fi diff --git a/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-resources.sh b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-resources.sh new file mode 100755 index 0000000..aed060f --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-resources.sh @@ -0,0 +1,102 @@ +#!/bin/sh +set -e + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + +RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt +> "$RESOURCES_TO_COPY" + +XCASSET_FILES=() + +case "${TARGETED_DEVICE_FAMILY}" in + 1,2) + TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" + ;; + 1) + TARGET_DEVICE_ARGS="--target-device iphone" + ;; + 2) + TARGET_DEVICE_ARGS="--target-device ipad" + ;; + 3) + TARGET_DEVICE_ARGS="--target-device tv" + ;; + 4) + TARGET_DEVICE_ARGS="--target-device watch" + ;; + *) + TARGET_DEVICE_ARGS="--target-device mac" + ;; +esac + +install_resource() +{ + if [[ "$1" = /* ]] ; then + RESOURCE_PATH="$1" + else + RESOURCE_PATH="${PODS_ROOT}/$1" + fi + if [[ ! -e "$RESOURCE_PATH" ]] ; then + cat << EOM +error: Resource "$RESOURCE_PATH" not found. Run 'pod install' to update the copy resources script. +EOM + exit 1 + fi + case $RESOURCE_PATH in + *.storyboard) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .storyboard`.storyboardc" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.xib) + echo "ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile ${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib $RESOURCE_PATH --sdk ${SDKROOT} ${TARGET_DEVICE_ARGS}" + ibtool --reference-external-strings-file --errors --warnings --notices --minimum-deployment-target ${!DEPLOYMENT_TARGET_SETTING_NAME} --output-format human-readable-text --compile "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$RESOURCE_PATH\" .xib`.nib" "$RESOURCE_PATH" --sdk "${SDKROOT}" ${TARGET_DEVICE_ARGS} + ;; + *.framework) + echo "mkdir -p ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + mkdir -p "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + echo "rsync -av $RESOURCE_PATH ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + rsync -av "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" + ;; + *.xcdatamodel) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH"`.mom\"" + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodel`.mom" + ;; + *.xcdatamodeld) + echo "xcrun momc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd\"" + xcrun momc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcdatamodeld`.momd" + ;; + *.xcmappingmodel) + echo "xcrun mapc \"$RESOURCE_PATH\" \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm\"" + xcrun mapc "$RESOURCE_PATH" "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$RESOURCE_PATH" .xcmappingmodel`.cdm" + ;; + *.xcassets) + ABSOLUTE_XCASSET_FILE="$RESOURCE_PATH" + XCASSET_FILES+=("$ABSOLUTE_XCASSET_FILE") + ;; + *) + echo "$RESOURCE_PATH" + echo "$RESOURCE_PATH" >> "$RESOURCES_TO_COPY" + ;; + esac +} + +mkdir -p "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +if [[ "${ACTION}" == "install" ]] && [[ "${SKIP_INSTALL}" == "NO" ]]; then + mkdir -p "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" + rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi +rm -f "$RESOURCES_TO_COPY" + +if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ -n "$XCASSET_FILES" ] +then + # Find all other xcassets (this unfortunately includes those of path pods and other targets). + OTHER_XCASSETS=$(find "$PWD" -iname "*.xcassets" -type d) + while read line; do + if [[ $line != "${PODS_ROOT}*" ]]; then + XCASSET_FILES+=("$line") + fi + done <<<"$OTHER_XCASSETS" + + printf "%s\0" "${XCASSET_FILES[@]}" | xargs -0 xcrun actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${!DEPLOYMENT_TARGET_SETTING_NAME}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" +fi diff --git a/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-umbrella.h b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-umbrella.h new file mode 100644 index 0000000..b5c5f51 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double Pods_LogKit_TestsVersionNumber; +FOUNDATION_EXPORT const unsigned char Pods_LogKit_TestsVersionString[]; + diff --git a/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests.debug.xcconfig b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests.debug.xcconfig new file mode 100644 index 0000000..11bbe64 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests.debug.xcconfig @@ -0,0 +1,12 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/ContentKit" "$PODS_CONFIGURATION_BUILD_DIR/Ents" "$PODS_CONFIGURATION_BUILD_DIR/LogKit" "$PODS_CONFIGURATION_BUILD_DIR/RepresentationKit" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/ContentKit/ContentKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Ents/Ents.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/LogKit/LogKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/RepresentationKit/RepresentationKit.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "ContentKit" -framework "Ents" -framework "LogKit" -framework "RepresentationKit" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +OTHER_SWIFT_FLAGS[config=Debug] = -DDEBUG +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests.modulemap b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests.modulemap new file mode 100644 index 0000000..f3157f7 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests.modulemap @@ -0,0 +1,6 @@ +framework module Pods_LogKit_Tests { + umbrella header "Pods-LogKit_Tests-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests.release.xcconfig b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests.release.xcconfig new file mode 100644 index 0000000..11bbe64 --- /dev/null +++ b/Example/Pods/Target Support Files/Pods-LogKit_Tests/Pods-LogKit_Tests.release.xcconfig @@ -0,0 +1,12 @@ +ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES +FRAMEWORK_SEARCH_PATHS = $(inherited) "$PODS_CONFIGURATION_BUILD_DIR/ContentKit" "$PODS_CONFIGURATION_BUILD_DIR/Ents" "$PODS_CONFIGURATION_BUILD_DIR/LogKit" "$PODS_CONFIGURATION_BUILD_DIR/RepresentationKit" +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' +OTHER_CFLAGS = $(inherited) -iquote "$PODS_CONFIGURATION_BUILD_DIR/ContentKit/ContentKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/Ents/Ents.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/LogKit/LogKit.framework/Headers" -iquote "$PODS_CONFIGURATION_BUILD_DIR/RepresentationKit/RepresentationKit.framework/Headers" +OTHER_LDFLAGS = $(inherited) -framework "ContentKit" -framework "Ents" -framework "LogKit" -framework "RepresentationKit" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +OTHER_SWIFT_FLAGS[config=Debug] = -DDEBUG +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_PODFILE_DIR_PATH = ${SRCROOT}/. +PODS_ROOT = ${SRCROOT}/Pods diff --git a/Example/Pods/Target Support Files/RepresentationKit/Info.plist b/Example/Pods/Target Support Files/RepresentationKit/Info.plist new file mode 100644 index 0000000..02abef5 --- /dev/null +++ b/Example/Pods/Target Support Files/RepresentationKit/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIdentifier + ${PRODUCT_BUNDLE_IDENTIFIER} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.1.4 + CFBundleSignature + ???? + CFBundleVersion + ${CURRENT_PROJECT_VERSION} + NSPrincipalClass + + + diff --git a/Example/Pods/Target Support Files/RepresentationKit/RepresentationKit-dummy.m b/Example/Pods/Target Support Files/RepresentationKit/RepresentationKit-dummy.m new file mode 100644 index 0000000..fbe6f21 --- /dev/null +++ b/Example/Pods/Target Support Files/RepresentationKit/RepresentationKit-dummy.m @@ -0,0 +1,5 @@ +#import +@interface PodsDummy_RepresentationKit : NSObject +@end +@implementation PodsDummy_RepresentationKit +@end diff --git a/Example/Pods/Target Support Files/RepresentationKit/RepresentationKit-prefix.pch b/Example/Pods/Target Support Files/RepresentationKit/RepresentationKit-prefix.pch new file mode 100644 index 0000000..beb2a24 --- /dev/null +++ b/Example/Pods/Target Support Files/RepresentationKit/RepresentationKit-prefix.pch @@ -0,0 +1,12 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + diff --git a/Example/Pods/Target Support Files/RepresentationKit/RepresentationKit-umbrella.h b/Example/Pods/Target Support Files/RepresentationKit/RepresentationKit-umbrella.h new file mode 100644 index 0000000..a139d7e --- /dev/null +++ b/Example/Pods/Target Support Files/RepresentationKit/RepresentationKit-umbrella.h @@ -0,0 +1,16 @@ +#ifdef __OBJC__ +#import +#else +#ifndef FOUNDATION_EXPORT +#if defined(__cplusplus) +#define FOUNDATION_EXPORT extern "C" +#else +#define FOUNDATION_EXPORT extern +#endif +#endif +#endif + + +FOUNDATION_EXPORT double RepresentationKitVersionNumber; +FOUNDATION_EXPORT const unsigned char RepresentationKitVersionString[]; + diff --git a/Example/Pods/Target Support Files/RepresentationKit/RepresentationKit.modulemap b/Example/Pods/Target Support Files/RepresentationKit/RepresentationKit.modulemap new file mode 100644 index 0000000..b85df03 --- /dev/null +++ b/Example/Pods/Target Support Files/RepresentationKit/RepresentationKit.modulemap @@ -0,0 +1,6 @@ +framework module RepresentationKit { + umbrella header "RepresentationKit-umbrella.h" + + export * + module * { export * } +} diff --git a/Example/Pods/Target Support Files/RepresentationKit/RepresentationKit.xcconfig b/Example/Pods/Target Support Files/RepresentationKit/RepresentationKit.xcconfig new file mode 100644 index 0000000..3b2b42c --- /dev/null +++ b/Example/Pods/Target Support Files/RepresentationKit/RepresentationKit.xcconfig @@ -0,0 +1,10 @@ +CONFIGURATION_BUILD_DIR = $PODS_CONFIGURATION_BUILD_DIR/RepresentationKit +GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 +HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Private" "${PODS_ROOT}/Headers/Public" +OTHER_SWIFT_FLAGS = $(inherited) "-D" "COCOAPODS" +PODS_BUILD_DIR = $BUILD_DIR +PODS_CONFIGURATION_BUILD_DIR = $PODS_BUILD_DIR/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) +PODS_ROOT = ${SRCROOT} +PODS_TARGET_SRCROOT = ${PODS_ROOT}/RepresentationKit +PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} +SKIP_INSTALL = YES diff --git a/Example/Tests/Info.plist b/Example/Tests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/Example/Tests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Example/Tests/Tests.swift b/Example/Tests/Tests.swift new file mode 100644 index 0000000..ae1c8e2 --- /dev/null +++ b/Example/Tests/Tests.swift @@ -0,0 +1,29 @@ +import UIKit +import XCTest +import LogKit + +class Tests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + XCTAssert(true, "Pass") + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measure() { + // Put the code you want to measure the time of here. + } + } + +} diff --git a/LogKit.podspec b/LogKit.podspec new file mode 100644 index 0000000..42b1cab --- /dev/null +++ b/LogKit.podspec @@ -0,0 +1,44 @@ +# +# Be sure to run `pod lib lint LogKit.podspec' to ensure this is a +# valid spec before submitting. +# +# Any lines starting with a # are optional, but their use is encouraged +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html +# + +Pod::Spec.new do |s| + s.name = 'LogKit' + s.version = '1.1.6' + s.summary = 'Quick logging based on representations of objects.' + +# This description is used to generate tags and improve search results. +# * Think: What does it do? Why did you write it? What is the focus? +# * Try to keep it short, snappy and to the point. +# * Write the description between the DESC delimiters below. +# * Finally, don't worry about the indent, CocoaPods strips it! + + s.description = <<-DESC +TODO: Add long description of the pod here. + DESC + + s.homepage = 'https://github.com/averello/LogKit' + # s.screenshots = 'www.example.com/screenshots_1', 'www.example.com/screenshots_2' + s.license = { :type => 'MIT', :file => 'LICENSE' } + s.author = { 'Georges Boumis' => 'developer.george.boumis@gmail.com' } + s.source = { :git => 'https://github.com/averello/LogKit.git', :tag => s.version.to_s } + # s.social_media_url = 'https://twitter.com/' + + s.ios.deployment_target = '8.0' + + s.source_files = 'LogKit/Classes/**/*' + + # s.resource_bundles = { + # 'LogKit' => ['LogKit/Assets/*.png'] + # } + + # s.public_header_files = 'Pod/Classes/**/*.h' + # s.frameworks = 'UIKit', 'MapKit' + # s.dependency 'AFNetworking', '~> 2.3' + s.dependency 'RepresentationKit' + s.dependency 'ContentKit' +end diff --git a/LogKit/Assets/.gitkeep b/LogKit/Assets/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/LogKit/Classes/.gitkeep b/LogKit/Classes/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/LogKit/Classes/InMemoryLog.swift b/LogKit/Classes/InMemoryLog.swift new file mode 100644 index 0000000..6e58d92 --- /dev/null +++ b/LogKit/Classes/InMemoryLog.swift @@ -0,0 +1,47 @@ +// +// InMemoryLog.swift +// LogKit +// +// Created by Georges Boumis on 07/10/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation +import RepresentationKit +import ContentKit + +// in-memory +final public class InMemoryLog: Log { + final private var logs: [TextRepresentation] + + public init() { + self.logs = [] + } + + final public func put(entry: Representable) { + let representation = entry.represent(using: LogRepresentation()) as! TextRepresentation + self.logs.append(representation) + } + + final public func represent(using representation: Representation) -> Representation { + return self.logs.reduce(representation) { (rep, r) -> Representation in + rep.with(key: TextKey(), value: r.content) + } + } +} diff --git a/LogKit/Classes/Log.swift b/LogKit/Classes/Log.swift new file mode 100644 index 0000000..a383e4d --- /dev/null +++ b/LogKit/Classes/Log.swift @@ -0,0 +1,35 @@ +// +// Log.swift +// LogKit +// +// Created by Georges Boumis on 07/10/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation +import RepresentationKit + +/// A Log is a representable entity that when provided with representable +/// entries, logs them in implementation specific back store. +public protocol Log: Representable { + + /// Puts an entry in the log. + /// - parameter entry: the entry to log + func put(entry: Representable) +} diff --git a/LogKit/Classes/LogRepresentation.swift b/LogKit/Classes/LogRepresentation.swift new file mode 100644 index 0000000..9555b9c --- /dev/null +++ b/LogKit/Classes/LogRepresentation.swift @@ -0,0 +1,48 @@ +// +// LogRepresentation.swift +// LogKit +// +// Created by Georges Boumis on 07/10/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation +import ContentKit +import RepresentationKit + +public struct LogRepresentation: TextRepresentation { + private let _string: String + public var content: String { + return "\(self._string)" + } + + public init() { + self.init("")! + } + + public init?(_ string: String) { + self._string = string + } + + // gets key == "value" as value a String + public func with(key: Key, value: Value) -> Representation where Key: LosslessStringConvertible & Hashable { + let string = self._string + "[\(Date())]: \(value)\n" + return LogRepresentation(string)! + } +} diff --git a/LogKit/Classes/OnDiskLog.swift b/LogKit/Classes/OnDiskLog.swift new file mode 100644 index 0000000..91d77d9 --- /dev/null +++ b/LogKit/Classes/OnDiskLog.swift @@ -0,0 +1,156 @@ +// +// OnDiskLog.swift +// LogKit +// +// Created by Georges Boumis on 07/10/2016. +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +import Foundation +import RepresentationKit +import ContentKit + +final public class OnDiskLog: Log { + final fileprivate let url: URL + final fileprivate let file: FileHandle + final fileprivate lazy var path: String = { + return self.url.path + }() + + public convenience init(path: String) throws { + let url = URL(fileURLWithPath: path) + try self.init(url: url) + } + + public init(url: URL) throws { + self.url = url + let path = url.path + + let fm = FileManager.default + if fm.fileExists(atPath: path) == false { + let directory = url.deletingPathExtension().deletingLastPathComponent() + try fm.createDirectory(at: directory, + withIntermediateDirectories: true, + attributes: nil) + let result = fm.createFile(atPath: url.path, + contents: nil, + attributes: nil) + guard result else { + throw CocoaError(CocoaError.Code.fileWriteNoPermission) + } + // protect the logs + let attributes = [FileAttributeKey.protectionKey: FileProtectionType.complete] + try fm.setAttributes(attributes, ofItemAtPath: path) + } + self.file = FileHandle(forWritingAtPath: path)! + self.file.seekToEndOfFile() + } + + deinit { + self.file.closeFile() + } +} + +extension OnDiskLog { + final public func put(entry: Representable) { + self.queue.async { + self._useAutoreleasePoolIfNeeded { + self._put(entry: entry) + } + } + } + + final public func represent(using representation: Representation) -> Representation { + var result: Representation! + self.queue.sync { + self._useAutoreleasePoolIfNeeded { + result = self._represent(using: representation) + } + } + return result + } +} + +extension OnDiskLog { + final fileprivate func _useAutoreleasePoolIfNeeded(_ body: () throws -> Void) rethrows { + if #available(iOS 10.0, *) { + try body() + } + else { + try autoreleasepool(invoking: body) + } + } + + final fileprivate func _put(entry: Representable) { + let representation = entry.represent(using: LogRepresentation()) as! TextRepresentation + let content = representation.content + let data = content.data(using: String.Encoding.utf8)! + self.file.write(data) + } + + final fileprivate func _represent(using representation: Representation) -> Representation { + self.file.synchronizeFile() + let content = try! String(contentsOfFile: self.path) + return representation.with(key: TextKey(), value: content) + } +} + + +extension OnDiskLog { + private static let _queue: DispatchQueue = { + let label = "info.averello.Log.OnDiskLog" + if #available(iOS 10.0, *) { + return DispatchQueue(label: label, + qos: DispatchQoS.background, + attributes: DispatchQueue.Attributes(), + autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency.workItem, + target: nil) + } else { + let attr = __dispatch_queue_attr_make_with_qos_class(nil, QOS_CLASS_BACKGROUND, 0) + return DispatchQueue(__label: label, attr: attr) + } + }() + final fileprivate var queue: DispatchQueue { return OnDiskLog._queue } +} + +extension OnDiskLog: CustomStringConvertible { + final public var description: String { + let url = URL(fileURLWithPath: self.path) + var filename = "\(url.deletingPathExtension().lastPathComponent)" + if !url.pathExtension.isEmpty { + filename = filename.appending(".\(url.pathExtension)") + } + return "<" + + String(describing: type(of: self)) + + ": queue = \(self.queue.label);" + + " path = \(filename);" + + ">" + } +} + +extension OnDiskLog: CustomDebugStringConvertible { + final public var debugDescription: String { + return "<" + + String(describing: type(of: self)) + + ": \(Unmanaged.passUnretained(self).toOpaque());" + + " queue = \(self.queue.label);" + + " path = \(self.path);" + + ">" + } +} diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..f88af74 --- /dev/null +++ b/NOTICE @@ -0,0 +1,2 @@ +LogKit +Copyright 2016-2017 Georges Boumis diff --git a/README.md b/README.md new file mode 100644 index 0000000..737b7da --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# LogKit + +Quick logging based on representations of objects. + +## Example + +To run the example project, clone the repo, and run `pod install` from the Example directory first. + +## Requirements + +## Installation + +LogKit is available through [CocoaPods](http://cocoapods.org). To install +it, simply add the following line to your Podfile: + +```ruby +pod "LogKit" +``` + +## Author + +Georges Boumis, developer.george.boumis@gmail.com + +## License + +LogKit is available under the Apache 2.0 license. See the LICENSE file for more info. + diff --git a/_Pods.xcodeproj b/_Pods.xcodeproj new file mode 120000 index 0000000..3c5a8e7 --- /dev/null +++ b/_Pods.xcodeproj @@ -0,0 +1 @@ +Example/Pods/Pods.xcodeproj \ No newline at end of file