diff --git a/README.md b/README.md index 9292a00..59847f1 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,6 @@ public protocol Identifiable { public protocol Persistable: Identifiable { static var collection: String { get } - var metadata: MetadataType? { get set } } ``` @@ -41,26 +40,11 @@ While not a requirement of YapDatabase, for these extensions, it is required tha There is also a `YapDB.Index` struct which composes the key and collection into a single type. This is used internally for all access methods. Properties defined in an extension on `Persistable` provide access to `key` and `index`. ### Metadata -YapDatabase supports storing metadata alongside the primary object. YapDatabaseExtensions supports automatic reading and writing of metadata as an optional property of the `Persistable` type. +YapDatabase supports storing metadata alongside the primary object. YapDatabaseExtensions supports optional reading and writing of metadata alongside a `Persistable` type. -By default, all types which conform to `Persistable`, will get a `MetadataType` of `Void` which is synthesized by default. Therefore if you do not want or need a metadata type, there is nothing to do. +Your custom metadata types must conform to either `NSCoding` or `ValueCoding`. -To support a custom metadata type, just add the following to your `Persistable` type, e.g.: - -```swift -struct MyCustomValue: Persistable, ValueCoding { - typealias Coder = MyCustomValueCoder - static let collection = “MyCustomValues” - var metadata: MyCustomMetadata? = .None - let identifier: NSUUID -} -``` - -where the type (`MyCustomMetadata` in the above snippet) implements either `NSCoding` or `ValueCoding`. - -When creating a new item, set the metadata property before saving the item to the database. YapDatabaseExtensions will then save the metadata inside YapDatabase correctly. *There is no need to encode the metadata inside the primary object*. When reading objects which have a valid `MetadataType`, YapDatabaseExtensions will automatically read, decode and set the item’s metadata before returning the item. - -Note that previous metadata protocols `ObjectMetadataPersistable` and `ValueMetadataPersistable` have been deprecated in favor of `Persistable`. +In this version of YapDatabaseExtensions, metadata has been removed from `Persistable`, and all reads and writes of metadata must be done explicitly. Additionally, since the `MetadataType` is decoupled from the `Persistable` type, a single `Persistable` type can use many different types of metadata, as appropriate. When you want to read or write a value and it's metadata together, you use the "withMetadata" variants of the API, which accept and return `YapItem` values. `YapItem` is basically a slightly nicer wrapper than a Swift tuple, which can be extended, unlike anonymous tuple types. ## “Correct” Type Patterns Because the generic protocols, `ValueCoding` and `CodingType` have self-reflective properties, they must be correctly implemented for the APIs to be available. This means that the equality `ValueCoding.Coder.ValueType == Self` must be met. The APIs are all composed with this represented in their generic where clauses. This means that if your `ValueCoding` type is not the `ValueType` of its `Coder`, your code will not compile. @@ -69,10 +53,10 @@ Therefore, there are six valid `Persistable` type patterns as described in the t Item encoding | Metadata encoding | Pattern --------------|-------------------|------------------ -`NSCoding` | `Void` Metadata | Object +`NSCoding` | No Metadata | Object `NSCoding` | `NSCoding` | ObjectWithObjectMetadata `NSCoding` | `ValueCoding` | ObjectWithValueMetadata -`ValueCoding` | `Void` Metadata | Value +`ValueCoding` | No Metadata | Value `ValueCoding` | `NSCoding` | ValueWithObjectMetadata `ValueCoding` | `ValueCoding` | ValueWithValueMetadata @@ -118,7 +102,7 @@ if let item: Item? = connection.readAtIndex(index) { // etc } -if let meta: Item.MetadataType? = connection.readMetadataAtIndex(index) { +if let meta: MetadataType? = connection.readMetadataAtIndex(index) { // etc } @@ -138,7 +122,7 @@ connection.read { transaction in let c: [Item] = transaction.readAtIndexes(indexes) let d: [Item] = transaction.readByKeys(keys) let all: [Item] = transaction.readAll() - let meta: [Item.MetadataType] = transaction.readMetadataAtIndexes(indexes) + let meta: [MetadataType] = transaction.readMetadataAtIndexes(indexes) } ``` @@ -166,10 +150,17 @@ Reading items from the database is a little different. ```swift // Read using a YapDB.Index. -if let item = Item.read(transaction).byIndex(index) { +if let item = Item.read(transaction).atIndex(index) { // etc - item is correct type, no casting required. } +// Read value and metadata using a YapDB.Index. +if let item: YapItem? = Item.read(transaction).withMetadataAtIndex(index) { + // etc - item is a correct type, no casting required. + // item.value contains the value + // item.metadata contains the metadata, wrapped in an Optional +} + // Read an array of items from an array of YapDB.Index(s) let items = Item.read(transaction).atIndexes(indexes) @@ -192,7 +183,7 @@ let (items, missingKeys) = Item.read(transaction).filterExisting(someKeys) Similarly, to work directly on a `YapDatabaseConnection`, use the following: ```swift -if let item = Item.read(connection).byIndex(index) { +if let item = Item.read(connection).atIndex(index) { // etc - item is correct type, no casting required. } @@ -233,6 +224,7 @@ To start working in this repository’s `YapDatabaseExtensions.xcodeproj`, you ## Author Daniel Thorpe, [@danthorpe](https://twitter.com/danthorpe) +Jim Roepcke, [@JimRoepcke](https://twitter.com/JimRoepcke) ## License diff --git a/Sources/Curried_ObjectWithNoMetadata.swift b/Sources/Curried_ObjectWithNoMetadata.swift index 55d7062..4ec7b60 100644 --- a/Sources/Curried_ObjectWithNoMetadata.swift +++ b/Sources/Curried_ObjectWithNoMetadata.swift @@ -12,8 +12,7 @@ import ValueCoding // MARK: - Persistable extension Persistable where - Self: NSCoding, - Self.MetadataType == Void { + Self: NSCoding { /** Returns a closure which, given a read transaction will return diff --git a/Sources/Curried_ObjectWithObjectMetadata.swift b/Sources/Curried_ObjectWithObjectMetadata.swift index d763a90..77587cb 100644 --- a/Sources/Curried_ObjectWithObjectMetadata.swift +++ b/Sources/Curried_ObjectWithObjectMetadata.swift @@ -12,8 +12,7 @@ import ValueCoding // MARK: - Persistable extension Persistable where - Self: NSCoding, - Self.MetadataType: NSCoding { + Self: NSCoding { /** Returns a closure which, given a read transaction will return @@ -22,10 +21,11 @@ extension Persistable where - parameter index: a YapDB.Index - returns: a (ReadTransaction) -> Self? closure. */ - public static func readAtIndex< - ReadTransaction where - ReadTransaction: ReadTransactionType>(index: YapDB.Index) -> ReadTransaction -> Self? { - return { $0.readAtIndex(index) } + public static func readWithMetadataAtIndex< + ReadTransaction, Metadata where + ReadTransaction: ReadTransactionType, + Metadata: NSCoding>(index: YapDB.Index) -> ReadTransaction -> YapItem? { + return { $0.readWithMetadataAtIndex(index) } } /** @@ -35,12 +35,13 @@ extension Persistable where - parameter indexes: a SequenceType of YapDB.Index values - returns: a (ReadTransaction) -> [Self] closure. */ - public static func readAtIndexes< - Indexes, ReadTransaction where + public static func readWithMetadataAtIndexes< + Indexes, ReadTransaction, Metadata where Indexes: SequenceType, Indexes.Generator.Element == YapDB.Index, - ReadTransaction: ReadTransactionType>(indexes: Indexes) -> ReadTransaction -> [Self] { - return { $0.readAtIndexes(indexes) } + ReadTransaction: ReadTransactionType, + Metadata: NSCoding>(indexes: Indexes) -> ReadTransaction -> [YapItem] { + return { $0.readWithMetadataAtIndexes(indexes) } } /** @@ -50,10 +51,11 @@ extension Persistable where - parameter key: a String - returns: a (ReadTransaction) -> Self? closure. */ - public static func readByKey< - ReadTransaction where - ReadTransaction: ReadTransactionType>(key: String) -> ReadTransaction -> Self? { - return { $0.readByKey(key) } + public static func readWithMetadataByKey< + ReadTransaction, Metadata where + ReadTransaction: ReadTransactionType, + Metadata: NSCoding>(key: String) -> ReadTransaction -> YapItem? { + return { $0.readWithMetadataByKey(key) } } /** @@ -63,12 +65,13 @@ extension Persistable where - parameter keys: a SequenceType of String values - returns: a (ReadTransaction) -> [Self] closure. */ - public static func readByKeys< - Keys, ReadTransaction where + public static func readWithMetadataByKeys< + Keys, ReadTransaction, Metadata where Keys: SequenceType, Keys.Generator.Element == String, - ReadTransaction: ReadTransactionType>(keys: Keys) -> ReadTransaction -> [Self] { - return { $0.readAtIndexes(Self.indexesWithKeys(keys)) } + ReadTransaction: ReadTransactionType, + Metadata: NSCoding>(keys: Keys) -> ReadTransaction -> [YapItem] { + return { $0.readWithMetadataAtIndexes(Self.indexesWithKeys(keys)) } } /** @@ -78,7 +81,10 @@ extension Persistable where - warning: Be aware that this will capure `self`. - returns: a (WriteTransaction) -> Self closure */ - public func write() -> WriteTransaction -> Self { - return { $0.write(self) } + public func writeWithMetadata< + WriteTransaction, Metadata where + WriteTransaction: WriteTransactionType, + Metadata: NSCoding>(metadata: Metadata? = nil) -> WriteTransaction -> YapItem { + return { $0.writeWithMetadata(YapItem(self, metadata)) } } } diff --git a/Sources/Curried_ObjectWithValueMetadata.swift b/Sources/Curried_ObjectWithValueMetadata.swift index 6690f2f..9dd1702 100644 --- a/Sources/Curried_ObjectWithValueMetadata.swift +++ b/Sources/Curried_ObjectWithValueMetadata.swift @@ -12,10 +12,7 @@ import ValueCoding // MARK: - Persistable extension Persistable where - Self: NSCoding, - Self.MetadataType: ValueCoding, - Self.MetadataType.Coder: NSCoding, - Self.MetadataType.Coder.ValueType == Self.MetadataType { + Self: NSCoding { /** Returns a closure which, given a read transaction will return @@ -24,10 +21,13 @@ extension Persistable where - parameter index: a YapDB.Index - returns: a (ReadTransaction) -> Self? closure. */ - public static func readAtIndex< - ReadTransaction where - ReadTransaction: ReadTransactionType>(index: YapDB.Index) -> ReadTransaction -> Self? { - return { $0.readAtIndex(index) } + public static func readWithMetadataAtIndex< + ReadTransaction, Metadata where + ReadTransaction: ReadTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(index: YapDB.Index) -> ReadTransaction -> YapItem? { + return { $0.readWithMetadataAtIndex(index) } } /** @@ -37,12 +37,15 @@ extension Persistable where - parameter indexes: a SequenceType of YapDB.Index values - returns: a (ReadTransaction) -> [Self] closure. */ - public static func readAtIndexes< - Indexes, ReadTransaction where + public static func readWithMetadataAtIndexes< + Indexes, ReadTransaction, Metadata where Indexes: SequenceType, Indexes.Generator.Element == YapDB.Index, - ReadTransaction: ReadTransactionType>(indexes: Indexes) -> ReadTransaction -> [Self] { - return { $0.readAtIndexes(indexes) } + ReadTransaction: ReadTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(indexes: Indexes) -> ReadTransaction -> [YapItem] { + return { $0.readWithMetadataAtIndexes(indexes) } } /** @@ -52,10 +55,13 @@ extension Persistable where - parameter key: a String - returns: a (ReadTransaction) -> Self? closure. */ - public static func readByKey< - ReadTransaction where - ReadTransaction: ReadTransactionType>(key: String) -> ReadTransaction -> Self? { - return { $0.readByKey(key) } + public static func readWithMetadataByKey< + ReadTransaction, Metadata where + ReadTransaction: ReadTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(key: String) -> ReadTransaction -> YapItem? { + return { $0.readWithMetadataByKey(key) } } /** @@ -65,12 +71,15 @@ extension Persistable where - parameter keys: a SequenceType of String values - returns: a (ReadTransaction) -> [Self] closure. */ - public static func readByKeys< - Keys, ReadTransaction where + public static func readWithMetadataByKeys< + Keys, ReadTransaction, Metadata where Keys: SequenceType, Keys.Generator.Element == String, - ReadTransaction: ReadTransactionType>(keys: Keys) -> ReadTransaction -> [Self] { - return { $0.readAtIndexes(Self.indexesWithKeys(keys)) } + ReadTransaction: ReadTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(keys: Keys) -> ReadTransaction -> [YapItem] { + return { $0.readWithMetadataAtIndexes(Self.indexesWithKeys(keys)) } } /** @@ -80,7 +89,12 @@ extension Persistable where - warning: Be aware that this will capure `self`. - returns: a (WriteTransaction) -> Self closure */ - public func write() -> WriteTransaction -> Self { - return { $0.write(self) } + public func writeWithMetadata< + WriteTransaction, Metadata where + WriteTransaction: WriteTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(metadata: Metadata? = nil) -> WriteTransaction -> YapItem { + return { $0.writeWithMetadata(YapItem(self, metadata)) } } } diff --git a/Sources/Curried_ValueWithNoMetadata.swift b/Sources/Curried_ValueWithNoMetadata.swift index 3fc1df7..60cd00a 100644 --- a/Sources/Curried_ValueWithNoMetadata.swift +++ b/Sources/Curried_ValueWithNoMetadata.swift @@ -14,8 +14,7 @@ import ValueCoding extension Persistable where Self: ValueCoding, Self.Coder: NSCoding, - Self.Coder.ValueType == Self, - Self.MetadataType == Void { + Self.Coder.ValueType == Self { /** Returns a closure which, given a read transaction will return diff --git a/Sources/Curried_ValueWithObjectMetadata.swift b/Sources/Curried_ValueWithObjectMetadata.swift index 6245a38..6ff0779 100644 --- a/Sources/Curried_ValueWithObjectMetadata.swift +++ b/Sources/Curried_ValueWithObjectMetadata.swift @@ -14,8 +14,7 @@ import ValueCoding extension Persistable where Self: ValueCoding, Self.Coder: NSCoding, - Self.Coder.ValueType == Self, - Self.MetadataType: NSCoding { + Self.Coder.ValueType == Self { /** Returns a closure which, given a read transaction will return @@ -24,10 +23,11 @@ extension Persistable where - parameter index: a YapDB.Index - returns: a (ReadTransaction) -> Self? closure. */ - public static func readAtIndex< - ReadTransaction where - ReadTransaction: ReadTransactionType>(index: YapDB.Index) -> ReadTransaction -> Self? { - return { $0.readAtIndex(index) } + public static func readWithMetadataAtIndex< + ReadTransaction, Metadata where + ReadTransaction: ReadTransactionType, + Metadata: NSCoding>(index: YapDB.Index) -> ReadTransaction -> YapItem? { + return { $0.readWithMetadataAtIndex(index) } } /** @@ -37,12 +37,13 @@ extension Persistable where - parameter indexes: a SequenceType of YapDB.Index values - returns: a (ReadTransaction) -> [Self] closure. */ - public static func readAtIndexes< - Indexes, ReadTransaction where + public static func readWithMetadataAtIndexes< + Indexes, ReadTransaction, Metadata where Indexes: SequenceType, Indexes.Generator.Element == YapDB.Index, - ReadTransaction: ReadTransactionType>(indexes: Indexes) -> ReadTransaction -> [Self] { - return { $0.readAtIndexes(indexes) } + ReadTransaction: ReadTransactionType, + Metadata: NSCoding>(indexes: Indexes) -> ReadTransaction -> [YapItem] { + return { $0.readWithMetadataAtIndexes(indexes) } } /** @@ -52,10 +53,11 @@ extension Persistable where - parameter key: a String - returns: a (ReadTransaction) -> Self? closure. */ - public static func readByKey< - ReadTransaction where - ReadTransaction: ReadTransactionType>(key: String) -> ReadTransaction -> Self? { - return { $0.readByKey(key) } + public static func readWithMetadataByKey< + ReadTransaction, Metadata where + ReadTransaction: ReadTransactionType, + Metadata: NSCoding>(key: String) -> ReadTransaction -> YapItem? { + return { $0.readWithMetadataByKey(key) } } /** @@ -65,12 +67,13 @@ extension Persistable where - parameter keys: a SequenceType of String values - returns: a (ReadTransaction) -> [Self] closure. */ - public static func readByKeys< - Keys, ReadTransaction where + public static func readWithMetadataByKeys< + Keys, ReadTransaction, Metadata where Keys: SequenceType, Keys.Generator.Element == String, - ReadTransaction: ReadTransactionType>(keys: Keys) -> ReadTransaction -> [Self] { - return { $0.readAtIndexes(Self.indexesWithKeys(keys)) } + ReadTransaction: ReadTransactionType, + Metadata: NSCoding>(keys: Keys) -> ReadTransaction -> [YapItem] { + return { $0.readWithMetadataAtIndexes(Self.indexesWithKeys(keys)) } } /** @@ -80,7 +83,10 @@ extension Persistable where - warning: Be aware that this will capure `self`. - returns: a (WriteTransaction) -> Self closure */ - public func write() -> WriteTransaction -> Self { - return { $0.write(self) } + public func writeWithMetadata< + WriteTransaction, Metadata where + WriteTransaction: WriteTransactionType, + Metadata: NSCoding>(metadata: Metadata? = nil) -> WriteTransaction -> YapItem { + return { $0.writeWithMetadata(YapItem(self, metadata)) } } } diff --git a/Sources/Curried_ValueWithValueMetadata.swift b/Sources/Curried_ValueWithValueMetadata.swift index c59f580..4525175 100644 --- a/Sources/Curried_ValueWithValueMetadata.swift +++ b/Sources/Curried_ValueWithValueMetadata.swift @@ -14,10 +14,7 @@ import ValueCoding extension Persistable where Self: ValueCoding, Self.Coder: NSCoding, - Self.Coder.ValueType == Self, - Self.MetadataType: ValueCoding, - Self.MetadataType.Coder: NSCoding, - Self.MetadataType.Coder.ValueType == Self.MetadataType { + Self.Coder.ValueType == Self { /** Returns a closure which, given a read transaction will return @@ -26,10 +23,13 @@ extension Persistable where - parameter index: a YapDB.Index - returns: a (ReadTransaction) -> Self? closure. */ - public static func readAtIndex< - ReadTransaction where - ReadTransaction: ReadTransactionType>(index: YapDB.Index) -> ReadTransaction -> Self? { - return { $0.readAtIndex(index) } + public static func readWithMetadataAtIndex< + ReadTransaction, Metadata where + ReadTransaction: ReadTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(index: YapDB.Index) -> ReadTransaction -> YapItem? { + return { $0.readWithMetadataAtIndex(index) } } /** @@ -39,12 +39,15 @@ extension Persistable where - parameter indexes: a SequenceType of YapDB.Index values - returns: a (ReadTransaction) -> [Self] closure. */ - public static func readAtIndexes< - Indexes, ReadTransaction where + public static func readWithMetadataAtIndexes< + Indexes, ReadTransaction, Metadata where Indexes: SequenceType, Indexes.Generator.Element == YapDB.Index, - ReadTransaction: ReadTransactionType>(indexes: Indexes) -> ReadTransaction -> [Self] { - return { $0.readAtIndexes(indexes) } + ReadTransaction: ReadTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(indexes: Indexes) -> ReadTransaction -> [YapItem] { + return { $0.readWithMetadataAtIndexes(indexes) } } /** @@ -54,10 +57,13 @@ extension Persistable where - parameter key: a String - returns: a (ReadTransaction) -> Self? closure. */ - public static func readByKey< - ReadTransaction where - ReadTransaction: ReadTransactionType>(key: String) -> ReadTransaction -> Self? { - return { $0.readByKey(key) } + public static func readWithMetadataByKey< + ReadTransaction, Metadata where + ReadTransaction: ReadTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(key: String) -> ReadTransaction -> YapItem? { + return { $0.readWithMetadataByKey(key) } } /** @@ -67,12 +73,15 @@ extension Persistable where - parameter keys: a SequenceType of String values - returns: a (ReadTransaction) -> [Self] closure. */ - public static func readByKeys< - Keys, ReadTransaction where + public static func readWithMetadataByKeys< + Keys, ReadTransaction, Metadata where Keys: SequenceType, Keys.Generator.Element == String, - ReadTransaction: ReadTransactionType>(keys: Keys) -> ReadTransaction -> [Self] { - return { $0.readAtIndexes(Self.indexesWithKeys(keys)) } + ReadTransaction: ReadTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(keys: Keys) -> ReadTransaction -> [YapItem] { + return { $0.readWithMetadataAtIndexes(Self.indexesWithKeys(keys)) } } /** @@ -82,7 +91,12 @@ extension Persistable where - warning: Be aware that this will capure `self`. - returns: a (WriteTransaction) -> Self closure */ - public func write() -> WriteTransaction -> Self { - return { $0.write(self) } + public func writeWithMetadata< + WriteTransaction, Metadata where + WriteTransaction: WriteTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(metadata: Metadata? = nil) -> WriteTransaction -> YapItem { + return { $0.writeWithMetadata(YapItem(self, metadata)) } } } diff --git a/Sources/Functional_ObjectWithNoMetadata.swift b/Sources/Functional_ObjectWithNoMetadata.swift index 5100354..6cebd10 100644 --- a/Sources/Functional_ObjectWithNoMetadata.swift +++ b/Sources/Functional_ObjectWithNoMetadata.swift @@ -21,11 +21,10 @@ extension ReadTransactionType { - returns: an optional `ItemType` */ public func readAtIndex< - ObjectWithNoMetadata where - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(index: YapDB.Index) -> ObjectWithNoMetadata? { - return readAtIndex(index) as? ObjectWithNoMetadata + Object where + Object: Persistable, + Object: NSCoding>(index: YapDB.Index) -> Object? { + return readAtIndex(index) as? Object } /** @@ -35,12 +34,11 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ public func readAtIndexes< - Indexes, ObjectWithNoMetadata where + Indexes, Object where Indexes: SequenceType, Indexes.Generator.Element == YapDB.Index, - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(indexes: Indexes) -> [ObjectWithNoMetadata] { + Object: Persistable, + Object: NSCoding>(indexes: Indexes) -> [Object] { return indexes.flatMap(readAtIndex) } @@ -51,11 +49,10 @@ extension ReadTransactionType { - returns: an optional `ItemType` */ public func readByKey< - ObjectWithNoMetadata where - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(key: String) -> ObjectWithNoMetadata? { - return readAtIndex(ObjectWithNoMetadata.indexWithKey(key)) + Object where + Object: Persistable, + Object: NSCoding>(key: String) -> Object? { + return readAtIndex(Object.indexWithKey(key)) } /** @@ -65,13 +62,12 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ public func readByKeys< - Keys, ObjectWithNoMetadata where + Keys, Object where Keys: SequenceType, Keys.Generator.Element == String, - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(keys: Keys) -> [ObjectWithNoMetadata] { - return readAtIndexes(ObjectWithNoMetadata.indexesWithKeys(keys)) + Object: Persistable, + Object: NSCoding>(keys: Keys) -> [Object] { + return readAtIndexes(Object.indexesWithKeys(keys)) } /** @@ -80,11 +76,10 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ public func readAll< - ObjectWithNoMetadata where - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>() -> [ObjectWithNoMetadata] { - return readByKeys(keysInCollection(ObjectWithNoMetadata.collection)) + Object where + Object: Persistable, + Object: NSCoding>() -> [Object] { + return readByKeys(keysInCollection(Object.collection)) } } @@ -97,10 +92,9 @@ extension ConnectionType { - returns: an optional `ItemType` */ public func readAtIndex< - ObjectWithNoMetadata where - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(index: YapDB.Index) -> ObjectWithNoMetadata? { + Object where + Object: Persistable, + Object: NSCoding>(index: YapDB.Index) -> Object? { return read { $0.readAtIndex(index) } } @@ -111,12 +105,11 @@ extension ConnectionType { - returns: an array of `ItemType` */ public func readAtIndexes< - Indexes, ObjectWithNoMetadata where + Indexes, Object where Indexes: SequenceType, Indexes.Generator.Element == YapDB.Index, - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(indexes: Indexes) -> [ObjectWithNoMetadata] { + Object: Persistable, + Object: NSCoding>(indexes: Indexes) -> [Object] { return read { $0.readAtIndexes(indexes) } } @@ -127,11 +120,10 @@ extension ConnectionType { - returns: an optional `ItemType` */ public func readByKey< - ObjectWithNoMetadata where - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(key: String) -> ObjectWithNoMetadata? { - return readAtIndex(ObjectWithNoMetadata.indexWithKey(key)) + Object where + Object: Persistable, + Object: NSCoding>(key: String) -> Object? { + return readAtIndex(Object.indexWithKey(key)) } /** @@ -141,13 +133,12 @@ extension ConnectionType { - returns: an array of `ItemType` */ public func readByKeys< - Keys, ObjectWithNoMetadata where + Keys, Object where Keys: SequenceType, Keys.Generator.Element == String, - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(keys: Keys) -> [ObjectWithNoMetadata] { - return readAtIndexes(ObjectWithNoMetadata.indexesWithKeys(keys)) + Object: Persistable, + Object: NSCoding>(keys: Keys) -> [Object] { + return readAtIndexes(Object.indexesWithKeys(keys)) } /** @@ -156,10 +147,9 @@ extension ConnectionType { - returns: an array of `ItemType` */ public func readAll< - ObjectWithNoMetadata where - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>() -> [ObjectWithNoMetadata] { + Object where + Object: Persistable, + Object: NSCoding>() -> [Object] { return read { $0.readAll() } } } @@ -175,10 +165,9 @@ extension WriteTransactionType { - returns: the same item */ public func write< - ObjectWithNoMetadata where - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(item: ObjectWithNoMetadata) -> ObjectWithNoMetadata { + Object where + Object: Persistable, + Object: NSCoding>(item: Object) -> Object { writeAtIndex(item.index, object: item, metadata: .None) return item } @@ -190,12 +179,11 @@ extension WriteTransactionType { - returns: the same items, in an array. */ public func write< - Items, ObjectWithNoMetadata where + Items, Object where Items: SequenceType, - Items.Generator.Element == ObjectWithNoMetadata, - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(items: Items) -> [ObjectWithNoMetadata] { + Items.Generator.Element == Object, + Object: Persistable, + Object: NSCoding>(items: Items) -> [Object] { return items.map(write) } } @@ -209,10 +197,9 @@ extension ConnectionType { - returns: the same item */ public func write< - ObjectWithNoMetadata where - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(item: ObjectWithNoMetadata) -> ObjectWithNoMetadata { + Object where + Object: Persistable, + Object: NSCoding>(item: Object) -> Object { return write { $0.write(item) } } @@ -223,12 +210,11 @@ extension ConnectionType { - returns: the same items, in an array. */ public func write< - Items, ObjectWithNoMetadata where + Items, Object where Items: SequenceType, - Items.Generator.Element == ObjectWithNoMetadata, - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(items: Items) -> [ObjectWithNoMetadata] { + Items.Generator.Element == Object, + Object: Persistable, + Object: NSCoding>(items: Items) -> [Object] { return write { $0.write(items) } } @@ -240,10 +226,9 @@ extension ConnectionType { - parameter completion: a dispatch_block_t for completion. */ public func asyncWrite< - ObjectWithNoMetadata where - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(item: ObjectWithNoMetadata, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (ObjectWithNoMetadata -> Void)? = .None) { + Object where + Object: Persistable, + Object: NSCoding>(item: Object, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (Object -> Void)? = .None) { asyncWrite({ $0.write(item) }, queue: queue, completion: completion) } @@ -255,12 +240,11 @@ extension ConnectionType { - parameter completion: a dispatch_block_t for completion. */ public func asyncWrite< - Items, ObjectWithNoMetadata where + Items, Object where Items: SequenceType, - Items.Generator.Element == ObjectWithNoMetadata, - ObjectWithNoMetadata: Persistable, - ObjectWithNoMetadata: NSCoding, - ObjectWithNoMetadata.MetadataType == Void>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([ObjectWithNoMetadata] -> Void)? = .None) { + Items.Generator.Element == Object, + Object: Persistable, + Object: NSCoding>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([Object] -> Void)? = .None) { asyncWrite({ $0.write(items) }, queue: queue, completion: completion) } } diff --git a/Sources/Functional_ObjectWithObjectMetadata.swift b/Sources/Functional_ObjectWithObjectMetadata.swift index baeb3c9..3a9d98d 100644 --- a/Sources/Functional_ObjectWithObjectMetadata.swift +++ b/Sources/Functional_ObjectWithObjectMetadata.swift @@ -20,16 +20,14 @@ extension ReadTransactionType { - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func readAtIndex< - ObjectWithObjectMetadata where - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(index: YapDB.Index) -> ObjectWithObjectMetadata? { - if var item = readAtIndex(index) as? ObjectWithObjectMetadata { - item.metadata = readMetadataAtIndex(index) - return item - } - return .None + public func readWithMetadataAtIndex< + Object, Metadata where + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding>(index: YapDB.Index) -> YapItem? { + guard let item: Object = readAtIndex(index) else { return nil } + let metadata: Metadata? = readMetadataAtIndex(index) + return YapItem(item, metadata) } /** @@ -38,14 +36,15 @@ extension ReadTransactionType { - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func readAtIndexes< - Indexes, ObjectWithObjectMetadata where + public func readWithMetadataAtIndexes< + Indexes, Object, Metadata where Indexes: SequenceType, Indexes.Generator.Element == YapDB.Index, - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(indexes: Indexes) -> [ObjectWithObjectMetadata] { - return indexes.flatMap(readAtIndex) + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding>(indexes: Indexes) -> [YapItem] { + // FIXME: using flatMap means the output length need not match the input length + return indexes.flatMap(readWithMetadataAtIndex) } /** @@ -54,12 +53,12 @@ extension ReadTransactionType { - parameter key: a String - returns: an optional `ItemType` */ - public func readByKey< - ObjectWithObjectMetadata where - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(key: String) -> ObjectWithObjectMetadata? { - return readAtIndex(ObjectWithObjectMetadata.indexWithKey(key)) + public func readWithMetadataByKey< + Object, Metadata where + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding>(key: String) -> YapItem? { + return readWithMetadataAtIndex(Object.indexWithKey(key)) } /** @@ -68,14 +67,14 @@ extension ReadTransactionType { - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func readByKeys< - Keys, ObjectWithObjectMetadata where + public func readWithMetadataByKeys< + Keys, Object, Metadata where Keys: SequenceType, Keys.Generator.Element == String, - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(keys: Keys) -> [ObjectWithObjectMetadata] { - return readAtIndexes(ObjectWithObjectMetadata.indexesWithKeys(keys)) + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding>(keys: Keys) -> [YapItem] { + return readWithMetadataAtIndexes(Object.indexesWithKeys(keys)) } /** @@ -83,12 +82,12 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ - public func readAll< - ObjectWithObjectMetadata where - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>() -> [ObjectWithObjectMetadata] { - return readByKeys(keysInCollection(ObjectWithObjectMetadata.collection)) + public func readWithMetadataAll< + Object, Metadata where + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding>() -> [YapItem] { + return readWithMetadataByKeys(keysInCollection(Object.collection)) } } @@ -100,12 +99,12 @@ extension ConnectionType { - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func readAtIndex< - ObjectWithObjectMetadata where - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(index: YapDB.Index) -> ObjectWithObjectMetadata? { - return read { $0.readAtIndex(index) } + public func readWithMetadataAtIndex< + Object, Metadata where + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding>(index: YapDB.Index) -> YapItem? { + return read { $0.readWithMetadataAtIndex(index) } } /** @@ -114,14 +113,14 @@ extension ConnectionType { - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func readAtIndexes< - Indexes, ObjectWithObjectMetadata where + public func readWithMetadataAtIndexes< + Indexes, Object, Metadata where Indexes: SequenceType, Indexes.Generator.Element == YapDB.Index, - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(indexes: Indexes) -> [ObjectWithObjectMetadata] { - return read { $0.readAtIndexes(indexes) } + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding>(indexes: Indexes) -> [YapItem] { + return read { $0.readWithMetadataAtIndexes(indexes) } } /** @@ -130,12 +129,12 @@ extension ConnectionType { - parameter key: a String - returns: an optional `ItemType` */ - public func readByKey< - ObjectWithObjectMetadata where - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(key: String) -> ObjectWithObjectMetadata? { - return readAtIndex(ObjectWithObjectMetadata.indexWithKey(key)) + public func readWithMetadataByKey< + Object, Metadata where + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding>(key: String) -> YapItem? { + return readWithMetadataAtIndex(Object.indexWithKey(key)) } /** @@ -144,14 +143,14 @@ extension ConnectionType { - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func readByKeys< - Keys, ObjectWithObjectMetadata where + public func readWithMetadataByKeys< + Keys, Object, Metadata where Keys: SequenceType, Keys.Generator.Element == String, - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(keys: Keys) -> [ObjectWithObjectMetadata] { - return readAtIndexes(ObjectWithObjectMetadata.indexesWithKeys(keys)) + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding>(keys: Keys) -> [YapItem] { + return readWithMetadataAtIndexes(Object.indexesWithKeys(keys)) } /** @@ -159,12 +158,12 @@ extension ConnectionType { - returns: an array of `ItemType` */ - public func readAll< - ObjectWithObjectMetadata where - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>() -> [ObjectWithObjectMetadata] { - return read { $0.readAll() } + public func readWithMetadataAll< + Object, Metadata where + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding>() -> [YapItem] { + return read { $0.readWithMetadataAll() } } } @@ -177,12 +176,12 @@ extension WriteTransactionType { - parameter item: the item to store. */ - public func write< - ObjectWithObjectMetadata where - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(item: ObjectWithObjectMetadata) -> ObjectWithObjectMetadata { - writeAtIndex(item.index, object: item, metadata: item.metadata) + public func writeWithMetadata< + Object, Metadata where + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding>(item: YapItem) -> YapItem { + writeAtIndex(item.value.index, object: item.value, metadata: item.metadata) return item } @@ -191,14 +190,14 @@ extension WriteTransactionType { - parameter items: a SequenceType of items to store. */ - public func write< - Items, ObjectWithObjectMetadata where + public func writeWithMetadata< + Items, Object, Metadata where Items: SequenceType, - Items.Generator.Element == ObjectWithObjectMetadata, - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(items: Items) -> [ObjectWithObjectMetadata] { - return items.map(write) + Items.Generator.Element == YapItem, + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding>(items: Items) -> [YapItem] { + return items.map(writeWithMetadata) } } @@ -209,12 +208,12 @@ extension ConnectionType { - parameter item: the item to store. */ - public func write< - ObjectWithObjectMetadata where - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(item: ObjectWithObjectMetadata) -> ObjectWithObjectMetadata { - return write { $0.write(item) } + public func writeWithMetadata< + Object, Metadata where + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding>(item: YapItem) -> YapItem { + return write { $0.writeWithMetadata(item) } } /** @@ -222,14 +221,14 @@ extension ConnectionType { - parameter items: a SequenceType of items to store. */ - public func write< - Items, ObjectWithObjectMetadata where + public func writeWithMetadata< + Items, Object, Metadata where Items: SequenceType, - Items.Generator.Element == ObjectWithObjectMetadata, - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(items: Items) -> [ObjectWithObjectMetadata] { - return write { $0.write(items) } + Items.Generator.Element == YapItem, + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding>(items: Items) -> [YapItem] { + return write { $0.writeWithMetadata(items) } } /** @@ -239,12 +238,12 @@ extension ConnectionType { - parameter queue: the dispatch_queue_t to run the completion block on. - parameter completion: a dispatch_block_t for completion. */ - public func asyncWrite< - ObjectWithObjectMetadata where - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(item: ObjectWithObjectMetadata, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (ObjectWithObjectMetadata -> Void)? = .None) { - asyncWrite({ $0.write(item) }, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Object, Metadata where + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding>(item: YapItem, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (YapItem -> Void)? = .None) { + asyncWrite({ $0.writeWithMetadata(item) }, queue: queue, completion: completion) } /** @@ -254,14 +253,14 @@ extension ConnectionType { - parameter queue: the dispatch_queue_t to run the completion block on. - parameter completion: a dispatch_block_t for completion. */ - public func asyncWrite< - Items, ObjectWithObjectMetadata where + public func asyncWriteWithMetadata< + Items, Object, Metadata where Items: SequenceType, - Items.Generator.Element == ObjectWithObjectMetadata, - ObjectWithObjectMetadata: Persistable, - ObjectWithObjectMetadata: NSCoding, - ObjectWithObjectMetadata.MetadataType: NSCoding>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([ObjectWithObjectMetadata] -> Void)? = .None) { - asyncWrite({ $0.write(items) }, queue: queue, completion: completion) + Items.Generator.Element == YapItem, + Object: Persistable, + Object: NSCoding, + Metadata: NSCoding>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([YapItem] -> Void)? = .None) { + asyncWrite({ $0.writeWithMetadata(items) }, queue: queue, completion: completion) } } diff --git a/Sources/Functional_ObjectWithValueMetadata.swift b/Sources/Functional_ObjectWithValueMetadata.swift index 30ee717..ca78eb5 100644 --- a/Sources/Functional_ObjectWithValueMetadata.swift +++ b/Sources/Functional_ObjectWithValueMetadata.swift @@ -20,18 +20,16 @@ extension ReadTransactionType { - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func readAtIndex< - ObjectWithValueMetadata where - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(index: YapDB.Index) -> ObjectWithValueMetadata? { - if var item = readAtIndex(index) as? ObjectWithValueMetadata { - item.metadata = readMetadataAtIndex(index) - return item - } - return .None + public func readWithMetadataAtIndex< + Object, Metadata where + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(index: YapDB.Index) -> YapItem? { + guard let item: Object = readAtIndex(index) else { return nil } + let metadata: Metadata? = readMetadataAtIndex(index) + return YapItem(item, metadata) } /** @@ -40,16 +38,17 @@ extension ReadTransactionType { - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func readAtIndexes< - Indexes, ObjectWithValueMetadata where + public func readWithMetadataAtIndexes< + Indexes, Object, Metadata where Indexes: SequenceType, Indexes.Generator.Element == YapDB.Index, - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(indexes: Indexes) -> [ObjectWithValueMetadata] { - return indexes.flatMap(readAtIndex) + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(indexes: Indexes) -> [YapItem] { + // FIXME: using flatMap means the output length need not match the input length + return indexes.flatMap(readWithMetadataAtIndex) } /** @@ -58,14 +57,14 @@ extension ReadTransactionType { - parameter key: a String - returns: an optional `ItemType` */ - public func readByKey< - ObjectWithValueMetadata where - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(key: String) -> ObjectWithValueMetadata? { - return readAtIndex(ObjectWithValueMetadata.indexWithKey(key)) + public func readWithMetadataByKey< + Object, Metadata where + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(key: String) -> YapItem? { + return readWithMetadataAtIndex(Object.indexWithKey(key)) } /** @@ -74,16 +73,16 @@ extension ReadTransactionType { - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func readByKeys< - Keys, ObjectWithValueMetadata where + public func readWithMetadataByKeys< + Keys, Object, Metadata where Keys: SequenceType, Keys.Generator.Element == String, - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(keys: Keys) -> [ObjectWithValueMetadata] { - return readAtIndexes(ObjectWithValueMetadata.indexesWithKeys(keys)) + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(keys: Keys) -> [YapItem] { + return readWithMetadataAtIndexes(Object.indexesWithKeys(keys)) } /** @@ -91,14 +90,14 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ - public func readAll< - ObjectWithValueMetadata where - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>() -> [ObjectWithValueMetadata] { - return readByKeys(keysInCollection(ObjectWithValueMetadata.collection)) + public func readWithMetadataAll< + Object, Metadata where + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>() -> [YapItem] { + return readWithMetadataByKeys(keysInCollection(Object.collection)) } } @@ -110,14 +109,14 @@ extension ConnectionType { - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func readAtIndex< - ObjectWithValueMetadata where - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(index: YapDB.Index) -> ObjectWithValueMetadata? { - return read { $0.readAtIndex(index) } + public func readWithMetadataAtIndex< + Object, Metadata where + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(index: YapDB.Index) -> YapItem? { + return read { $0.readWithMetadataAtIndex(index) } } /** @@ -126,16 +125,16 @@ extension ConnectionType { - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func readAtIndexes< - Indexes, ObjectWithValueMetadata where + public func readWithMetadataAtIndexes< + Indexes, Object, Metadata where Indexes: SequenceType, Indexes.Generator.Element == YapDB.Index, - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(indexes: Indexes) -> [ObjectWithValueMetadata] { - return read { $0.readAtIndexes(indexes) } + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(indexes: Indexes) -> [YapItem] { + return read { $0.readWithMetadataAtIndexes(indexes) } } /** @@ -144,14 +143,14 @@ extension ConnectionType { - parameter key: a String - returns: an optional `ItemType` */ - public func readByKey< - ObjectWithValueMetadata where - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(key: String) -> ObjectWithValueMetadata? { - return readAtIndex(ObjectWithValueMetadata.indexWithKey(key)) + public func readWithMetadataByKey< + Object, Metadata where + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(key: String) -> YapItem? { + return readWithMetadataAtIndex(Object.indexWithKey(key)) } /** @@ -160,16 +159,16 @@ extension ConnectionType { - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func readByKeys< - Keys, ObjectWithValueMetadata where + public func readWithMetadataByKeys< + Keys, Object, Metadata where Keys: SequenceType, Keys.Generator.Element == String, - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(keys: Keys) -> [ObjectWithValueMetadata] { - return readAtIndexes(ObjectWithValueMetadata.indexesWithKeys(keys)) + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(keys: Keys) -> [YapItem] { + return readWithMetadataAtIndexes(Object.indexesWithKeys(keys)) } /** @@ -177,14 +176,14 @@ extension ConnectionType { - returns: an array of `ItemType` */ - public func readAll< - ObjectWithValueMetadata where - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>() -> [ObjectWithValueMetadata] { - return read { $0.readAll() } + public func readWithMetadataAll< + Object, Metadata where + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>() -> [YapItem] { + return read { $0.readWithMetadataAll() } } } @@ -197,14 +196,14 @@ extension WriteTransactionType { - parameter item: the item to store. */ - public func write< - ObjectWithValueMetadata where - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(item: ObjectWithValueMetadata) -> ObjectWithValueMetadata { - writeAtIndex(item.index, object: item, metadata: item.metadata?.encoded) + public func writeWithMetadata< + Object, Metadata where + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(item: YapItem) -> YapItem { + writeAtIndex(item.value.index, object: item.value, metadata: item.metadata?.encoded) return item } @@ -213,16 +212,16 @@ extension WriteTransactionType { - parameter items: a SequenceType of items to store. */ - public func write< - Items, ObjectWithValueMetadata where + public func writeWithMetadata< + Items, Object, Metadata where Items: SequenceType, - Items.Generator.Element == ObjectWithValueMetadata, - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(items: Items) -> [ObjectWithValueMetadata] { - return items.map(write) + Items.Generator.Element == YapItem, + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(items: Items) -> [YapItem] { + return items.map(writeWithMetadata) } } @@ -233,14 +232,14 @@ extension ConnectionType { - parameter item: the item to store. */ - public func write< - ObjectWithValueMetadata where - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(item: ObjectWithValueMetadata) -> ObjectWithValueMetadata { - return write { $0.write(item) } + public func writeWithMetadata< + Object, Metadata where + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(item: YapItem) -> YapItem { + return write { $0.writeWithMetadata(item) } } /** @@ -248,16 +247,16 @@ extension ConnectionType { - parameter items: a SequenceType of items to store. */ - public func write< - Items, ObjectWithValueMetadata where + public func writeWithMetadata< + Items, Object, Metadata where Items: SequenceType, - Items.Generator.Element == ObjectWithValueMetadata, - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(items: Items) -> [ObjectWithValueMetadata] { - return write { $0.write(items) } + Items.Generator.Element == YapItem, + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(items: Items) -> [YapItem] { + return write { $0.writeWithMetadata(items) } } /** @@ -267,14 +266,14 @@ extension ConnectionType { - parameter queue: the dispatch_queue_t to run the completion block on. - parameter completion: a dispatch_block_t for completion. */ - public func asyncWrite< - ObjectWithValueMetadata where - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(item: ObjectWithValueMetadata, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (ObjectWithValueMetadata -> Void)? = .None) { - asyncWrite({ $0.write(item) }, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Object, Metadata where + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(item: YapItem, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (YapItem -> Void)? = .None) { + asyncWrite({ $0.writeWithMetadata(item) }, queue: queue, completion: completion) } /** @@ -284,16 +283,16 @@ extension ConnectionType { - parameter queue: the dispatch_queue_t to run the completion block on. - parameter completion: a dispatch_block_t for completion. */ - public func asyncWrite< - Items, ObjectWithValueMetadata where + public func asyncWriteWithMetadata< + Items, Object, Metadata where Items: SequenceType, - Items.Generator.Element == ObjectWithValueMetadata, - ObjectWithValueMetadata: Persistable, - ObjectWithValueMetadata: NSCoding, - ObjectWithValueMetadata.MetadataType: ValueCoding, - ObjectWithValueMetadata.MetadataType.Coder: NSCoding, - ObjectWithValueMetadata.MetadataType.Coder.ValueType == ObjectWithValueMetadata.MetadataType>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([ObjectWithValueMetadata] -> Void)? = .None) { - asyncWrite({ $0.write(items) }, queue: queue, completion: completion) + Items.Generator.Element == YapItem, + Object: Persistable, + Object: NSCoding, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([YapItem] -> Void)? = .None) { + asyncWrite({ $0.writeWithMetadata(items) }, queue: queue, completion: completion) } } diff --git a/Sources/Functional_ValueWIthObjectMetadata.swift b/Sources/Functional_ValueWIthObjectMetadata.swift index 4a09f50..ce9f5b8 100644 --- a/Sources/Functional_ValueWIthObjectMetadata.swift +++ b/Sources/Functional_ValueWIthObjectMetadata.swift @@ -20,18 +20,16 @@ extension ReadTransactionType { - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func readAtIndex< - ValueWithObjectMetadata where - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(index: YapDB.Index) -> ValueWithObjectMetadata? { - if var item = ValueWithObjectMetadata.decode(readAtIndex(index)) { - item.metadata = readMetadataAtIndex(index) - return item - } - return .None + public func readWithMetadataAtIndex< + Value, Metadata where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: NSCoding>(index: YapDB.Index) -> YapItem? { + guard let item: Value = Value.decode(readAtIndex(index)) else { return nil } + let metadata: Metadata? = readMetadataAtIndex(index) + return YapItem(item, metadata) } /** @@ -40,16 +38,17 @@ extension ReadTransactionType { - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func readAtIndexes< - Indexes, ValueWithObjectMetadata where + public func readWithMetadataAtIndexes< + Indexes, Value, Metadata where Indexes: SequenceType, Indexes.Generator.Element == YapDB.Index, - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(indexes: Indexes) -> [ValueWithObjectMetadata] { - return indexes.flatMap(readAtIndex) + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: NSCoding>(indexes: Indexes) -> [YapItem] { + // FIXME: using flatMap means the output length need not match the input length + return indexes.flatMap(readWithMetadataAtIndex) } /** @@ -58,14 +57,14 @@ extension ReadTransactionType { - parameter key: a String - returns: an optional `ItemType` */ - public func readByKey< - ValueWithObjectMetadata where - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(key: String) -> ValueWithObjectMetadata? { - return readAtIndex(ValueWithObjectMetadata.indexWithKey(key)) + public func readWithMetadataByKey< + Value, Metadata where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: NSCoding>(key: String) -> YapItem? { + return readWithMetadataAtIndex(Value.indexWithKey(key)) } /** @@ -74,16 +73,16 @@ extension ReadTransactionType { - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func readByKeys< - Keys, ValueWithObjectMetadata where + public func readWithMetadataByKeys< + Keys, Value, Metadata where Keys: SequenceType, Keys.Generator.Element == String, - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(keys: Keys) -> [ValueWithObjectMetadata] { - return readAtIndexes(ValueWithObjectMetadata.indexesWithKeys(keys)) + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: NSCoding>(keys: Keys) -> [YapItem] { + return readWithMetadataAtIndexes(Value.indexesWithKeys(keys)) } /** @@ -91,14 +90,14 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ - public func readAll< - ValueWithObjectMetadata where - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>() -> [ValueWithObjectMetadata] { - return readByKeys(keysInCollection(ValueWithObjectMetadata.collection)) + public func readWithMetadataAll< + Value, Metadata where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: NSCoding>() -> [YapItem] { + return readWithMetadataByKeys(keysInCollection(Value.collection)) } } @@ -110,14 +109,14 @@ extension ConnectionType { - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func readAtIndex< - ValueWithObjectMetadata where - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(index: YapDB.Index) -> ValueWithObjectMetadata? { - return read { $0.readAtIndex(index) } + public func readWithMetadataAtIndex< + Value, Metadata where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: NSCoding>(index: YapDB.Index) -> YapItem? { + return read { $0.readWithMetadataAtIndex(index) } } /** @@ -126,16 +125,16 @@ extension ConnectionType { - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func readAtIndexes< - Indexes, ValueWithObjectMetadata where + public func readWithMetadataAtIndexes< + Indexes, Value, Metadata where Indexes: SequenceType, Indexes.Generator.Element == YapDB.Index, - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(indexes: Indexes) -> [ValueWithObjectMetadata] { - return read { $0.readAtIndexes(indexes) } + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: NSCoding>(indexes: Indexes) -> [YapItem] { + return read { $0.readWithMetadataAtIndexes(indexes) } } /** @@ -144,14 +143,14 @@ extension ConnectionType { - parameter key: a String - returns: an optional `ItemType` */ - public func readByKey< - ValueWithObjectMetadata where - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(key: String) -> ValueWithObjectMetadata? { - return readAtIndex(ValueWithObjectMetadata.indexWithKey(key)) + public func readWithMetadataByKey< + Value, Metadata where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: NSCoding>(key: String) -> YapItem? { + return readWithMetadataAtIndex(Value.indexWithKey(key)) } /** @@ -160,16 +159,16 @@ extension ConnectionType { - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func readByKeys< - Keys, ValueWithObjectMetadata where + public func readWithMetadataByKeys< + Keys, Value, Metadata where Keys: SequenceType, Keys.Generator.Element == String, - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(keys: Keys) -> [ValueWithObjectMetadata] { - return readAtIndexes(ValueWithObjectMetadata.indexesWithKeys(keys)) + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: NSCoding>(keys: Keys) -> [YapItem] { + return readWithMetadataAtIndexes(Value.indexesWithKeys(keys)) } /** @@ -177,14 +176,14 @@ extension ConnectionType { - returns: an array of `ItemType` */ - public func readAll< - ValueWithObjectMetadata where - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>() -> [ValueWithObjectMetadata] { - return read { $0.readAll() } + public func readWithMetadataAll< + Value, Metadata where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: NSCoding>() -> [YapItem] { + return read { $0.readWithMetadataAll() } } } @@ -197,14 +196,14 @@ extension WriteTransactionType { - parameter item: the item to store. */ - public func write< - ValueWithObjectMetadata where - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(item: ValueWithObjectMetadata) -> ValueWithObjectMetadata { - writeAtIndex(item.index, object: item.encoded, metadata: item.metadata) + public func writeWithMetadata< + Value, Metadata where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: NSCoding>(item: YapItem) -> YapItem { + writeAtIndex(item.value.index, object: item.value.encoded, metadata: item.metadata) return item } @@ -213,16 +212,16 @@ extension WriteTransactionType { - parameter items: a SequenceType of items to store. */ - public func write< - Items, ValueWithObjectMetadata where + public func writeWithMetadata< + Items, Value, Metadata where Items: SequenceType, - Items.Generator.Element == ValueWithObjectMetadata, - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(items: Items) -> [ValueWithObjectMetadata] { - return items.map(write) + Items.Generator.Element == YapItem, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: NSCoding>(items: Items) -> [YapItem] { + return items.map(writeWithMetadata) } } @@ -233,14 +232,14 @@ extension ConnectionType { - parameter item: the item to store. */ - public func write< - ValueWithObjectMetadata where - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(item: ValueWithObjectMetadata) -> ValueWithObjectMetadata { - return write { $0.write(item) } + public func writeWithMetadata< + Value, Metadata where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: NSCoding>(item: YapItem) -> YapItem { + return write { $0.writeWithMetadata(item) } } /** @@ -248,16 +247,16 @@ extension ConnectionType { - parameter items: a SequenceType of items to store. */ - public func write< - Items, ValueWithObjectMetadata where + public func writeWithMetadata< + Items, Value, Metadata where Items: SequenceType, - Items.Generator.Element == ValueWithObjectMetadata, - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(items: Items) -> [ValueWithObjectMetadata] { - return write { $0.write(items) } + Items.Generator.Element == YapItem, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: NSCoding>(items: Items) -> [YapItem] { + return write { $0.writeWithMetadata(items) } } /** @@ -267,14 +266,14 @@ extension ConnectionType { - parameter queue: the dispatch_queue_t to run the completion block on. - parameter completion: a dispatch_block_t for completion. */ - public func asyncWrite< - ValueWithObjectMetadata where - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(item: ValueWithObjectMetadata, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (ValueWithObjectMetadata -> Void)? = .None) { - asyncWrite({ $0.write(item) }, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Value, Metadata where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: NSCoding>(item: YapItem, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (YapItem -> Void)? = .None) { + asyncWrite({ $0.writeWithMetadata(item) }, queue: queue, completion: completion) } /** @@ -284,16 +283,16 @@ extension ConnectionType { - parameter queue: the dispatch_queue_t to run the completion block on. - parameter completion: a dispatch_block_t for completion. */ - public func asyncWrite< - Items, ValueWithObjectMetadata where + public func asyncWriteWithMetadata< + Items, Value, Metadata where Items: SequenceType, - Items.Generator.Element == ValueWithObjectMetadata, - ValueWithObjectMetadata: Persistable, - ValueWithObjectMetadata: ValueCoding, - ValueWithObjectMetadata.Coder: NSCoding, - ValueWithObjectMetadata.Coder.ValueType == ValueWithObjectMetadata, - ValueWithObjectMetadata.MetadataType: NSCoding>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([ValueWithObjectMetadata] -> Void)? = .None) { - asyncWrite({ $0.write(items) }, queue: queue, completion: completion) + Items.Generator.Element == YapItem, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: NSCoding>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([YapItem] -> Void)? = .None) { + asyncWrite({ $0.writeWithMetadata(items) }, queue: queue, completion: completion) } } diff --git a/Sources/Functional_ValueWIthValueMetadata.swift b/Sources/Functional_ValueWIthValueMetadata.swift index 66bf836..19fb418 100644 --- a/Sources/Functional_ValueWIthValueMetadata.swift +++ b/Sources/Functional_ValueWIthValueMetadata.swift @@ -20,20 +20,18 @@ extension ReadTransactionType { - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func readAtIndex< - ValueWithValueMetadata where - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(index: YapDB.Index) -> ValueWithValueMetadata? { - if var item = ValueWithValueMetadata.decode(readAtIndex(index)) { - item.metadata = readMetadataAtIndex(index) - return item - } - return .None + public func readWithMetadataAtIndex< + Value, Metadata where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(index: YapDB.Index) -> YapItem? { + guard let item: Value = Value.decode(readAtIndex(index)) else { return nil } + let metadata: Metadata? = readMetadataAtIndex(index) + return YapItem(item, metadata) } /** @@ -42,18 +40,19 @@ extension ReadTransactionType { - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func readAtIndexes< - Indexes, ValueWithValueMetadata where + public func readWithMetadataAtIndexes< + Indexes, Value, Metadata where Indexes: SequenceType, Indexes.Generator.Element == YapDB.Index, - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(indexes: Indexes) -> [ValueWithValueMetadata] { - return indexes.flatMap(readAtIndex) + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(indexes: Indexes) -> [YapItem] { + // FIXME: using flatMap means the output length need not match the input length + return indexes.flatMap(readWithMetadataAtIndex) } /** @@ -62,16 +61,16 @@ extension ReadTransactionType { - parameter key: a String - returns: an optional `ItemType` */ - public func readByKey< - ValueWithValueMetadata where - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(key: String) -> ValueWithValueMetadata? { - return readAtIndex(ValueWithValueMetadata.indexWithKey(key)) + public func readWithMetadataByKey< + Value, Metadata where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(key: String) -> YapItem? { + return readWithMetadataAtIndex(Value.indexWithKey(key)) } /** @@ -80,18 +79,18 @@ extension ReadTransactionType { - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func readByKeys< - Keys, ValueWithValueMetadata where + public func readWithMetadataByKeys< + Keys, Value, Metadata where Keys: SequenceType, Keys.Generator.Element == String, - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(keys: Keys) -> [ValueWithValueMetadata] { - return readAtIndexes(ValueWithValueMetadata.indexesWithKeys(keys)) + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(keys: Keys) -> [YapItem] { + return readWithMetadataAtIndexes(Value.indexesWithKeys(keys)) } /** @@ -99,16 +98,16 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ - public func readAll< - ValueWithValueMetadata where - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>() -> [ValueWithValueMetadata] { - return readByKeys(keysInCollection(ValueWithValueMetadata.collection)) + public func readWithMetadataAll< + Value, Metadata where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>() -> [YapItem] { + return readWithMetadataByKeys(keysInCollection(Value.collection)) } } @@ -120,16 +119,16 @@ extension ConnectionType { - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func readAtIndex< - ValueWithValueMetadata where - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(index: YapDB.Index) -> ValueWithValueMetadata? { - return read { $0.readAtIndex(index) } + public func readWithMetadataAtIndex< + Value, Metadata where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(index: YapDB.Index) -> YapItem? { + return read { $0.readWithMetadataAtIndex(index) } } /** @@ -138,18 +137,18 @@ extension ConnectionType { - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func readAtIndexes< - Indexes, ValueWithValueMetadata where + public func readWithMetadataAtIndexes< + Indexes, Value, Metadata where Indexes: SequenceType, Indexes.Generator.Element == YapDB.Index, - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(indexes: Indexes) -> [ValueWithValueMetadata] { - return read { $0.readAtIndexes(indexes) } + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(indexes: Indexes) -> [YapItem] { + return read { $0.readWithMetadataAtIndexes(indexes) } } /** @@ -158,16 +157,16 @@ extension ConnectionType { - parameter key: a String - returns: an optional `ItemType` */ - public func readByKey< - ValueWithValueMetadata where - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(key: String) -> ValueWithValueMetadata? { - return readAtIndex(ValueWithValueMetadata.indexWithKey(key)) + public func readWithMetadataByKey< + Value, Metadata where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(key: String) -> YapItem? { + return readWithMetadataAtIndex(Value.indexWithKey(key)) } /** @@ -176,18 +175,18 @@ extension ConnectionType { - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func readByKeys< - Keys, ValueWithValueMetadata where + public func readWithMetadataByKeys< + Keys, Value, Metadata where Keys: SequenceType, Keys.Generator.Element == String, - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(keys: Keys) -> [ValueWithValueMetadata] { - return readAtIndexes(ValueWithValueMetadata.indexesWithKeys(keys)) + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(keys: Keys) -> [YapItem] { + return readWithMetadataAtIndexes(Value.indexesWithKeys(keys)) } /** @@ -195,16 +194,16 @@ extension ConnectionType { - returns: an array of `ItemType` */ - public func readAll< - ValueWithValueMetadata where - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>() -> [ValueWithValueMetadata] { - return read { $0.readAll() } + public func readWithMetadataAll< + Value, Metadata where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>() -> [YapItem] { + return read { $0.readWithMetadataAll() } } } @@ -217,16 +216,16 @@ extension WriteTransactionType { - parameter item: the item to store. */ - public func write< - ValueWithValueMetadata where - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(item: ValueWithValueMetadata) -> ValueWithValueMetadata { - writeAtIndex(item.index, object: item.encoded, metadata: item.metadata?.encoded) + public func writeWithMetadata< + Value, Metadata where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(item: YapItem) -> YapItem { + writeAtIndex(item.value.index, object: item.value.encoded, metadata: item.metadata?.encoded) return item } @@ -235,18 +234,18 @@ extension WriteTransactionType { - parameter items: a SequenceType of items to store. */ - public func write< - Items, ValueWithValueMetadata where + public func writeWithMetadata< + Items, Value, Metadata where Items: SequenceType, - Items.Generator.Element == ValueWithValueMetadata, - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(items: Items) -> [ValueWithValueMetadata] { - return items.map(write) + Items.Generator.Element == YapItem, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(items: Items) -> [YapItem] { + return items.map(writeWithMetadata) } } @@ -257,16 +256,16 @@ extension ConnectionType { - parameter item: the item to store. */ - public func write< - ValueWithValueMetadata where - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(item: ValueWithValueMetadata) -> ValueWithValueMetadata { - return write { $0.write(item) } + public func writeWithMetadata< + Value, Metadata where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(item: YapItem) -> YapItem { + return write { $0.writeWithMetadata(item) } } /** @@ -274,18 +273,18 @@ extension ConnectionType { - parameter items: a SequenceType of items to store. */ - public func write< - Items, ValueWithValueMetadata where + public func writeWithMetadata< + Items, Value, Metadata where Items: SequenceType, - Items.Generator.Element == ValueWithValueMetadata, - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(items: Items) -> [ValueWithValueMetadata] { - return write { $0.write(items) } + Items.Generator.Element == YapItem, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(items: Items) -> [YapItem] { + return write { $0.writeWithMetadata(items) } } /** @@ -295,16 +294,16 @@ extension ConnectionType { - parameter queue: the dispatch_queue_t to run the completion block on. - parameter completion: a dispatch_block_t for completion. */ - public func asyncWrite< - ValueWithValueMetadata where - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(item: ValueWithValueMetadata, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (ValueWithValueMetadata -> Void)? = .None) { - asyncWrite({ $0.write(item) }, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Value, Metadata where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(item: YapItem, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (YapItem -> Void)? = .None) { + asyncWrite({ $0.writeWithMetadata(item) }, queue: queue, completion: completion) } /** @@ -314,18 +313,18 @@ extension ConnectionType { - parameter queue: the dispatch_queue_t to run the completion block on. - parameter completion: a dispatch_block_t for completion. */ - public func asyncWrite< - Items, ValueWithValueMetadata where + public func asyncWriteWithMetadata< + Items, Value, Metadata where Items: SequenceType, - Items.Generator.Element == ValueWithValueMetadata, - ValueWithValueMetadata: Persistable, - ValueWithValueMetadata: ValueCoding, - ValueWithValueMetadata.Coder: NSCoding, - ValueWithValueMetadata.Coder.ValueType == ValueWithValueMetadata, - ValueWithValueMetadata.MetadataType: ValueCoding, - ValueWithValueMetadata.MetadataType.Coder: NSCoding, - ValueWithValueMetadata.MetadataType.Coder.ValueType == ValueWithValueMetadata.MetadataType>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([ValueWithValueMetadata] -> Void)? = .None) { - asyncWrite({ $0.write(items) }, queue: queue, completion: completion) + Items.Generator.Element == YapItem, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([YapItem] -> Void)? = .None) { + asyncWrite({ $0.writeWithMetadata(items) }, queue: queue, completion: completion) } } diff --git a/Sources/Functional_ValueWithNoMetadata.swift b/Sources/Functional_ValueWithNoMetadata.swift index f1ebbe5..a29a136 100644 --- a/Sources/Functional_ValueWithNoMetadata.swift +++ b/Sources/Functional_ValueWithNoMetadata.swift @@ -21,13 +21,12 @@ extension ReadTransactionType { - returns: an optional `ItemType` */ public func readAtIndex< - ValueWithNoMetadata where - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(index: YapDB.Index) -> ValueWithNoMetadata? { - return ValueWithNoMetadata.decode(readAtIndex(index)) + Value where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value>(index: YapDB.Index) -> Value? { + return Value.decode(readAtIndex(index)) } /** @@ -37,14 +36,13 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ public func readAtIndexes< - Indexes, ValueWithNoMetadata where + Indexes, Value where Indexes: SequenceType, Indexes.Generator.Element == YapDB.Index, - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(indexes: Indexes) -> [ValueWithNoMetadata] { + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value>(indexes: Indexes) -> [Value] { return indexes.flatMap(readAtIndex) } @@ -55,13 +53,12 @@ extension ReadTransactionType { - returns: an optional `ItemType` */ public func readByKey< - ValueWithNoMetadata where - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(key: String) -> ValueWithNoMetadata? { - return readAtIndex(ValueWithNoMetadata.indexWithKey(key)) + Value where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value>(key: String) -> Value? { + return readAtIndex(Value.indexWithKey(key)) } /** @@ -71,15 +68,14 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ public func readByKeys< - Keys, ValueWithNoMetadata where + Keys, Value where Keys: SequenceType, Keys.Generator.Element == String, - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(keys: Keys) -> [ValueWithNoMetadata] { - return readAtIndexes(ValueWithNoMetadata.indexesWithKeys(keys)) + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value>(keys: Keys) -> [Value] { + return readAtIndexes(Value.indexesWithKeys(keys)) } /** @@ -88,13 +84,12 @@ extension ReadTransactionType { - returns: an array of `ItemType` */ public func readAll< - ValueWithNoMetadata where - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>() -> [ValueWithNoMetadata] { - return readByKeys(keysInCollection(ValueWithNoMetadata.collection)) + Value where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value>() -> [Value] { + return readByKeys(keysInCollection(Value.collection)) } } @@ -107,12 +102,11 @@ extension ConnectionType { - returns: an optional `ItemType` */ public func readAtIndex< - ValueWithNoMetadata where - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(index: YapDB.Index) -> ValueWithNoMetadata? { + Value where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value>(index: YapDB.Index) -> Value? { return read { $0.readAtIndex(index) } } @@ -123,14 +117,13 @@ extension ConnectionType { - returns: an array of `ItemType` */ public func readAtIndexes< - Indexes, ValueWithNoMetadata where + Indexes, Value where Indexes: SequenceType, Indexes.Generator.Element == YapDB.Index, - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(indexes: Indexes) -> [ValueWithNoMetadata] { + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value>(indexes: Indexes) -> [Value] { return read { $0.readAtIndexes(indexes) } } @@ -141,13 +134,12 @@ extension ConnectionType { - returns: an optional `ItemType` */ public func readByKey< - ValueWithNoMetadata where - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(key: String) -> ValueWithNoMetadata? { - return readAtIndex(ValueWithNoMetadata.indexWithKey(key)) + Value where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value>(key: String) -> Value? { + return readAtIndex(Value.indexWithKey(key)) } /** @@ -157,15 +149,14 @@ extension ConnectionType { - returns: an array of `ItemType` */ public func readByKeys< - Keys, ValueWithNoMetadata where + Keys, Value where Keys: SequenceType, Keys.Generator.Element == String, - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(keys: Keys) -> [ValueWithNoMetadata] { - return readAtIndexes(ValueWithNoMetadata.indexesWithKeys(keys)) + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value>(keys: Keys) -> [Value] { + return readAtIndexes(Value.indexesWithKeys(keys)) } /** @@ -174,12 +165,11 @@ extension ConnectionType { - returns: an array of `ItemType` */ public func readAll< - ValueWithNoMetadata where - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>() -> [ValueWithNoMetadata] { + Value where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value>() -> [Value] { return read { $0.readAll() } } } @@ -194,12 +184,11 @@ extension WriteTransactionType { - parameter item: the item to store. */ public func write< - ValueWithNoMetadata where - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(item: ValueWithNoMetadata) -> ValueWithNoMetadata { + Value where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value>(item: Value) -> Value { writeAtIndex(item.index, object: item.encoded, metadata: .None) return item } @@ -210,14 +199,13 @@ extension WriteTransactionType { - parameter items: a SequenceType of items to store. */ public func write< - Items, ValueWithNoMetadata where + Items, Value where Items: SequenceType, - Items.Generator.Element == ValueWithNoMetadata, - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(items: Items) -> [ValueWithNoMetadata] { + Items.Generator.Element == Value, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value>(items: Items) -> [Value] { return items.map(write) } } @@ -230,12 +218,11 @@ extension ConnectionType { - parameter item: the item to store. */ public func write< - ValueWithNoMetadata where - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(item: ValueWithNoMetadata) -> ValueWithNoMetadata { + Value where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value>(item: Value) -> Value { return write { $0.write(item) } } @@ -245,14 +232,13 @@ extension ConnectionType { - parameter items: a SequenceType of items to store. */ public func write< - Items, ValueWithNoMetadata where + Items, Value where Items: SequenceType, - Items.Generator.Element == ValueWithNoMetadata, - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(items: Items) -> [ValueWithNoMetadata] { + Items.Generator.Element == Value, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value>(items: Items) -> [Value] { return write { $0.write(items) } } @@ -264,12 +250,11 @@ extension ConnectionType { - parameter completion: a dispatch_block_t for completion. */ public func asyncWrite< - ValueWithNoMetadata where - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(item: ValueWithNoMetadata, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (ValueWithNoMetadata -> Void)? = .None) { + Value where + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value>(item: Value, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (Value -> Void)? = .None) { asyncWrite({ $0.write(item) }, queue: queue, completion: completion) } @@ -281,14 +266,13 @@ extension ConnectionType { - parameter completion: a dispatch_block_t for completion. */ public func asyncWrite< - Items, ValueWithNoMetadata where + Items, Value where Items: SequenceType, - Items.Generator.Element == ValueWithNoMetadata, - ValueWithNoMetadata: Persistable, - ValueWithNoMetadata: ValueCoding, - ValueWithNoMetadata.Coder: NSCoding, - ValueWithNoMetadata.Coder.ValueType == ValueWithNoMetadata, - ValueWithNoMetadata.MetadataType == Void>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([ValueWithNoMetadata] -> Void)? = .None) { + Items.Generator.Element == Value, + Value: Persistable, + Value: ValueCoding, + Value.Coder: NSCoding, + Value.Coder.ValueType == Value>(items: Items, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([Value] -> Void)? = .None) { asyncWrite({ $0.write(items) }, queue: queue, completion: completion) } } diff --git a/Sources/Persistable_AnyWithObjectMetadata.swift b/Sources/Persistable_AnyWithObjectMetadata.swift index 13cf725..fbe08ed 100644 --- a/Sources/Persistable_AnyWithObjectMetadata.swift +++ b/Sources/Persistable_AnyWithObjectMetadata.swift @@ -12,36 +12,37 @@ import ValueCoding // MARK: - Readable extension Readable where - ItemType: Persistable, - ItemType.MetadataType: NSCoding { + ItemType: Persistable { - func metadataInTransaction(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> ItemType.MetadataType? { + func metadataInTransaction(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> Metadata? { return transaction.readMetadataAtIndex(index) } - func metadataAtIndexInTransaction(index: YapDB.Index) -> Database.Connection.ReadTransaction -> ItemType.MetadataType? { + func metadataAtIndexInTransaction(index: YapDB.Index) -> Database.Connection.ReadTransaction -> Metadata? { return { self.metadataInTransaction($0, atIndex: index) } } - func metadataInTransactionAtIndex(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> ItemType.MetadataType? { + func metadataInTransactionAtIndex(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> Metadata? { return { self.metadataInTransaction(transaction, atIndex: $0) } } func metadataAtIndexesInTransaction< - Indexes where + Indexes, Metadata where Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [ItemType.MetadataType] { - let atIndex = metadataInTransactionAtIndex - return { indexes.flatMap(atIndex($0)) } + Indexes.Generator.Element == YapDB.Index, + Metadata: NSCoding>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [Metadata] { + return { indexes.flatMap(self.metadataInTransactionAtIndex($0)) } } /** Reads the metadata at a given index. - parameter index: a YapDB.Index - - returns: an optional `ItemType.MetadataType` + - returns: an optional `Metadata` */ - public func metadataAtIndex(index: YapDB.Index) -> ItemType.MetadataType? { + public func metadataAtIndex< + Metadata where + Metadata: NSCoding>(index: YapDB.Index) -> Metadata? { return sync(metadataAtIndexInTransaction(index)) } @@ -49,12 +50,13 @@ extension Readable where Reads the metadata at the indexes. - parameter indexes: a SequenceType of YapDB.Index values - - returns: an array of `ItemType.MetadataType` + - returns: an array of `Metadata` */ public func metadataAtIndexes< - Indexes where + Indexes, Metadata where Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> [ItemType.MetadataType] { + Indexes.Generator.Element == YapDB.Index, + Metadata: NSCoding>(indexes: Indexes) -> [Metadata] { return sync(metadataAtIndexesInTransaction(indexes)) } } diff --git a/Sources/Persistable_AnyWithValueMetadata.swift b/Sources/Persistable_AnyWithValueMetadata.swift index c27762b..9147903 100644 --- a/Sources/Persistable_AnyWithValueMetadata.swift +++ b/Sources/Persistable_AnyWithValueMetadata.swift @@ -12,38 +12,53 @@ import ValueCoding // MARK: - Readable extension Readable where - ItemType: Persistable, - ItemType.MetadataType: ValueCoding, - ItemType.MetadataType.Coder: NSCoding, - ItemType.MetadataType.Coder.ValueType == ItemType.MetadataType { + ItemType: Persistable { - func metadataInTransaction(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> ItemType.MetadataType? { + func metadataInTransaction< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> Metadata? { return transaction.readMetadataAtIndex(index) } - func metadataAtIndexInTransaction(index: YapDB.Index) -> Database.Connection.ReadTransaction -> ItemType.MetadataType? { + func metadataAtIndexInTransaction< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(index: YapDB.Index) -> Database.Connection.ReadTransaction -> Metadata? { return { self.metadataInTransaction($0, atIndex: index) } } - func metadataInTransactionAtIndex(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> ItemType.MetadataType? { + func metadataInTransactionAtIndex< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> Metadata? { return { self.metadataInTransaction(transaction, atIndex: $0) } } func metadataAtIndexesInTransaction< - Indexes where + Indexes, Metadata where Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [ItemType.MetadataType] { - let atIndex = metadataInTransactionAtIndex - return { indexes.flatMap(atIndex($0)) } + Indexes.Generator.Element == YapDB.Index, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [Metadata] { + return { indexes.flatMap(self.metadataInTransactionAtIndex($0)) } } /** Reads the metadata at a given index. - parameter index: a YapDB.Index - - returns: an optional `ItemType.MetadataType` + - returns: an optional `Metadata` */ - public func metadataAtIndex(index: YapDB.Index) -> ItemType.MetadataType? { + public func metadataAtIndex< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(index: YapDB.Index) -> Metadata? { return sync(metadataAtIndexInTransaction(index)) } @@ -51,12 +66,15 @@ extension Readable where Reads the metadata at the indexes. - parameter indexes: a SequenceType of YapDB.Index values - - returns: an array of `ItemType.MetadataType` + - returns: an array of `Metadata` */ public func metadataAtIndexes< - Indexes where + Indexes, Metadata where Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> [ItemType.MetadataType] { + Indexes.Generator.Element == YapDB.Index, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(indexes: Indexes) -> [Metadata] { return sync(metadataAtIndexesInTransaction(indexes)) } } diff --git a/Sources/Persistable_ObjectWithNoMetadata.swift b/Sources/Persistable_ObjectWithNoMetadata.swift index 17c3b13..e390fd0 100644 --- a/Sources/Persistable_ObjectWithNoMetadata.swift +++ b/Sources/Persistable_ObjectWithNoMetadata.swift @@ -12,8 +12,7 @@ import ValueCoding // MARK: - Persistable extension Persistable where - Self: NSCoding, - Self.MetadataType == Void { + Self: NSCoding { // Writing @@ -60,8 +59,7 @@ extension Persistable where extension SequenceType where Generator.Element: Persistable, - Generator.Element: NSCoding, - Generator.Element.MetadataType == Void { + Generator.Element: NSCoding { /** Write the items using an existing transaction. @@ -108,8 +106,7 @@ extension SequenceType where extension Readable where ItemType: NSCoding, - ItemType: Persistable, - ItemType.MetadataType == Void { + ItemType: Persistable { func inTransaction(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> ItemType? { return transaction.readAtIndex(index) diff --git a/Sources/Persistable_ObjectWithObjectMetadata.swift b/Sources/Persistable_ObjectWithObjectMetadata.swift index e910b72..abc3f22 100644 --- a/Sources/Persistable_ObjectWithObjectMetadata.swift +++ b/Sources/Persistable_ObjectWithObjectMetadata.swift @@ -7,13 +7,11 @@ // import Foundation -import ValueCoding // MARK: - Persistable extension Persistable where - Self: NSCoding, - Self.MetadataType: NSCoding { + Self: NSCoding { // Writing @@ -23,8 +21,11 @@ extension Persistable where - parameter transaction: a YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> Self { - return transaction.write(self) + public func writeWithMetadata< + WriteTransaction, Metadata where + WriteTransaction: WriteTransactionType, + Metadata: NSCoding>(transaction: WriteTransaction, metadata: Metadata?) -> YapItem { + return transaction.writeWithMetadata(YapItem(self, metadata)) } /** @@ -33,8 +34,11 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> Self { - return connection.write(self) + public func writeWithMetadata< + Connection, Metadata where + Connection: ConnectionType, + Metadata: NSCoding>(connection: Connection, metadata: Metadata?) -> YapItem { + return connection.writeWithMetadata(YapItem(self, metadata)) } /** @@ -43,8 +47,11 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (Self -> Void)? = .None) { - return connection.asyncWrite(self, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Connection, Metadata where + Connection: ConnectionType, + Metadata: NSCoding>(connection: Connection, metadata: Metadata?, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (YapItem -> Void)? = .None) { + return connection.asyncWriteWithMetadata(YapItem(self, metadata), queue: queue, completion: completion) } /** @@ -53,15 +60,32 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeWithMetadataOperation< + Connection, Metadata where + Connection: ConnectionType, + Metadata: NSCoding>(connection: Connection, metadata: Metadata?) -> NSOperation { + return NSBlockOperation { connection.writeWithMetadata(YapItem(self, metadata)) } } } extension SequenceType where Generator.Element: Persistable, - Generator.Element: NSCoding, - Generator.Element.MetadataType: NSCoding { + Generator.Element: NSCoding { + + /** + Zips the receiver with metadata into an array of YapItem. + Assumes `self` and `metadata` have the same `count`. + + - parameter metadata: a sequence of optional metadatas. + - returns: an array where Persistables and Metadata with corresponding indexes in `self` and `metadata` are joined in a `YapItem` + */ + public func yapItems< + Metadatas, Metadata where + Metadata: NSCoding, + Metadatas: SequenceType, + Metadatas.Generator.Element == Optional>(with metadata: Metadatas) -> [YapItem] { + return zip(self, metadata).map { YapItem($0, $1) } + } /** Write the items using an existing transaction. @@ -69,8 +93,12 @@ extension SequenceType where - parameter transaction: a WriteTransactionType e.g. YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> [Generator.Element] { - return transaction.write(self) + public func writeWithMetadata< + WriteTransaction, Metadata where + WriteTransaction: WriteTransactionType, + Metadata: NSCoding>(transaction: WriteTransaction, metadata: [Metadata?]) -> [YapItem] { + let items = yapItems(with: metadata) + return transaction.writeWithMetadata(items) } /** @@ -79,8 +107,12 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> [Generator.Element] { - return connection.write(self) + public func writeWithMetadata< + Connection, Metadata where + Connection: ConnectionType, + Metadata: NSCoding>(connection: Connection, metadata: [Metadata?]) -> [YapItem] { + let items = yapItems(with: metadata) + return connection.writeWithMetadata(items) } /** @@ -89,8 +121,12 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([Generator.Element] -> Void)? = .None) { - return connection.asyncWrite(self, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Connection, Metadata where + Connection: ConnectionType, + Metadata: NSCoding>(connection: Connection, metadata: [Metadata?], queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([YapItem] -> Void)? = .None) { + let items = yapItems(with: metadata) + return connection.asyncWriteWithMetadata(items, queue: queue, completion: completion) } /** @@ -99,8 +135,12 @@ extension SequenceType where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeWithMetadataOperation< + Connection, Metadata where + Connection: ConnectionType, + Metadata: NSCoding>(connection: Connection, metadata: [Metadata?]) -> NSOperation { + let items = yapItems(with: metadata) + return NSBlockOperation { connection.writeWithMetadata(items) } } } @@ -109,46 +149,44 @@ extension SequenceType where extension Readable where ItemType: NSCoding, - ItemType: Persistable, - ItemType.MetadataType: NSCoding { + ItemType: Persistable { - func inTransaction(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> ItemType? { - return transaction.readAtIndex(index) + func withMetadataInTransaction(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> YapItem? { + return transaction.readWithMetadataAtIndex(index) } - func inTransactionAtIndex(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> ItemType? { - return { self.inTransaction(transaction, atIndex: $0) } + func withMetadataInTransactionAtIndex(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> YapItem? { + return { self.withMetadataInTransaction(transaction, atIndex: $0) } } - func atIndexInTransaction(index: YapDB.Index) -> Database.Connection.ReadTransaction -> ItemType? { - return { self.inTransaction($0, atIndex: index) } + func withMetadataAtIndexInTransaction(index: YapDB.Index) -> Database.Connection.ReadTransaction -> YapItem? { + return { self.withMetadataInTransaction($0, atIndex: index) } } - func atIndexesInTransaction< - Indexes where + func withMetadataAtIndexesInTransaction< + Indexes, Metadata where Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [ItemType] { - let atIndex = inTransactionAtIndex - return { indexes.flatMap(atIndex($0)) } + Indexes.Generator.Element == YapDB.Index, + Metadata: NSCoding>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [YapItem] { + return { indexes.flatMap(self.withMetadataInTransactionAtIndex($0)) } } - func inTransaction(transaction: Database.Connection.ReadTransaction, byKey key: String) -> ItemType? { - return inTransaction(transaction, atIndex: ItemType.indexWithKey(key)) + func withMetadataInTransaction(transaction: Database.Connection.ReadTransaction, byKey key: String) -> YapItem? { + return withMetadataInTransaction(transaction, atIndex: ItemType.indexWithKey(key)) } - func inTransactionByKey(transaction: Database.Connection.ReadTransaction) -> String -> ItemType? { - return { self.inTransaction(transaction, byKey: $0) } + func withMetadataInTransactionByKey(transaction: Database.Connection.ReadTransaction) -> String -> YapItem? { + return { self.withMetadataInTransaction(transaction, byKey: $0) } } - func byKeyInTransaction(key: String) -> Database.Connection.ReadTransaction -> ItemType? { - return { self.inTransaction($0, byKey: key) } + func withMetadataByKeyInTransaction(key: String) -> Database.Connection.ReadTransaction -> YapItem? { + return { self.withMetadataInTransaction($0, byKey: key) } } - func byKeysInTransaction(keys: [String]? = .None) -> Database.Connection.ReadTransaction -> [ItemType] { - let byKey = inTransactionByKey + func withMetadataByKeysInTransaction(keys: [String]? = .None) -> Database.Connection.ReadTransaction -> [YapItem] { return { transaction in let keys = keys ?? transaction.keysInCollection(ItemType.collection) - return keys.flatMap(byKey(transaction)) + return keys.flatMap(self.withMetadataInTransactionByKey(transaction)) } } @@ -158,8 +196,8 @@ extension Readable where - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func atIndex(index: YapDB.Index) -> ItemType? { - return sync(atIndexInTransaction(index)) + public func withMetadataAtIndex(index: YapDB.Index) -> YapItem? { + return sync(withMetadataAtIndexInTransaction(index)) } /** @@ -168,11 +206,12 @@ extension Readable where - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func atIndexes< - Indexes where + public func withMetadataAtIndexes< + Indexes, Metadata where Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> [ItemType] { - return sync(atIndexesInTransaction(indexes)) + Indexes.Generator.Element == YapDB.Index, + Metadata: NSCoding>(indexes: Indexes) -> [YapItem] { + return sync(withMetadataAtIndexesInTransaction(indexes)) } /** @@ -181,8 +220,8 @@ extension Readable where - parameter key: a String - returns: an optional `ItemType` */ - public func byKey(key: String) -> ItemType? { - return sync(byKeyInTransaction(key)) + public func withMetadataByKey(key: String) -> YapItem? { + return sync(withMetadataByKeyInTransaction(key)) } /** @@ -191,11 +230,12 @@ extension Readable where - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func byKeys< - Keys where + public func withMetadataByKeys< + Keys, Metadata where Keys: SequenceType, - Keys.Generator.Element == String>(keys: Keys) -> [ItemType] { - return sync(byKeysInTransaction(Array(keys))) + Keys.Generator.Element == String, + Metadata: NSCoding>(keys: Keys) -> [YapItem] { + return sync(withMetadataByKeysInTransaction(Array(keys))) } /** @@ -203,8 +243,8 @@ extension Readable where - returns: an array of `ItemType` */ - public func all() -> [ItemType] { - return sync(byKeysInTransaction()) + public func withMetadataAll() -> [YapItem] { + return sync(withMetadataByKeysInTransaction()) } /** @@ -213,11 +253,11 @@ extension Readable where - parameter keys: a SequenceType of String values - returns: a tuple of type `([ItemType], [String])` */ - public func filterExisting(keys: [String]) -> (existing: [ItemType], missing: [String]) { - let existingInTransaction = byKeysInTransaction(keys) - return sync { transaction -> ([ItemType], [String]) in + public func withMetadataFilterExisting(keys: [String]) -> (existing: [YapItem], missing: [String]) { + let existingInTransaction: Database.Connection.ReadTransaction -> [YapItem] = withMetadataByKeysInTransaction(keys) + return sync { transaction -> ([YapItem], [String]) in let existing = existingInTransaction(transaction) - let existingKeys = existing.map(keyForPersistable) + let existingKeys = existing.map {keyForPersistable($0.value)} let missingKeys = keys.filter { !existingKeys.contains($0) } return (existing, missingKeys) } diff --git a/Sources/Persistable_ObjectWithValueMetadata.swift b/Sources/Persistable_ObjectWithValueMetadata.swift index 2d63a2a..3ca949f 100644 --- a/Sources/Persistable_ObjectWithValueMetadata.swift +++ b/Sources/Persistable_ObjectWithValueMetadata.swift @@ -12,10 +12,7 @@ import ValueCoding // MARK: - Persistable extension Persistable where - Self: NSCoding, - Self.MetadataType: ValueCoding, - Self.MetadataType.Coder: NSCoding, - Self.MetadataType.Coder.ValueType == Self.MetadataType { + Self: NSCoding { // Writing @@ -25,8 +22,13 @@ extension Persistable where - parameter transaction: a YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> Self { - return transaction.write(self) + public func writeWithMetadata< + WriteTransaction, Metadata where + WriteTransaction: WriteTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(transaction: WriteTransaction, metadata: Metadata?) -> YapItem { + return transaction.writeWithMetadata(YapItem(self, metadata)) } /** @@ -35,8 +37,13 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> Self { - return connection.write(self) + public func writeWithMetadata< + Connection, Metadata where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(connection: Connection, metadata: Metadata?) -> YapItem { + return connection.writeWithMetadata(YapItem(self, metadata)) } /** @@ -45,8 +52,13 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (Self -> Void)? = .None) { - return connection.asyncWrite(self, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Connection, Metadata where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(connection: Connection, metadata: Metadata?, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (YapItem -> Void)? = .None) { + return connection.asyncWriteWithMetadata(YapItem(self, metadata), queue: queue, completion: completion) } /** @@ -55,17 +67,36 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeWithMetadataOperation< + Connection, Metadata where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(connection: Connection, metadata: Metadata?) -> NSOperation { + return NSBlockOperation { connection.writeWithMetadata(YapItem(self, metadata)) } } } extension SequenceType where Generator.Element: Persistable, - Generator.Element: NSCoding, - Generator.Element.MetadataType: ValueCoding, - Generator.Element.MetadataType.Coder: NSCoding, - Generator.Element.MetadataType.Coder.ValueType == Generator.Element.MetadataType { + Generator.Element: NSCoding { + + /** + Zips the receiver with metadata into an array of YapItem. + Assumes `self` and `metadata` have the same `count`. + + - parameter metadata: a sequence of optional metadatas. + - returns: an array where Persistables and Metadata with corresponding indexes in `self` and `metadata` are joined in a `YapItem` + */ + public func yapItems< + Metadatas, Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata, + Metadatas: SequenceType, + Metadatas.Generator.Element == Optional>(with metadata: Metadatas) -> [YapItem] { + return zip(self, metadata).map { YapItem($0, $1) } + } /** Write the items using an existing transaction. @@ -73,8 +104,14 @@ extension SequenceType where - parameter transaction: a WriteTransactionType e.g. YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> [Generator.Element] { - return transaction.write(self) + public func writeWithMetadata< + WriteTransaction, Metadata where + WriteTransaction: WriteTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(transaction: WriteTransaction, metadata: [Metadata?]) -> [YapItem] { + let items = yapItems(with: metadata) + return transaction.writeWithMetadata(items) } /** @@ -83,8 +120,14 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> [Generator.Element] { - return connection.write(self) + public func writeWithMetadata< + Connection, Metadata where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(connection: Connection, metadata: [Metadata?]) -> [YapItem] { + let items = yapItems(with: metadata) + return connection.writeWithMetadata(items) } /** @@ -93,8 +136,14 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([Generator.Element] -> Void)? = .None) { - return connection.asyncWrite(self, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Connection, Metadata where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(connection: Connection, metadata: [Metadata?], queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([YapItem] -> Void)? = .None) { + let items = yapItems(with: metadata) + return connection.asyncWriteWithMetadata(items, queue: queue, completion: completion) } /** @@ -103,8 +152,14 @@ extension SequenceType where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeWithMetadataOperation< + Connection, Metadata where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(connection: Connection, metadata: [Metadata?]) -> NSOperation { + let items = yapItems(with: metadata) + return NSBlockOperation { connection.writeWithMetadata(items) } } } @@ -112,48 +167,74 @@ extension SequenceType where extension Readable where ItemType: NSCoding, - ItemType: Persistable, - ItemType.MetadataType: ValueCoding, - ItemType.MetadataType.Coder: NSCoding, - ItemType.MetadataType.Coder.ValueType == ItemType.MetadataType { - - func inTransaction(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> ItemType? { - return transaction.readAtIndex(index) + ItemType: Persistable { + + func withMetadataInTransaction< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> YapItem? { + return transaction.readWithMetadataAtIndex(index) } - func inTransactionAtIndex(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> ItemType? { - return { self.inTransaction(transaction, atIndex: $0) } + func withMetadataInTransactionAtIndex< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> YapItem? { + return { self.withMetadataInTransaction(transaction, atIndex: $0) } } - func atIndexInTransaction(index: YapDB.Index) -> Database.Connection.ReadTransaction -> ItemType? { - return { self.inTransaction($0, atIndex: index) } + func withMetadataAtIndexInTransaction< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(index: YapDB.Index) -> Database.Connection.ReadTransaction -> YapItem? { + return { self.withMetadataInTransaction($0, atIndex: index) } } - func atIndexesInTransaction< - Indexes where + func withMetadataAtIndexesInTransaction< + Indexes, Metadata where Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [ItemType] { - let atIndex = inTransactionAtIndex - return { indexes.flatMap(atIndex($0)) } + Indexes.Generator.Element == YapDB.Index, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [YapItem] { + return { indexes.flatMap(self.withMetadataInTransactionAtIndex($0)) } } - func inTransaction(transaction: Database.Connection.ReadTransaction, byKey key: String) -> ItemType? { - return inTransaction(transaction, atIndex: ItemType.indexWithKey(key)) + func withMetadataInTransaction< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(transaction: Database.Connection.ReadTransaction, byKey key: String) -> YapItem? { + return withMetadataInTransaction(transaction, atIndex: ItemType.indexWithKey(key)) } - func inTransactionByKey(transaction: Database.Connection.ReadTransaction) -> String -> ItemType? { - return { self.inTransaction(transaction, byKey: $0) } + func withMetadataInTransactionByKey< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(transaction: Database.Connection.ReadTransaction) -> String -> YapItem? { + return { self.withMetadataInTransaction(transaction, byKey: $0) } } - func byKeyInTransaction(key: String) -> Database.Connection.ReadTransaction -> ItemType? { - return { self.inTransaction($0, byKey: key) } + func withMetadataByKeyInTransaction< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(key: String) -> Database.Connection.ReadTransaction -> YapItem? { + return { self.withMetadataInTransaction($0, byKey: key) } } - func byKeysInTransaction(keys: [String]? = .None) -> Database.Connection.ReadTransaction -> [ItemType] { - let byKey = inTransactionByKey + func withMetadataByKeysInTransaction< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(keys: [String]? = .None) -> Database.Connection.ReadTransaction -> [YapItem] { return { transaction in let keys = keys ?? transaction.keysInCollection(ItemType.collection) - return keys.flatMap(byKey(transaction)) + return keys.flatMap(self.withMetadataInTransactionByKey(transaction)) } } @@ -163,8 +244,12 @@ extension Readable where - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func atIndex(index: YapDB.Index) -> ItemType? { - return sync(atIndexInTransaction(index)) + public func withMetadataAtIndex< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(index: YapDB.Index) -> YapItem? { + return sync(withMetadataAtIndexInTransaction(index)) } /** @@ -173,11 +258,14 @@ extension Readable where - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func atIndexes< - Indexes where + public func withMetadataAtIndexes< + Indexes, Metadata where Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> [ItemType] { - return sync(atIndexesInTransaction(indexes)) + Indexes.Generator.Element == YapDB.Index, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(indexes: Indexes) -> [YapItem] { + return sync(withMetadataAtIndexesInTransaction(indexes)) } /** @@ -186,8 +274,12 @@ extension Readable where - parameter key: a String - returns: an optional `ItemType` */ - public func byKey(key: String) -> ItemType? { - return sync(byKeyInTransaction(key)) + public func withMetadataByKey< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(key: String) -> YapItem? { + return sync(withMetadataByKeyInTransaction(key)) } /** @@ -196,11 +288,14 @@ extension Readable where - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func byKeys< - Keys where + public func withMetadataByKeys< + Keys, Metadata where Keys: SequenceType, - Keys.Generator.Element == String>(keys: Keys) -> [ItemType] { - return sync(byKeysInTransaction(Array(keys))) + Keys.Generator.Element == String, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(keys: Keys) -> [YapItem] { + return sync(withMetadataByKeysInTransaction(Array(keys))) } /** @@ -208,8 +303,12 @@ extension Readable where - returns: an array of `ItemType` */ - public func all() -> [ItemType] { - return sync(byKeysInTransaction()) + public func withMetadataAll< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>() -> [YapItem] { + return sync(withMetadataByKeysInTransaction()) } /** @@ -218,11 +317,15 @@ extension Readable where - parameter keys: a SequenceType of String values - returns: a tuple of type `([ItemType], [String])` */ - public func filterExisting(keys: [String]) -> (existing: [ItemType], missing: [String]) { - let existingInTransaction = byKeysInTransaction(keys) - return sync { transaction -> ([ItemType], [String]) in + public func withMetadataFilterExisting< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(keys: [String]) -> (existing: [YapItem], missing: [String]) { + let existingInTransaction: Database.Connection.ReadTransaction -> [YapItem] = withMetadataByKeysInTransaction(keys) + return sync { transaction -> ([YapItem], [String]) in let existing = existingInTransaction(transaction) - let existingKeys = existing.map(keyForPersistable) + let existingKeys = existing.map {keyForPersistable($0.value)} let missingKeys = keys.filter { !existingKeys.contains($0) } return (existing, missingKeys) } diff --git a/Sources/Persistable_ValueWithNoMetadata.swift b/Sources/Persistable_ValueWithNoMetadata.swift index e52e301..3e19487 100644 --- a/Sources/Persistable_ValueWithNoMetadata.swift +++ b/Sources/Persistable_ValueWithNoMetadata.swift @@ -13,7 +13,6 @@ import ValueCoding extension Persistable where Self: ValueCoding, - Self.MetadataType == Void, Self.Coder: NSCoding, Self.Coder.ValueType == Self { @@ -63,7 +62,6 @@ extension Persistable where extension SequenceType where Generator.Element: Persistable, Generator.Element: ValueCoding, - Generator.Element.MetadataType == Void, Generator.Element.Coder: NSCoding, Generator.Element.Coder.ValueType == Generator.Element { @@ -113,7 +111,6 @@ extension SequenceType where extension Readable where ItemType: ValueCoding, ItemType: Persistable, - ItemType.MetadataType == Void, ItemType.Coder: NSCoding, ItemType.Coder.ValueType == ItemType { diff --git a/Sources/Persistable_ValueWithObjectMetadata.swift b/Sources/Persistable_ValueWithObjectMetadata.swift index ceb3f47..bbabc82 100644 --- a/Sources/Persistable_ValueWithObjectMetadata.swift +++ b/Sources/Persistable_ValueWithObjectMetadata.swift @@ -14,8 +14,7 @@ import ValueCoding extension Persistable where Self: ValueCoding, Self.Coder: NSCoding, - Self.Coder.ValueType == Self, - Self.MetadataType: NSCoding { + Self.Coder.ValueType == Self { // Writing @@ -25,8 +24,11 @@ extension Persistable where - parameter transaction: a YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> Self { - return transaction.write(self) + public func writeWithMetadata< + WriteTransaction, Metadata where + WriteTransaction: WriteTransactionType, + Metadata: NSCoding>(transaction: WriteTransaction, metadata: Metadata?) -> YapItem { + return transaction.writeWithMetadata(YapItem(self, metadata)) } /** @@ -35,8 +37,11 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> Self { - return connection.write(self) + public func writeWithMetadata< + Connection, Metadata where + Connection: ConnectionType, + Metadata: NSCoding>(connection: Connection, metadata: Metadata?) -> YapItem { + return connection.writeWithMetadata(YapItem(self, metadata)) } /** @@ -45,8 +50,11 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (Self -> Void)? = .None) { - return connection.asyncWrite(self, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Connection, Metadata where + Connection: ConnectionType, + Metadata: NSCoding>(connection: Connection, metadata: Metadata?, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (YapItem -> Void)? = .None) { + return connection.asyncWriteWithMetadata(YapItem(self, metadata), queue: queue, completion: completion) } /** @@ -55,8 +63,11 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeWithMetadataOperation< + Connection, Metadata where + Connection: ConnectionType, + Metadata: NSCoding>(connection: Connection, metadata: Metadata?) -> NSOperation { + return NSBlockOperation { connection.writeWithMetadata(YapItem(self, metadata)) } } } @@ -64,8 +75,22 @@ extension SequenceType where Generator.Element: Persistable, Generator.Element: ValueCoding, Generator.Element.Coder: NSCoding, - Generator.Element.Coder.ValueType == Generator.Element, - Generator.Element.MetadataType: NSCoding { + Generator.Element.Coder.ValueType == Generator.Element { + + /** + Zips the receiver with metadata into an array of YapItem. + Assumes `self` and `metadata` have the same `count`. + + - parameter metadata: a sequence of optional metadatas. + - returns: an array where Persistables and Metadata with corresponding indexes in `self` and `metadata` are joined in a `YapItem` + */ + public func yapItems< + Metadatas, Metadata where + Metadata: NSCoding, + Metadatas: SequenceType, + Metadatas.Generator.Element == Optional>(with metadata: Metadatas) -> [YapItem] { + return zip(self, metadata).map { YapItem($0, $1) } + } /** Write the items using an existing transaction. @@ -73,8 +98,12 @@ extension SequenceType where - parameter transaction: a WriteTransactionType e.g. YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> [Generator.Element] { - return transaction.write(self) + public func writeWithMetadata< + WriteTransaction, Metadata where + WriteTransaction: WriteTransactionType, + Metadata: NSCoding>(transaction: WriteTransaction, metadata: [Metadata?]) -> [YapItem] { + let items = yapItems(with: metadata) + return transaction.writeWithMetadata(items) } /** @@ -83,8 +112,12 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> [Generator.Element] { - return connection.write(self) + public func writeWithMetadata< + Connection, Metadata where + Connection: ConnectionType, + Metadata: NSCoding>(connection: Connection, metadata: [Metadata?]) -> [YapItem] { + let items = yapItems(with: metadata) + return connection.writeWithMetadata(items) } /** @@ -93,8 +126,12 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([Generator.Element] -> Void)? = .None) { - return connection.asyncWrite(self, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Connection, Metadata where + Connection: ConnectionType, + Metadata: NSCoding>(connection: Connection, metadata: [Metadata?], queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([YapItem] -> Void)? = .None) { + let items = yapItems(with: metadata) + return connection.asyncWriteWithMetadata(items, queue: queue, completion: completion) } /** @@ -103,8 +140,12 @@ extension SequenceType where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeWithMetadataOperation< + Connection, Metadata where + Connection: ConnectionType, + Metadata: NSCoding>(connection: Connection, metadata: [Metadata?]) -> NSOperation { + let items = yapItems(with: metadata) + return NSBlockOperation { connection.writeWithMetadata(items) } } } @@ -115,46 +156,44 @@ extension Readable where ItemType: ValueCoding, ItemType: Persistable, ItemType.Coder: NSCoding, - ItemType.Coder.ValueType == ItemType, - ItemType.MetadataType: NSCoding { + ItemType.Coder.ValueType == ItemType { - func inTransaction(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> ItemType? { - return transaction.readAtIndex(index) + func withMetadataInTransaction(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> YapItem? { + return transaction.readWithMetadataAtIndex(index) } - func inTransactionAtIndex(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> ItemType? { - return { self.inTransaction(transaction, atIndex: $0) } + func withMetadataInTransactionAtIndex(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> YapItem? { + return { self.withMetadataInTransaction(transaction, atIndex: $0) } } - func atIndexInTransaction(index: YapDB.Index) -> Database.Connection.ReadTransaction -> ItemType? { - return { self.inTransaction($0, atIndex: index) } + func withMetadataAtIndexInTransaction(index: YapDB.Index) -> Database.Connection.ReadTransaction -> YapItem? { + return { self.withMetadataInTransaction($0, atIndex: index) } } - func atIndexesInTransaction< - Indexes where + func withMetadataAtIndexesInTransaction< + Indexes, Metadata where Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [ItemType] { - let atIndex = inTransactionAtIndex - return { indexes.flatMap(atIndex($0)) } + Indexes.Generator.Element == YapDB.Index, + Metadata: NSCoding>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [YapItem] { + return { indexes.flatMap(self.withMetadataInTransactionAtIndex($0)) } } - func inTransaction(transaction: Database.Connection.ReadTransaction, byKey key: String) -> ItemType? { - return inTransaction(transaction, atIndex: ItemType.indexWithKey(key)) + func withMetadataInTransaction(transaction: Database.Connection.ReadTransaction, byKey key: String) -> YapItem? { + return withMetadataInTransaction(transaction, atIndex: ItemType.indexWithKey(key)) } - func inTransactionByKey(transaction: Database.Connection.ReadTransaction) -> String -> ItemType? { - return { self.inTransaction(transaction, byKey: $0) } + func withMetadataInTransactionByKey(transaction: Database.Connection.ReadTransaction) -> String -> YapItem? { + return { self.withMetadataInTransaction(transaction, byKey: $0) } } - func byKeyInTransaction(key: String) -> Database.Connection.ReadTransaction -> ItemType? { - return { self.inTransaction($0, byKey: key) } + func withMetadataByKeyInTransaction(key: String) -> Database.Connection.ReadTransaction -> YapItem? { + return { self.withMetadataInTransaction($0, byKey: key) } } - func byKeysInTransaction(keys: [String]? = .None) -> Database.Connection.ReadTransaction -> [ItemType] { - let byKey = inTransactionByKey + func withMetadataByKeysInTransaction(keys: [String]? = .None) -> Database.Connection.ReadTransaction -> [YapItem] { return { transaction in let keys = keys ?? transaction.keysInCollection(ItemType.collection) - return keys.flatMap(byKey(transaction)) + return keys.flatMap(self.withMetadataInTransactionByKey(transaction)) } } @@ -164,8 +203,8 @@ extension Readable where - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func atIndex(index: YapDB.Index) -> ItemType? { - return sync(atIndexInTransaction(index)) + public func withMetadataAtIndex(index: YapDB.Index) -> YapItem? { + return sync(withMetadataAtIndexInTransaction(index)) } /** @@ -174,11 +213,12 @@ extension Readable where - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func atIndexes< - Indexes where + public func withMetadataAtIndexes< + Indexes, Metadata where Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> [ItemType] { - return sync(atIndexesInTransaction(indexes)) + Indexes.Generator.Element == YapDB.Index, + Metadata: NSCoding>(indexes: Indexes) -> [YapItem] { + return sync(withMetadataAtIndexesInTransaction(indexes)) } /** @@ -187,8 +227,8 @@ extension Readable where - parameter key: a String - returns: an optional `ItemType` */ - public func byKey(key: String) -> ItemType? { - return sync(byKeyInTransaction(key)) + public func withMetadataByKey(key: String) -> YapItem? { + return sync(withMetadataByKeyInTransaction(key)) } /** @@ -197,11 +237,12 @@ extension Readable where - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func byKeys< - Keys where + public func withMetadataByKeys< + Keys, Metadata where Keys: SequenceType, - Keys.Generator.Element == String>(keys: Keys) -> [ItemType] { - return sync(byKeysInTransaction(Array(keys))) + Keys.Generator.Element == String, + Metadata: NSCoding>(keys: Keys) -> [YapItem] { + return sync(withMetadataByKeysInTransaction(Array(keys))) } /** @@ -209,8 +250,8 @@ extension Readable where - returns: an array of `ItemType` */ - public func all() -> [ItemType] { - return sync(byKeysInTransaction()) + public func withMetadataAll() -> [YapItem] { + return sync(withMetadataByKeysInTransaction()) } /** @@ -219,11 +260,11 @@ extension Readable where - parameter keys: a SequenceType of String values - returns: a tuple of type `([ItemType], [String])` */ - public func filterExisting(keys: [String]) -> (existing: [ItemType], missing: [String]) { - let existingInTransaction = byKeysInTransaction(keys) - return sync { transaction -> ([ItemType], [String]) in + public func withMetadataFilterExisting(keys: [String]) -> (existing: [YapItem], missing: [String]) { + let existingInTransaction: Database.Connection.ReadTransaction -> [YapItem] = withMetadataByKeysInTransaction(keys) + return sync { transaction -> ([YapItem], [String]) in let existing = existingInTransaction(transaction) - let existingKeys = existing.map(keyForPersistable) + let existingKeys = existing.map {keyForPersistable($0.value)} let missingKeys = keys.filter { !existingKeys.contains($0) } return (existing, missingKeys) } diff --git a/Sources/Persistable_ValueWithValueMetadata.swift b/Sources/Persistable_ValueWithValueMetadata.swift index 5b7b0fd..c7c4912 100644 --- a/Sources/Persistable_ValueWithValueMetadata.swift +++ b/Sources/Persistable_ValueWithValueMetadata.swift @@ -14,10 +14,7 @@ import ValueCoding extension Persistable where Self: ValueCoding, Self.Coder: NSCoding, - Self.Coder.ValueType == Self, - Self.MetadataType: ValueCoding, - Self.MetadataType.Coder: NSCoding, - Self.MetadataType.Coder.ValueType == Self.MetadataType { + Self.Coder.ValueType == Self { // Writing @@ -27,8 +24,13 @@ extension Persistable where - parameter transaction: a YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> Self { - return transaction.write(self) + public func writeWithMetadata< + WriteTransaction, Metadata where + WriteTransaction: WriteTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(transaction: WriteTransaction, metadata: Metadata?) -> YapItem { + return transaction.writeWithMetadata(YapItem(self, metadata)) } /** @@ -37,8 +39,13 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> Self { - return connection.write(self) + public func writeWithMetadata< + Connection, Metadata where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(connection: Connection, metadata: Metadata?) -> YapItem { + return connection.writeWithMetadata(YapItem(self, metadata)) } /** @@ -47,8 +54,13 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (Self -> Void)? = .None) { - return connection.asyncWrite(self, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Connection, Metadata where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(connection: Connection, metadata: Metadata?, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: (YapItem -> Void)? = .None) { + return connection.asyncWriteWithMetadata(YapItem(self, metadata), queue: queue, completion: completion) } /** @@ -57,8 +69,13 @@ extension Persistable where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeWithMetadataOperation< + Connection, Metadata where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(connection: Connection, metadata: Metadata?) -> NSOperation { + return NSBlockOperation { connection.writeWithMetadata(YapItem(self, metadata)) } } } @@ -66,10 +83,24 @@ extension SequenceType where Generator.Element: Persistable, Generator.Element: ValueCoding, Generator.Element.Coder: NSCoding, - Generator.Element.Coder.ValueType == Generator.Element, - Generator.Element.MetadataType: ValueCoding, - Generator.Element.MetadataType.Coder: NSCoding, - Generator.Element.MetadataType.Coder.ValueType == Generator.Element.MetadataType { + Generator.Element.Coder.ValueType == Generator.Element { + + /** + Zips the receiver with metadata into an array of YapItem. + Assumes `self` and `metadata` have the same `count`. + + - parameter metadata: a sequence of optional metadatas. + - returns: an array where Persistables and Metadata with corresponding indexes in `self` and `metadata` are joined in a `YapItem` + */ + public func yapItems< + Metadatas, Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata, + Metadatas: SequenceType, + Metadatas.Generator.Element == Optional>(with metadata: Metadatas) -> [YapItem] { + return zip(self, metadata).map { YapItem($0, $1) } + } /** Write the items using an existing transaction. @@ -77,8 +108,14 @@ extension SequenceType where - parameter transaction: a WriteTransactionType e.g. YapDatabaseReadWriteTransaction - returns: the receiver. */ - public func write(transaction: WriteTransaction) -> [Generator.Element] { - return transaction.write(self) + public func writeWithMetadata< + WriteTransaction, Metadata where + WriteTransaction: WriteTransactionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(transaction: WriteTransaction, metadata: [Metadata?]) -> [YapItem] { + let items = yapItems(with: metadata) + return transaction.writeWithMetadata(items) } /** @@ -87,8 +124,14 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: the receiver. */ - public func write(connection: Connection) -> [Generator.Element] { - return connection.write(self) + public func writeWithMetadata< + Connection, Metadata where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(connection: Connection, metadata: [Metadata?]) -> [YapItem] { + let items = yapItems(with: metadata) + return connection.writeWithMetadata(items) } /** @@ -97,8 +140,14 @@ extension SequenceType where - parameter connection: a ConnectionType e.g. YapDatabaseConnection - returns: a closure which receives as an argument the receiver of this function. */ - public func asyncWrite(connection: Connection, queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([Generator.Element] -> Void)? = .None) { - return connection.asyncWrite(self, queue: queue, completion: completion) + public func asyncWriteWithMetadata< + Connection, Metadata where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(connection: Connection, metadata: [Metadata?], queue: dispatch_queue_t = dispatch_get_main_queue(), completion: ([YapItem] -> Void)? = .None) { + let items = yapItems(with: metadata) + return connection.asyncWriteWithMetadata(items, queue: queue, completion: completion) } /** @@ -107,8 +156,14 @@ extension SequenceType where - parameter connection: a YapDatabaseConnection - returns: an `NSOperation` */ - public func writeOperation(connection: Connection) -> NSOperation { - return NSBlockOperation { connection.write(self) } + public func writeWithMetadataOperation< + Connection, Metadata where + Connection: ConnectionType, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(connection: Connection, metadata: [Metadata?]) -> NSOperation { + let items = yapItems(with: metadata) + return NSBlockOperation { connection.writeWithMetadata(items) } } } @@ -118,48 +173,74 @@ extension Readable where ItemType: ValueCoding, ItemType: Persistable, ItemType.Coder: NSCoding, - ItemType.Coder.ValueType == ItemType, - ItemType.MetadataType: ValueCoding, - ItemType.MetadataType.Coder: NSCoding, - ItemType.MetadataType.Coder.ValueType == ItemType.MetadataType { - - func inTransaction(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> ItemType? { - return transaction.readAtIndex(index) + ItemType.Coder.ValueType == ItemType { + + func withMetadataInTransaction< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(transaction: Database.Connection.ReadTransaction, atIndex index: YapDB.Index) -> YapItem? { + return transaction.readWithMetadataAtIndex(index) } - func inTransactionAtIndex(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> ItemType? { - return { self.inTransaction(transaction, atIndex: $0) } + func withMetadataInTransactionAtIndex< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(transaction: Database.Connection.ReadTransaction) -> YapDB.Index -> YapItem? { + return { self.withMetadataInTransaction(transaction, atIndex: $0) } } - func atIndexInTransaction(index: YapDB.Index) -> Database.Connection.ReadTransaction -> ItemType? { - return { self.inTransaction($0, atIndex: index) } + func withMetadataAtIndexInTransaction< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(index: YapDB.Index) -> Database.Connection.ReadTransaction -> YapItem? { + return { self.withMetadataInTransaction($0, atIndex: index) } } - func atIndexesInTransaction< - Indexes where + func withMetadataAtIndexesInTransaction< + Indexes, Metadata where Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [ItemType] { - let atIndex = inTransactionAtIndex - return { indexes.flatMap(atIndex($0)) } + Indexes.Generator.Element == YapDB.Index, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(indexes: Indexes) -> Database.Connection.ReadTransaction -> [YapItem] { + return { indexes.flatMap(self.withMetadataInTransactionAtIndex($0)) } } - func inTransaction(transaction: Database.Connection.ReadTransaction, byKey key: String) -> ItemType? { - return inTransaction(transaction, atIndex: ItemType.indexWithKey(key)) + func withMetadataInTransaction< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(transaction: Database.Connection.ReadTransaction, byKey key: String) -> YapItem? { + return withMetadataInTransaction(transaction, atIndex: ItemType.indexWithKey(key)) } - func inTransactionByKey(transaction: Database.Connection.ReadTransaction) -> String -> ItemType? { - return { self.inTransaction(transaction, byKey: $0) } + func withMetadataInTransactionByKey< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(transaction: Database.Connection.ReadTransaction) -> String -> YapItem? { + return { self.withMetadataInTransaction(transaction, byKey: $0) } } - func byKeyInTransaction(key: String) -> Database.Connection.ReadTransaction -> ItemType? { - return { self.inTransaction($0, byKey: key) } + func withMetadataByKeyInTransaction< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(key: String) -> Database.Connection.ReadTransaction -> YapItem? { + return { self.withMetadataInTransaction($0, byKey: key) } } - func byKeysInTransaction(keys: [String]? = .None) -> Database.Connection.ReadTransaction -> [ItemType] { - let byKey = inTransactionByKey + func withMetadataByKeysInTransaction< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(keys: [String]? = .None) -> Database.Connection.ReadTransaction -> [YapItem] { return { transaction in let keys = keys ?? transaction.keysInCollection(ItemType.collection) - return keys.flatMap(byKey(transaction)) + return keys.flatMap(self.withMetadataInTransactionByKey(transaction)) } } @@ -169,8 +250,12 @@ extension Readable where - parameter index: a YapDB.Index - returns: an optional `ItemType` */ - public func atIndex(index: YapDB.Index) -> ItemType? { - return sync(atIndexInTransaction(index)) + public func withMetadataAtIndex< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(index: YapDB.Index) -> YapItem? { + return sync(withMetadataAtIndexInTransaction(index)) } /** @@ -179,11 +264,14 @@ extension Readable where - parameter indexes: a SequenceType of YapDB.Index values - returns: an array of `ItemType` */ - public func atIndexes< - Indexes where + public func withMetadataAtIndexes< + Indexes, Metadata where Indexes: SequenceType, - Indexes.Generator.Element == YapDB.Index>(indexes: Indexes) -> [ItemType] { - return sync(atIndexesInTransaction(indexes)) + Indexes.Generator.Element == YapDB.Index, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(indexes: Indexes) -> [YapItem] { + return sync(withMetadataAtIndexesInTransaction(indexes)) } /** @@ -192,8 +280,12 @@ extension Readable where - parameter key: a String - returns: an optional `ItemType` */ - public func byKey(key: String) -> ItemType? { - return sync(byKeyInTransaction(key)) + public func withMetadataByKey< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(key: String) -> YapItem? { + return sync(withMetadataByKeyInTransaction(key)) } /** @@ -202,11 +294,14 @@ extension Readable where - parameter keys: a SequenceType of String values - returns: an array of `ItemType` */ - public func byKeys< - Keys where + public func withMetadataByKeys< + Keys, Metadata where Keys: SequenceType, - Keys.Generator.Element == String>(keys: Keys) -> [ItemType] { - return sync(byKeysInTransaction(Array(keys))) + Keys.Generator.Element == String, + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(keys: Keys) -> [YapItem] { + return sync(withMetadataByKeysInTransaction(Array(keys))) } /** @@ -214,8 +309,12 @@ extension Readable where - returns: an array of `ItemType` */ - public func all() -> [ItemType] { - return sync(byKeysInTransaction()) + public func withMetadataAll< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>() -> [YapItem] { + return sync(withMetadataByKeysInTransaction()) } /** @@ -224,11 +323,15 @@ extension Readable where - parameter keys: a SequenceType of String values - returns: a tuple of type `([ItemType], [String])` */ - public func filterExisting(keys: [String]) -> (existing: [ItemType], missing: [String]) { - let existingInTransaction = byKeysInTransaction(keys) - return sync { transaction -> ([ItemType], [String]) in + public func withMetadataFilterExisting< + Metadata where + Metadata: ValueCoding, + Metadata.Coder: NSCoding, + Metadata.Coder.ValueType == Metadata>(keys: [String]) -> (existing: [YapItem], missing: [String]) { + let existingInTransaction: Database.Connection.ReadTransaction -> [YapItem] = withMetadataByKeysInTransaction(keys) + return sync { transaction -> ([YapItem], [String]) in let existing = existingInTransaction(transaction) - let existingKeys = existing.map(keyForPersistable) + let existingKeys = existing.map {keyForPersistable($0.value)} let missingKeys = keys.filter { !existingKeys.contains($0) } return (existing, missingKeys) } diff --git a/Sources/YapDatabaseExtensions.swift b/Sources/YapDatabaseExtensions.swift index d1cf280..b6cf121 100644 --- a/Sources/YapDatabaseExtensions.swift +++ b/Sources/YapDatabaseExtensions.swift @@ -145,6 +145,30 @@ extension YapDB { } } +/** +A pairing (effectively a tuple) of a value and a metadata. +Used when values and metadatas are read or written together. +*/ +public struct YapItem { + + /// The item's value + let value: Value + + /// The item's metadata + let metadata: Metadata? + + /** + Create a new YapItem value. + + - parameter value: the value associated with a `YapDB.Index` + - parameter metadata: an optional metadata associated with a `YapDB.Index` + */ + public init(_ value: Value, _ metadata: Metadata?) { + self.value = value + self.metadata = metadata + } +} + // MARK: - Identifiable /** @@ -182,14 +206,8 @@ are stored in the same YapDatabase collection. */ public protocol Persistable: Identifiable { - /// The nested type of the metadata. Defaults to Void. - associatedtype MetadataType - /// The YapDatabase collection name the type is stored in. static var collection: String { get } - - /// A metadata which is set when reading, and get when writing. - var metadata: MetadataType? { get set } } extension Persistable { @@ -222,15 +240,6 @@ extension Persistable { return Set(keys).map { YapDB.Index(collection: collection, key: $0) } } - /** - Default metadata property. Implement this to re-define your - own MetadataType. - */ - public var metadata: Void? { - get { return .None } - set { } - } - /** Convenience computed property to get the key for a persistable, which is just the identifier's description. diff --git a/Tests/Models.swift b/Tests/Models.swift index 1994c7b..22a2efa 100644 --- a/Tests/Models.swift +++ b/Tests/Models.swift @@ -31,13 +31,11 @@ public struct Product: Identifiable, Equatable { } } - public var metadata: Metadata? = .None public let identifier: Identifier internal let name: String internal let barcode: Barcode - public init(metadata: Metadata? = .None, identifier: Identifier, name: String, barcode: Barcode) { - self.metadata = metadata + public init(identifier: Identifier, name: String, barcode: Barcode) { self.identifier = identifier self.name = name self.barcode = barcode @@ -46,7 +44,6 @@ public struct Product: Identifiable, Equatable { public struct Inventory: Identifiable, Equatable { let product: Product - public var metadata: NSNumber? = .None public var identifier: Identifier { return product.identifier @@ -77,14 +74,12 @@ public class NamedEntity: NSObject, NSCoding { public class Person: NamedEntity { } public class Employee: NamedEntity { - public var metadata: NSDate? = .None } public class Manager: NamedEntity { public struct Metadata: Equatable { public let numberOfDirectReports: Int } - public var metadata: Metadata? = .None } // MARK: - Equatable @@ -109,7 +104,7 @@ public func == (a: Product.Metadata, b: Product.Metadata) -> Bool { } public func == (a: Inventory, b: Inventory) -> Bool { - return (a.product == b.product) && (a.metadata == b.metadata) + return (a.product == b.product) } public func == (a: NamedEntity, b: NamedEntity) -> Bool { @@ -140,6 +135,18 @@ extension Inventory: Hashable { } } +extension Product.Metadata: Hashable { + public var hashValue: Int { + return categoryIdentifier.hashValue + } +} + +extension Manager.Metadata: Hashable { + public var hashValue: Int { + return numberOfDirectReports.hashValue + } +} + extension NamedEntity { public override var description: String { @@ -352,7 +359,7 @@ public class InventoryCoder: NSObject, NSCoding, CodingType { public required init?(coder aDecoder: NSCoder) { let product = Product.decode(aDecoder.decodeObjectForKey("product")) - value = Inventory(product: product!, metadata: .None) + value = Inventory(product: product!) } public func encodeWithCoder(aCoder: NSCoder) { diff --git a/Tests/ObjectWithNoMetadataTests.swift b/Tests/ObjectWithNoMetadataTests.swift index ce6fe18..5c125d6 100644 --- a/Tests/ObjectWithNoMetadataTests.swift +++ b/Tests/ObjectWithNoMetadataTests.swift @@ -112,7 +112,6 @@ class ObjectWithNoMetadataTests: XCTestCase { } XCTAssertEqual(readTransaction.didReadAtIndex, index) XCTAssertEqual(result.identifier, item.identifier) - XCTAssertNil(result.metadata) return true } @@ -135,18 +134,6 @@ class ObjectWithNoMetadataTests: XCTestCase { } } -class Base_ObjectWithNoMetadataTests: ObjectWithNoMetadataTests { - - func test__metadata_is_nil() { - XCTAssertNil(item.metadata) - } - - func test__metadata_cannot_be_set() { - item.metadata = Void() - XCTAssertNil(item.metadata) - } -} - class Functional_Read_ObjectWithNoMetadataTests: ObjectWithNoMetadataTests { // Functional API - ReadTransactionType - Reading diff --git a/Tests/ObjectWithObjectMetadataTests.swift b/Tests/ObjectWithObjectMetadataTests.swift index a4f71fb..ea690a2 100644 --- a/Tests/ObjectWithObjectMetadataTests.swift +++ b/Tests/ObjectWithObjectMetadataTests.swift @@ -13,12 +13,15 @@ import XCTest class ObjectWithObjectMetadataTests: XCTestCase { typealias TypeUnderTest = Employee + typealias MetadataTypeUnderTest = NSDate var item: TypeUnderTest! + var metadata: MetadataTypeUnderTest! var index: YapDB.Index! var key: String! var items: [TypeUnderTest]! + var metadatas: [MetadataTypeUnderTest?]! var indexes: [YapDB.Index]! var keys: [String]! @@ -56,9 +59,11 @@ class ObjectWithObjectMetadataTests: XCTestCase { override func tearDown() { item = nil + metadata = nil index = nil key = nil items = nil + metadatas = nil indexes = nil keys = nil @@ -73,55 +78,56 @@ class ObjectWithObjectMetadataTests: XCTestCase { func createPersistables() { item = TypeUnderTest(id: "beatle-1", name: "John") - item.metadata = NSDate() + metadata = NSDate() items = [ item, TypeUnderTest(id: "beatle-2", name: "Paul"), TypeUnderTest(id: "beatle-3", name: "George"), TypeUnderTest(id: "beatle-4", name: "Ringo") ] - items.suffixFrom(1).forEach { $0.metadata = NSDate() } + metadatas = [metadata] + items.suffixFrom(1).forEach { _ in metadatas.append(NSDate()) } } func configureForReadingSingle() { readTransaction.object = item - readTransaction.metadata = item.metadata + readTransaction.metadata = metadata } func configureForReadingMultiple() { readTransaction.objects = items - readTransaction.metadatas = items.map { $0.metadata } + readTransaction.metadatas = metadatas.map { $0 } readTransaction.keys = keys } - func checkTransactionDidWriteItem(result: TypeUnderTest) { - XCTAssertEqual(result.identifier, item.identifier) + func checkTransactionDidWriteItem(result: YapItem) { + XCTAssertEqual(result.value.identifier, item.identifier) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].1.identifier, item.identifier) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].2 as? NSDate, item.metadata) + XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].2 as? NSDate, metadata) } - func checkTransactionDidWriteItems(result: [TypeUnderTest]) { + func checkTransactionDidWriteItems(result: [YapItem]) { XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sort(), indexes.map { $0.key }.sort()) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.2 }.count, items.count) XCTAssertFalse(result.isEmpty) - XCTAssertEqual(Set(result), Set(items)) + XCTAssertEqual(Set(result.map({$0.value})), Set(items)) } - func checkTransactionDidReadItem(result: TypeUnderTest?) -> Bool { + func checkTransactionDidReadItem(result: YapItem?) -> Bool { guard let result = result else { return false } XCTAssertEqual(readTransaction.didReadAtIndex, index) - XCTAssertEqual(result.identifier, item.identifier) + XCTAssertEqual(result.value.identifier, item.identifier) XCTAssertEqual(readTransaction.didReadMetadataAtIndex, index) - XCTAssertEqual(result.metadata, item.metadata) + XCTAssertEqual(result.metadata, metadata) return true } - func checkTransactionDidReadItems(result: [TypeUnderTest]) -> Bool { + func checkTransactionDidReadItems(result: [YapItem]) -> Bool { if result.isEmpty { return false } @@ -145,7 +151,7 @@ class ObjectWithObjectMetadataTests: XCTestCase { class Base_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTests { func test__metadata_is_not_nil() { - XCTAssertNotNil(item.metadata) + XCTAssertNotNil(metadata) } } @@ -155,116 +161,116 @@ class Functional_Read_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTes func test__transaction__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readAtIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readWithMetadataAtIndex(index))) } func test__transaction__read_at_index_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readAtIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readWithMetadataAtIndex(index))) } func test__transaction__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAtIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(indexes))) } func test__transaction__read_at_indexes_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAtIndexes(Set(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(Set(indexes)))) } func test__transaction__read_at_indexes_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readAtIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(indexes))) } func test__transaction__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readByKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readWithMetadataByKey(key))) } func test__transaction__read_by_key_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readByKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readWithMetadataByKey(key))) } func test__transaction__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readByKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(keys))) } func test__transaction__read_by_keys_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readByKeys(Set(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(Set(keys)))) } func test__transaction__read_by_keys_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readByKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(keys))) } func test__transaction__read_all_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAll())) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAll())) } // Functional API - ConnectionType - Reading func test__connection__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.readAtIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(connection.readWithMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_index_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.readAtIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(connection.readWithMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAtIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAtIndexes(Set(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(Set(indexes)))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.readAtIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.readByKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(connection.readWithMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_key_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.readByKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(connection.readWithMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readByKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readByKeys(Set(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataByKeys(Set(keys)))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.readByKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(connection.readWithMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__connection__read_all_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAll())) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAll())) XCTAssertTrue(connection.didRead) } } @@ -272,38 +278,29 @@ class Functional_Read_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTes class Functional_Write_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTests { func test__transaction__write_item() { - checkTransactionDidWriteItem(writeTransaction.write(item)) + checkTransactionDidWriteItem(writeTransaction.writeWithMetadata(YapItem(item, metadata))) } func test__transaction__write_items() { - checkTransactionDidWriteItems(writeTransaction.write(items)) - } - - func test__transaction__write_items_2() { - checkTransactionDidWriteItems(writeTransaction.write(Set(items))) + checkTransactionDidWriteItems(writeTransaction.writeWithMetadata(items.yapItems(with: metadatas))) } // MARK: - Functional API - Connection - Writing func test__connection__write_item() { - checkTransactionDidWriteItem(connection.write(item)) + checkTransactionDidWriteItem(connection.writeWithMetadata(YapItem(item, metadata))) XCTAssertTrue(connection.didWrite) } func test__connection__write_items() { - checkTransactionDidWriteItems(connection.write(items)) - XCTAssertTrue(connection.didWrite) - } - - func test__connection__write_items_2() { - checkTransactionDidWriteItems(connection.write(Set(items))) + checkTransactionDidWriteItems(connection.writeWithMetadata(items.yapItems(with: metadatas))) XCTAssertTrue(connection.didWrite) } func test__connection__async_write_item() { - var result: TypeUnderTest! + var result: YapItem! let expectation = expectationWithDescription("Test: \(#function)") - connection.asyncWrite(item) { tmp in + connection.asyncWriteWithMetadata(YapItem(item, metadata)) { tmp in result = tmp expectation.fulfill() } @@ -313,9 +310,9 @@ class Functional_Write_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTe } func test__connection__async_write_items() { - var result: [TypeUnderTest] = [] + var result: [YapItem] = [] let expectation = expectationWithDescription("Test: \(#function)") - connection.asyncWrite(items) { received in + connection.asyncWriteWithMetadata(items.yapItems(with: metadatas)) { received in result = received expectation.fulfill() } @@ -382,45 +379,45 @@ class Curried_Read_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTests func test__curried__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readAtIndex(index)))) + XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataAtIndex(index)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_index_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readAtIndex(index)))) + XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataAtIndex(index)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readAtIndexes(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataAtIndexes(indexes)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_indexes_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readAtIndexes(indexes)))) + XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataAtIndexes(indexes)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readByKey(key)))) + XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataByKey(key)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_key_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readByKey(key)))) + XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataByKey(key)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readByKeys(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataByKeys(keys)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_keys_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readByKeys(keys)))) + XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataByKeys(keys)))) XCTAssertTrue(connection.didRead) } } @@ -428,7 +425,7 @@ class Curried_Read_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTests class Curried_Write_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTests { func test__curried__write() { - checkTransactionDidWriteItem(connection.write(item.write())) + checkTransactionDidWriteItem(connection.write(item.writeWithMetadata(metadata))) XCTAssertTrue(connection.didWrite) } } @@ -440,69 +437,69 @@ class Persistable_Read_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTe func test__reader__in_transaction_at_index() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader__in_transaction_at_index_2() { configureForReadingSingle() reader = Read(readTransaction) - let atIndex = reader.inTransactionAtIndex(readTransaction) + let atIndex: YapDB.Index -> YapItem? = reader.withMetadataInTransactionAtIndex(readTransaction) XCTAssertTrue(checkTransactionDidReadItem(atIndex(index))) } func test__reader__at_index_in_transaction() { configureForReadingSingle() reader = Read(readTransaction) - let inTransaction = reader.atIndexInTransaction(index) + let inTransaction: TestableReadTransaction -> YapItem? = reader.withMetadataAtIndexInTransaction(index) XCTAssertTrue(checkTransactionDidReadItem(inTransaction(readTransaction))) } func test__reader__at_indexes_in_transaction_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexesInTransaction(indexes)(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexesInTransaction(indexes)(readTransaction))) } func test__reader__at_indexes_in_transaction_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexesInTransaction(indexes)(readTransaction))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexesInTransaction(indexes)(readTransaction))) } func test__reader__in_transaction_by_key() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, byKey: key))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, byKey: key))) } func test__reader__in_transaction_by_key_2() { configureForReadingSingle() reader = Read(readTransaction) - let byKey = reader.inTransactionByKey(readTransaction) + let byKey: String -> YapItem? = reader.withMetadataInTransactionByKey(readTransaction) XCTAssertTrue(checkTransactionDidReadItem(byKey(key))) } func test__reader__by_key_in_transaction() { configureForReadingSingle() reader = Read(readTransaction) - let inTransaction = reader.byKeyInTransaction(key) + let inTransaction: TestableReadTransaction -> YapItem? = reader.withMetadataByKeyInTransaction(key) XCTAssertTrue(checkTransactionDidReadItem(inTransaction(readTransaction))) } func test__reader__by_keys_in_transaction_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeysInTransaction(keys)(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction(keys)(readTransaction))) } func test__reader__by_keys_in_transaction_with_items_with_keys() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeysInTransaction()(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction()(readTransaction))) } func test__reader__by_keys_in_transaction_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeysInTransaction(keys)(readTransaction))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction(keys)(readTransaction))) } // Reading - With Transaction @@ -510,66 +507,66 @@ class Persistable_Read_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTe func test__reader_with_transaction__at_index_with_item() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader_with_transaction__at_index_with_no_item() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) } func test__reader_with_transaction__at_indexes_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) } func test__reader_with_transaction__at_indexes_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) } func test__reader_with_transaction__by_key_with_item() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader_with_transaction__by_key_with_no_item() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataByKey(key))) } func test__reader_with_transaction__by_keys_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) } func test__reader_with_transaction__by_keys_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) } func test__reader_with_transaction__all_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.all())) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_transaction__all_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.all())) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_transaction__filter() { configureForReadingSingle() reader = Read(readTransaction) - let (items, missing) = reader.filterExisting(keys) + let (items, missing): ([YapItem], [String]) = reader.withMetadataFilterExisting(keys) XCTAssertEqual(readTransaction.didReadAtIndexes.first!, indexes.first!) - XCTAssertEqual(items.map { $0.identifier }, items.prefixUpTo(1).map { $0.identifier }) + XCTAssertEqual(items.map { $0.value.identifier }, items.prefixUpTo(1).map { $0.value.identifier }) XCTAssertEqual(missing, Array(keys.suffixFrom(1))) } @@ -578,66 +575,66 @@ class Persistable_Read_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTe func test__reader_with_connection__at_index_with_item() { configureForReadingSingle() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_index_with_no_item() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_indexes_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_indexes_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_key_with_item() { configureForReadingSingle() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_key_with_no_item() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_keys_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_keys_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__all_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.all())) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_connection__all_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.all())) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } @@ -657,19 +654,19 @@ class Persistable_Read_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTe class Persistable_Write_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataTests { func test__item_persistable__write_using_transaction() { - checkTransactionDidWriteItem(item.write(writeTransaction)) + checkTransactionDidWriteItem(item.writeWithMetadata(writeTransaction, metadata: metadata)) } func test__item_persistable__write_using_connection() { - checkTransactionDidWriteItem(item.write(connection)) + checkTransactionDidWriteItem(item.writeWithMetadata(connection, metadata: metadata)) XCTAssertTrue(connection.didWrite) } func test__item_persistable__write_async_using_connection() { let expectation = expectationWithDescription("Test: \(#function)") - var result: TypeUnderTest! = nil + var result: YapItem! = nil - item.asyncWrite(connection) { tmp in + item.asyncWriteWithMetadata(connection, metadata: metadata) { tmp in result = tmp expectation.fulfill() } @@ -681,7 +678,7 @@ class Persistable_Write_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataT func test__item_persistable__write_using_opertion() { let expectation = expectationWithDescription("Test: \(#function)") - let operation = item.writeOperation(connection) + let operation = item.writeWithMetadataOperation(connection, metadata: metadata) operation.completionBlock = { expectation.fulfill() } @@ -691,24 +688,24 @@ class Persistable_Write_ObjectWithObjectMetadataTests: ObjectWithObjectMetadataT XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].1.identifier, item.identifier) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].2 as? NSDate, item.metadata) + XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].2 as? NSDate, metadata) XCTAssertTrue(connection.didWrite) } func test__items_persistable__write_using_transaction() { - checkTransactionDidWriteItems(items.write(writeTransaction)) + checkTransactionDidWriteItems(items.writeWithMetadata(writeTransaction, metadata: metadatas)) } func test__items_persistable__write_using_connection() { - checkTransactionDidWriteItems(items.write(connection)) + checkTransactionDidWriteItems(items.writeWithMetadata(connection, metadata: metadatas)) XCTAssertTrue(connection.didWrite) } func test__items_persistable__write_async_using_connection() { let expectation = expectationWithDescription("Test: \(#function)") - var result: [TypeUnderTest] = [] + var result: [YapItem] = [] - items.asyncWrite(connection) { tmp in + items.asyncWriteWithMetadata(connection, metadata: metadatas) { tmp in result = tmp expectation.fulfill() } diff --git a/Tests/ObjectWithValueMetadataTests.swift b/Tests/ObjectWithValueMetadataTests.swift index ddbe249..7fb12a4 100644 --- a/Tests/ObjectWithValueMetadataTests.swift +++ b/Tests/ObjectWithValueMetadataTests.swift @@ -13,12 +13,15 @@ import XCTest class ObjectWithValueMetadataTests: XCTestCase { typealias TypeUnderTest = Manager + typealias MetadataTypeUnderTest = Manager.Metadata var item: TypeUnderTest! + var metadata: MetadataTypeUnderTest! var index: YapDB.Index! var key: String! var items: [TypeUnderTest]! + var metadatas: [MetadataTypeUnderTest?]! var indexes: [YapDB.Index]! var keys: [String]! @@ -56,9 +59,11 @@ class ObjectWithValueMetadataTests: XCTestCase { override func tearDown() { item = nil + metadata = nil index = nil key = nil items = nil + metadatas = nil indexes = nil keys = nil @@ -73,55 +78,60 @@ class ObjectWithValueMetadataTests: XCTestCase { func createPersistables() { item = TypeUnderTest(id: "beatle-1", name: "John") - item.metadata = TypeUnderTest.Metadata(numberOfDirectReports: 4) + metadata = MetadataTypeUnderTest(numberOfDirectReports: 4) items = [ item, TypeUnderTest(id: "beatle-2", name: "Paul"), TypeUnderTest(id: "beatle-3", name: "George"), TypeUnderTest(id: "beatle-4", name: "Ringo") ] - items.suffixFrom(1).forEach { $0.metadata = TypeUnderTest.Metadata(numberOfDirectReports: 1) } + metadatas = [ + metadata, + MetadataTypeUnderTest(numberOfDirectReports: 3), + MetadataTypeUnderTest(numberOfDirectReports: 2), + MetadataTypeUnderTest(numberOfDirectReports: 1) + ] } func configureForReadingSingle() { readTransaction.object = item - readTransaction.metadata = item.metadata?.encoded + readTransaction.metadata = metadata?.encoded } func configureForReadingMultiple() { readTransaction.objects = items - readTransaction.metadatas = items.map { $0.metadata?.encoded } + readTransaction.metadatas = metadatas.map { $0?.encoded } readTransaction.keys = keys } - func checkTransactionDidWriteItem(result: TypeUnderTest) { - XCTAssertEqual(result.identifier, item.identifier) + func checkTransactionDidWriteItem(result: YapItem) { + XCTAssertEqual(result.value.identifier, item.identifier) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].1.identifier, item.identifier) - XCTAssertEqual(TypeUnderTest.MetadataType.decode(writeTransaction.didWriteAtIndexes[0].2), item.metadata) + XCTAssertEqual(MetadataTypeUnderTest.decode(writeTransaction.didWriteAtIndexes[0].2), metadata) } - func checkTransactionDidWriteItems(result: [TypeUnderTest]) { + func checkTransactionDidWriteItems(result: [YapItem]) { XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sort(), indexes.map { $0.key }.sort()) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.2 }.count, items.count) XCTAssertFalse(result.isEmpty) - XCTAssertEqual(Set(result), Set(items)) + XCTAssertEqual(Set(result.map({$0.value})), Set(items)) } - func checkTransactionDidReadItem(result: TypeUnderTest?) -> Bool { + func checkTransactionDidReadItem(result: YapItem?) -> Bool { guard let result = result else { return false } XCTAssertEqual(readTransaction.didReadAtIndex, index) - XCTAssertEqual(result.identifier, item.identifier) + XCTAssertEqual(result.value.identifier, item.identifier) XCTAssertEqual(readTransaction.didReadMetadataAtIndex, index) - XCTAssertEqual(result.metadata, item.metadata) + XCTAssertEqual(result.metadata, metadata) return true } - func checkTransactionDidReadItems(result: [TypeUnderTest]) -> Bool { + func checkTransactionDidReadItems(result: [YapItem]) -> Bool { if result.isEmpty { return false } @@ -145,7 +155,7 @@ class ObjectWithValueMetadataTests: XCTestCase { class Base_ObjectWithValueMetadataTests: ObjectWithValueMetadataTests { func test__metadata_is_not_nil() { - XCTAssertNotNil(item.metadata) + XCTAssertNotNil(metadata) } } @@ -155,116 +165,116 @@ class Functional_Read_ObjectWithValueMetadataTests: ObjectWithValueMetadataTests func test__transaction__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readAtIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readWithMetadataAtIndex(index))) } func test__transaction__read_at_index_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readAtIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readWithMetadataAtIndex(index))) } func test__transaction__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAtIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(indexes))) } func test__transaction__read_at_indexes_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAtIndexes(Set(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(Set(indexes)))) } func test__transaction__read_at_indexes_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readAtIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(indexes))) } func test__transaction__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readByKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readWithMetadataByKey(key))) } func test__transaction__read_by_key_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readByKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readWithMetadataByKey(key))) } func test__transaction__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readByKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(keys))) } func test__transaction__read_by_keys_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readByKeys(Set(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(Set(keys)))) } func test__transaction__read_by_keys_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readByKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(keys))) } func test__transaction__read_all_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAll())) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAll())) } // Functional API - ConnectionType - Reading func test__connection__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.readAtIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(connection.readWithMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_index_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.readAtIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(connection.readWithMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAtIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAtIndexes(Set(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(Set(indexes)))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.readAtIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.readByKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(connection.readWithMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_key_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.readByKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(connection.readWithMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readByKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readByKeys(Set(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataByKeys(Set(keys)))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.readByKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(connection.readWithMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__connection__read_all_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAll())) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAll())) XCTAssertTrue(connection.didRead) } } @@ -272,38 +282,29 @@ class Functional_Read_ObjectWithValueMetadataTests: ObjectWithValueMetadataTests class Functional_Write_ObjectWithValueMetadataTests: ObjectWithValueMetadataTests { func test__transaction__write_item() { - checkTransactionDidWriteItem(writeTransaction.write(item)) + checkTransactionDidWriteItem(writeTransaction.writeWithMetadata(YapItem(item, metadata))) } func test__transaction__write_items() { - checkTransactionDidWriteItems(writeTransaction.write(items)) - } - - func test__transaction__write_items_2() { - checkTransactionDidWriteItems(writeTransaction.write(Set(items))) + checkTransactionDidWriteItems(writeTransaction.writeWithMetadata(items.yapItems(with: metadatas))) } // MARK: - Functional API - Connection - Writing func test__connection__write_item() { - checkTransactionDidWriteItem(connection.write(item)) + checkTransactionDidWriteItem(connection.writeWithMetadata(YapItem(item, metadata))) XCTAssertTrue(connection.didWrite) } func test__connection__write_items() { - checkTransactionDidWriteItems(connection.write(items)) - XCTAssertTrue(connection.didWrite) - } - - func test__connection__write_items_2() { - checkTransactionDidWriteItems(connection.write(Set(items))) + checkTransactionDidWriteItems(connection.writeWithMetadata(items.yapItems(with: metadatas))) XCTAssertTrue(connection.didWrite) } func test__connection__async_write_item() { - var result: TypeUnderTest! + var result: YapItem! let expectation = expectationWithDescription("Test: \(#function)") - connection.asyncWrite(item) { tmp in + connection.asyncWriteWithMetadata(YapItem(item, metadata)) { tmp in result = tmp expectation.fulfill() } @@ -313,9 +314,9 @@ class Functional_Write_ObjectWithValueMetadataTests: ObjectWithValueMetadataTest } func test__connection__async_write_items() { - var result: [TypeUnderTest] = [] + var result: [YapItem] = [] let expectation = expectationWithDescription("Test: \(#function)") - connection.asyncWrite(items) { received in + connection.asyncWriteWithMetadata(items.yapItems(with: metadatas)) { received in result = received expectation.fulfill() } @@ -382,45 +383,45 @@ class Curried_Read_ObjectWithValueMetadataTests: ObjectWithValueMetadataTests { func test__curried__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readAtIndex(index)))) + XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataAtIndex(index)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_index_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readAtIndex(index)))) + XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataAtIndex(index)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readAtIndexes(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataAtIndexes(indexes)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_indexes_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readAtIndexes(indexes)))) + XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataAtIndexes(indexes)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readByKey(key)))) + XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataByKey(key)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_key_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readByKey(key)))) + XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataByKey(key)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readByKeys(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataByKeys(keys)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_keys_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readByKeys(keys)))) + XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataByKeys(keys)))) XCTAssertTrue(connection.didRead) } } @@ -428,7 +429,7 @@ class Curried_Read_ObjectWithValueMetadataTests: ObjectWithValueMetadataTests { class Curried_Write_ObjectWithValueMetadataTests: ObjectWithValueMetadataTests { func test__curried__write() { - checkTransactionDidWriteItem(connection.write(item.write())) + checkTransactionDidWriteItem(connection.write(item.writeWithMetadata(metadata))) XCTAssertTrue(connection.didWrite) } } @@ -440,69 +441,69 @@ class Persistable_Read_ObjectWithValueMetadataTests: ObjectWithValueMetadataTest func test__reader__in_transaction_at_index() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader__in_transaction_at_index_2() { configureForReadingSingle() reader = Read(readTransaction) - let atIndex = reader.inTransactionAtIndex(readTransaction) + let atIndex: YapDB.Index -> YapItem? = reader.withMetadataInTransactionAtIndex(readTransaction) XCTAssertTrue(checkTransactionDidReadItem(atIndex(index))) } func test__reader__at_index_in_transaction() { configureForReadingSingle() reader = Read(readTransaction) - let inTransaction = reader.atIndexInTransaction(index) + let inTransaction: TestableReadTransaction -> YapItem? = reader.withMetadataAtIndexInTransaction(index) XCTAssertTrue(checkTransactionDidReadItem(inTransaction(readTransaction))) } func test__reader__at_indexes_in_transaction_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexesInTransaction(indexes)(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexesInTransaction(indexes)(readTransaction))) } func test__reader__at_indexes_in_transaction_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexesInTransaction(indexes)(readTransaction))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexesInTransaction(indexes)(readTransaction))) } func test__reader__in_transaction_by_key() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, byKey: key))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, byKey: key))) } func test__reader__in_transaction_by_key_2() { configureForReadingSingle() reader = Read(readTransaction) - let byKey = reader.inTransactionByKey(readTransaction) + let byKey: String -> YapItem? = reader.withMetadataInTransactionByKey(readTransaction) XCTAssertTrue(checkTransactionDidReadItem(byKey(key))) } func test__reader__by_key_in_transaction() { configureForReadingSingle() reader = Read(readTransaction) - let inTransaction = reader.byKeyInTransaction(key) + let inTransaction: TestableReadTransaction -> YapItem? = reader.withMetadataByKeyInTransaction(key) XCTAssertTrue(checkTransactionDidReadItem(inTransaction(readTransaction))) } func test__reader__by_keys_in_transaction_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeysInTransaction(keys)(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction(keys)(readTransaction))) } func test__reader__by_keys_in_transaction_with_items_with_keys() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeysInTransaction()(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction()(readTransaction))) } func test__reader__by_keys_in_transaction_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeysInTransaction(keys)(readTransaction))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction(keys)(readTransaction))) } // Reading - With Transaction @@ -510,66 +511,66 @@ class Persistable_Read_ObjectWithValueMetadataTests: ObjectWithValueMetadataTest func test__reader_with_transaction__at_index_with_item() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader_with_transaction__at_index_with_no_item() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) } func test__reader_with_transaction__at_indexes_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) } func test__reader_with_transaction__at_indexes_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) } func test__reader_with_transaction__by_key_with_item() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader_with_transaction__by_key_with_no_item() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataByKey(key))) } func test__reader_with_transaction__by_keys_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) } func test__reader_with_transaction__by_keys_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) } func test__reader_with_transaction__all_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.all())) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_transaction__all_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.all())) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_transaction__filter() { configureForReadingSingle() reader = Read(readTransaction) - let (items, missing) = reader.filterExisting(keys) + let (items, missing): ([YapItem], [String]) = reader.withMetadataFilterExisting(keys) XCTAssertEqual(readTransaction.didReadAtIndexes.first!, indexes.first!) - XCTAssertEqual(items.map { $0.identifier }, items.prefixUpTo(1).map { $0.identifier }) + XCTAssertEqual(items.map { $0.value.identifier }, items.prefixUpTo(1).map { $0.value.identifier }) XCTAssertEqual(missing, Array(keys.suffixFrom(1))) } @@ -578,66 +579,66 @@ class Persistable_Read_ObjectWithValueMetadataTests: ObjectWithValueMetadataTest func test__reader_with_connection__at_index_with_item() { configureForReadingSingle() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_index_with_no_item() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_indexes_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_indexes_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_key_with_item() { configureForReadingSingle() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_key_with_no_item() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_keys_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_keys_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__all_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.all())) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_connection__all_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.all())) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } @@ -657,19 +658,19 @@ class Persistable_Read_ObjectWithValueMetadataTests: ObjectWithValueMetadataTest class Persistable_Write_ObjectWithValueMetadataTests: ObjectWithValueMetadataTests { func test__item_persistable__write_using_transaction() { - checkTransactionDidWriteItem(item.write(writeTransaction)) + checkTransactionDidWriteItem(item.writeWithMetadata(writeTransaction, metadata: metadata)) } func test__item_persistable__write_using_connection() { - checkTransactionDidWriteItem(item.write(connection)) + checkTransactionDidWriteItem(item.writeWithMetadata(connection, metadata: metadata)) XCTAssertTrue(connection.didWrite) } func test__item_persistable__write_async_using_connection() { let expectation = expectationWithDescription("Test: \(#function)") - var result: TypeUnderTest! = nil + var result: YapItem! = nil - item.asyncWrite(connection) { tmp in + item.asyncWriteWithMetadata(connection, metadata: metadata) { tmp in result = tmp expectation.fulfill() } @@ -681,7 +682,7 @@ class Persistable_Write_ObjectWithValueMetadataTests: ObjectWithValueMetadataTes func test__item_persistable__write_using_opertion() { let expectation = expectationWithDescription("Test: \(#function)") - let operation = item.writeOperation(connection) + let operation = item.writeWithMetadataOperation(connection, metadata: metadata) operation.completionBlock = { expectation.fulfill() } @@ -691,24 +692,24 @@ class Persistable_Write_ObjectWithValueMetadataTests: ObjectWithValueMetadataTes XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].1.identifier, item.identifier) - XCTAssertEqual(TypeUnderTest.MetadataType.decode(writeTransaction.didWriteAtIndexes[0].2), item.metadata) + XCTAssertEqual(MetadataTypeUnderTest.decode(writeTransaction.didWriteAtIndexes[0].2), metadata) XCTAssertTrue(connection.didWrite) } func test__items_persistable__write_using_transaction() { - checkTransactionDidWriteItems(items.write(writeTransaction)) + checkTransactionDidWriteItems(items.writeWithMetadata(writeTransaction, metadata: metadatas)) } func test__items_persistable__write_using_connection() { - checkTransactionDidWriteItems(items.write(connection)) + checkTransactionDidWriteItems(items.writeWithMetadata(connection, metadata: metadatas)) XCTAssertTrue(connection.didWrite) } func test__items_persistable__write_async_using_connection() { let expectation = expectationWithDescription("Test: \(#function)") - var result: [TypeUnderTest] = [] + var result: [YapItem] = [] - items.asyncWrite(connection) { tmp in + items.asyncWriteWithMetadata(connection, metadata: metadatas) { tmp in result = tmp expectation.fulfill() } diff --git a/Tests/ReadWriteTests.swift b/Tests/ReadWriteTests.swift index ae0f920..f526e8d 100644 --- a/Tests/ReadWriteTests.swift +++ b/Tests/ReadWriteTests.swift @@ -10,10 +10,12 @@ import YapDatabase class ReadWriteBaseTests: XCTestCase { var item: Employee! + var metadata: NSDate! var index: YapDB.Index! var key: String! var items: [Employee]! + var metadatas: [NSDate?]! var indexes: [YapDB.Index]! var keys: [String]! @@ -29,9 +31,11 @@ class ReadWriteBaseTests: XCTestCase { override func tearDown() { item = nil + metadata = nil index = nil key = nil items = nil + metadatas = nil indexes = nil keys = nil super.tearDown() @@ -39,18 +43,23 @@ class ReadWriteBaseTests: XCTestCase { func createPersistables() { item = Employee(id: "beatle-1", name: "John") - item.metadata = NSDate() + metadata = NSDate() items = [ item, Employee(id: "beatle-2", name: "Paul"), Employee(id: "beatle-3", name: "George"), Employee(id: "beatle-4", name: "Ringo") ] - items.suffixFrom(1).forEach { $0.metadata = NSDate() } + metadatas = [ + metadata, + NSDate(), + NSDate(), + NSDate() + ] } func writeItemsToDatabase(db: YapDatabase) { - db.makeNewConnection().write(items) + db.makeNewConnection().writeWithMetadata(items.yapItems(with: metadatas)) } } diff --git a/Tests/ValueWithNoMetadataTests.swift b/Tests/ValueWithNoMetadataTests.swift index 7c61aec..dc15538 100644 --- a/Tests/ValueWithNoMetadataTests.swift +++ b/Tests/ValueWithNoMetadataTests.swift @@ -114,7 +114,6 @@ class ValueWithNoMetadataTests: XCTestCase { } XCTAssertEqual(readTransaction.didReadAtIndex, index) XCTAssertEqual(result.identifier, item.identifier) - XCTAssertNil(result.metadata) return true } @@ -137,18 +136,6 @@ class ValueWithNoMetadataTests: XCTestCase { } } -class Base_ValueWithNoMetadataTests: ValueWithNoMetadataTests { - - func test__metadata_is_nil() { - XCTAssertNil(item.metadata) - } - - func test__metadata_cannot_be_set() { - item.metadata = Void() - XCTAssertNil(item.metadata) - } -} - class Functional_Read_ValueWithNoMetadataTests: ValueWithNoMetadataTests { // Functional API - ReadTransactionType - Reading diff --git a/Tests/ValueWithObjectMetadataTests.swift b/Tests/ValueWithObjectMetadataTests.swift index 185e02f..b954985 100644 --- a/Tests/ValueWithObjectMetadataTests.swift +++ b/Tests/ValueWithObjectMetadataTests.swift @@ -13,12 +13,15 @@ import XCTest class ValueWithObjectMetadataTests: XCTestCase { typealias TypeUnderTest = Inventory + typealias MetadataTypeUnderTest = NSNumber var item: TypeUnderTest! + var metadata: MetadataTypeUnderTest! var index: YapDB.Index! var key: String! var items: [TypeUnderTest]! + var metadatas: [MetadataTypeUnderTest?]! var indexes: [YapDB.Index]! var keys: [String]! @@ -56,9 +59,11 @@ class ValueWithObjectMetadataTests: XCTestCase { override func tearDown() { item = nil + metadata = nil index = nil key = nil items = nil + metadatas = nil indexes = nil keys = nil @@ -74,74 +79,77 @@ class ValueWithObjectMetadataTests: XCTestCase { func createPersistables() { let products = [ Product( - metadata: Product.Metadata(categoryIdentifier: 1), identifier: "vodka-123", name: "Belvidere", barcode: .UPCA(1, 2, 3, 4) ), Product( - metadata: Product.Metadata(categoryIdentifier: 2), identifier: "gin-123", name: "Boxer Gin", barcode: .UPCA(5, 10, 15, 20) ), Product( - metadata: Product.Metadata(categoryIdentifier: 3), identifier: "rum-123", name: "Mount Gay Rum", barcode: .UPCA(12, 24, 39, 48) ), Product( - metadata: Product.Metadata(categoryIdentifier: 2), identifier: "gin-234", name: "Monkey 47", barcode: .UPCA(31, 62, 93, 124) ) ] - items = products.map { TypeUnderTest(product: $0, metadata: NSNumber(integer: 12)) } + metadatas = [ + NSNumber(integer: 12), + NSNumber(integer: 13), + NSNumber(integer: 14), + NSNumber(integer: 15) + ] + items = products.map { TypeUnderTest(product: $0) } item = items[0] + metadata = metadatas[0] } func configureForReadingSingle() { readTransaction.object = item.encoded - readTransaction.metadata = item.metadata + readTransaction.metadata = metadata } func configureForReadingMultiple() { readTransaction.objects = items.encoded - readTransaction.metadatas = items.map { $0.metadata } + readTransaction.metadatas = metadatas.map { $0 } readTransaction.keys = keys } - func checkTransactionDidWriteItem(result: TypeUnderTest) { - XCTAssertEqual(result.identifier, item.identifier) + func checkTransactionDidWriteItem(result: YapItem) { + XCTAssertEqual(result.value.identifier, item.identifier) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) XCTAssertEqual(TypeUnderTest.decode(writeTransaction.didWriteAtIndexes[0].1)!, item) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].2 as? NSNumber, item.metadata) + XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].2 as? NSNumber, metadata) } - func checkTransactionDidWriteItems(result: [TypeUnderTest]) { + func checkTransactionDidWriteItems(result: [YapItem]) { XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sort(), indexes.map { $0.key }.sort()) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.2 }.count, items.count) XCTAssertFalse(result.isEmpty) - XCTAssertEqual(Set(result), Set(items)) + XCTAssertEqual(Set(result.map({$0.value})), Set(items)) } - func checkTransactionDidReadItem(result: TypeUnderTest?) -> Bool { + func checkTransactionDidReadItem(result: YapItem?) -> Bool { XCTAssertEqual(readTransaction.didReadAtIndex, index) guard let result = result else { return false } XCTAssertEqual(readTransaction.didReadMetadataAtIndex, index) - XCTAssertEqual(result.identifier, item.identifier) - XCTAssertEqual(result.metadata, item.metadata) + XCTAssertEqual(result.value.identifier, item.identifier) + XCTAssertEqual(result.metadata, metadata) return true } - func checkTransactionDidReadItems(result: [TypeUnderTest]) -> Bool { + func checkTransactionDidReadItems(result: [YapItem]) -> Bool { if result.isEmpty { return false } @@ -150,17 +158,17 @@ class ValueWithObjectMetadataTests: XCTestCase { return true } - func checkTransactionDidReadMetadataItem(result: TypeUnderTest.MetadataType?) -> Bool { + func checkTransactionDidReadMetadataItem(result: MetadataTypeUnderTest?) -> Bool { XCTAssertNil(readTransaction.didReadAtIndex) guard let result = result else { return false } XCTAssertEqual(readTransaction.didReadMetadataAtIndex, index) - XCTAssertEqual(result, item.metadata) + XCTAssertEqual(result, metadata) return true } - func checkTransactionDidReadMetadataItems(result: [TypeUnderTest.MetadataType]) -> Bool { + func checkTransactionDidReadMetadataItems(result: [MetadataTypeUnderTest]) -> Bool { XCTAssertTrue(readTransaction.didReadAtIndexes.isEmpty) if result.isEmpty { return false @@ -186,7 +194,7 @@ class ValueWithObjectMetadataTests: XCTestCase { class Base_ValueWithObjectMetadataTests: ValueWithObjectMetadataTests { func test__metadata_is_not_nil() { - XCTAssertNotNil(item.metadata) + XCTAssertNotNil(metadata) } } @@ -196,116 +204,116 @@ class Functional_Read_ValueWithObjectMetadataTests: ValueWithObjectMetadataTests func test__transaction__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readAtIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readWithMetadataAtIndex(index))) } func test__transaction__read_at_index_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readAtIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readWithMetadataAtIndex(index))) } func test__transaction__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAtIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(indexes))) } func test__transaction__read_at_indexes_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAtIndexes(Set(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(Set(indexes)))) } func test__transaction__read_at_indexes_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readAtIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(indexes))) } func test__transaction__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readByKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readWithMetadataByKey(key))) } func test__transaction__read_by_key_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readByKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readWithMetadataByKey(key))) } func test__transaction__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readByKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(keys))) } func test__transaction__read_by_keys_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readByKeys(Set(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(Set(keys)))) } func test__transaction__read_by_keys_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readByKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(keys))) } func test__transaction__read_all_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAll())) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAll())) } // Functional API - ConnectionType - Reading func test__connection__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.readAtIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(connection.readWithMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_index_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.readAtIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(connection.readWithMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAtIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAtIndexes(Set(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(Set(indexes)))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.readAtIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.readByKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(connection.readWithMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_key_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.readByKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(connection.readWithMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readByKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readByKeys(Set(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataByKeys(Set(keys)))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.readByKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(connection.readWithMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__connection__read_all_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAll())) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAll())) XCTAssertTrue(connection.didRead) } } @@ -356,38 +364,29 @@ class Functional_Read_Metadata_ValueWithObjectMetadataTests: ValueWithObjectMeta class Functional_Write_ValueWithObjectMetadataTests: ValueWithObjectMetadataTests { func test__transaction__write_item() { - checkTransactionDidWriteItem(writeTransaction.write(item)) + checkTransactionDidWriteItem(writeTransaction.writeWithMetadata(YapItem(item, metadata))) } func test__transaction__write_items() { - checkTransactionDidWriteItems(writeTransaction.write(items)) - } - - func test__transaction__write_items_2() { - checkTransactionDidWriteItems(writeTransaction.write(Set(items))) + checkTransactionDidWriteItems(writeTransaction.writeWithMetadata(items.yapItems(with: metadatas))) } // MARK: - Functional API - Connection - Writing func test__connection__write_item() { - checkTransactionDidWriteItem(connection.write(item)) + checkTransactionDidWriteItem(connection.writeWithMetadata(YapItem(item, metadata))) XCTAssertTrue(connection.didWrite) } func test__connection__write_items() { - checkTransactionDidWriteItems(connection.write(items)) - XCTAssertTrue(connection.didWrite) - } - - func test__connection__write_items_2() { - checkTransactionDidWriteItems(connection.write(Set(items))) + checkTransactionDidWriteItems(connection.writeWithMetadata(items.yapItems(with: metadatas))) XCTAssertTrue(connection.didWrite) } func test__connection__async_write_item() { - var result: TypeUnderTest! + var result: YapItem! let expectation = expectationWithDescription("Test: \(#function)") - connection.asyncWrite(item) { tmp in + connection.asyncWriteWithMetadata(YapItem(item, metadata)) { tmp in result = tmp expectation.fulfill() } @@ -397,9 +396,9 @@ class Functional_Write_ValueWithObjectMetadataTests: ValueWithObjectMetadataTest } func test__connection__async_write_items() { - var result: [TypeUnderTest] = [] + var result: [YapItem] = [] let expectation = expectationWithDescription("Test: \(#function)") - connection.asyncWrite(items) { received in + connection.asyncWriteWithMetadata(items.yapItems(with: metadatas)) { received in result = received expectation.fulfill() } @@ -466,45 +465,45 @@ class Curried_Read_ValueWithObjectMetadataTests: ValueWithObjectMetadataTests { func test__curried__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readAtIndex(index)))) + XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataAtIndex(index)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_index_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readAtIndex(index)))) + XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataAtIndex(index)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readAtIndexes(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataAtIndexes(indexes)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_indexes_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readAtIndexes(indexes)))) + XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataAtIndexes(indexes)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readByKey(key)))) + XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataByKey(key)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_key_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readByKey(key)))) + XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataByKey(key)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readByKeys(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataByKeys(keys)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_keys_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readByKeys(keys)))) + XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataByKeys(keys)))) XCTAssertTrue(connection.didRead) } } @@ -512,7 +511,7 @@ class Curried_Read_ValueWithObjectMetadataTests: ValueWithObjectMetadataTests { class Curried_Write_ValueWithObjectMetadataTests: ValueWithObjectMetadataTests { func test__curried__write() { - checkTransactionDidWriteItem(connection.write(item.write())) + checkTransactionDidWriteItem(connection.write(item.writeWithMetadata(metadata))) XCTAssertTrue(connection.didWrite) } } @@ -524,69 +523,69 @@ class Persistable_Read_ValueWithObjectMetadataTests: ValueWithObjectMetadataTest func test__reader__in_transaction_at_index() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader__in_transaction_at_index_2() { configureForReadingSingle() reader = Read(readTransaction) - let atIndex = reader.inTransactionAtIndex(readTransaction) + let atIndex: YapDB.Index -> YapItem? = reader.withMetadataInTransactionAtIndex(readTransaction) XCTAssertTrue(checkTransactionDidReadItem(atIndex(index))) } func test__reader__at_index_in_transaction() { configureForReadingSingle() reader = Read(readTransaction) - let inTransaction = reader.atIndexInTransaction(index) + let inTransaction: TestableReadTransaction -> YapItem? = reader.withMetadataAtIndexInTransaction(index) XCTAssertTrue(checkTransactionDidReadItem(inTransaction(readTransaction))) } func test__reader__at_indexes_in_transaction_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexesInTransaction(indexes)(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexesInTransaction(indexes)(readTransaction))) } func test__reader__at_indexes_in_transaction_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexesInTransaction(indexes)(readTransaction))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexesInTransaction(indexes)(readTransaction))) } func test__reader__in_transaction_by_key() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, byKey: key))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, byKey: key))) } func test__reader__in_transaction_by_key_2() { configureForReadingSingle() reader = Read(readTransaction) - let byKey = reader.inTransactionByKey(readTransaction) + let byKey: String -> YapItem? = reader.withMetadataInTransactionByKey(readTransaction) XCTAssertTrue(checkTransactionDidReadItem(byKey(key))) } func test__reader__by_key_in_transaction() { configureForReadingSingle() reader = Read(readTransaction) - let inTransaction = reader.byKeyInTransaction(key) + let inTransaction: TestableReadTransaction -> YapItem? = reader.withMetadataByKeyInTransaction(key) XCTAssertTrue(checkTransactionDidReadItem(inTransaction(readTransaction))) } func test__reader__by_keys_in_transaction_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeysInTransaction(keys)(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction(keys)(readTransaction))) } func test__reader__by_keys_in_transaction_with_items_with_keys() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeysInTransaction()(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction()(readTransaction))) } func test__reader__by_keys_in_transaction_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeysInTransaction(keys)(readTransaction))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction(keys)(readTransaction))) } // Reading - With Transaction @@ -594,66 +593,66 @@ class Persistable_Read_ValueWithObjectMetadataTests: ValueWithObjectMetadataTest func test__reader_with_transaction__at_index_with_item() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader_with_transaction__at_index_with_no_item() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) } func test__reader_with_transaction__at_indexes_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) } func test__reader_with_transaction__at_indexes_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) } func test__reader_with_transaction__by_key_with_item() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader_with_transaction__by_key_with_no_item() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataByKey(key))) } func test__reader_with_transaction__by_keys_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) } func test__reader_with_transaction__by_keys_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) } func test__reader_with_transaction__all_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.all())) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_transaction__all_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.all())) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_transaction__filter() { configureForReadingSingle() reader = Read(readTransaction) - let (items, missing) = reader.filterExisting(keys) + let (items, missing): ([YapItem], [String]) = reader.withMetadataFilterExisting(keys) XCTAssertEqual(readTransaction.didReadAtIndexes.first!, indexes.first!) - XCTAssertEqual(items.map { $0.identifier }, items.prefixUpTo(1).map { $0.identifier }) + XCTAssertEqual(items.map { $0.value.identifier }, items.prefixUpTo(1).map { $0.value.identifier }) XCTAssertEqual(missing, Array(keys.suffixFrom(1))) } @@ -662,66 +661,66 @@ class Persistable_Read_ValueWithObjectMetadataTests: ValueWithObjectMetadataTest func test__reader_with_connection__at_index_with_item() { configureForReadingSingle() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_index_with_no_item() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_indexes_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_indexes_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_key_with_item() { configureForReadingSingle() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_key_with_no_item() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_keys_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_keys_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__all_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.all())) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_connection__all_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.all())) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } @@ -792,19 +791,19 @@ class Persistable_Read_Metadata_ValueWithObjectMetadataTests: ValueWithObjectMet class Persistable_Write_ValueWithObjectMetadataTests: ValueWithObjectMetadataTests { func test__item_persistable__write_using_transaction() { - checkTransactionDidWriteItem(item.write(writeTransaction)) + checkTransactionDidWriteItem(item.writeWithMetadata(writeTransaction, metadata: metadata)) } func test__item_persistable__write_using_connection() { - checkTransactionDidWriteItem(item.write(connection)) + checkTransactionDidWriteItem(item.writeWithMetadata(connection, metadata: metadata)) XCTAssertTrue(connection.didWrite) } func test__item_persistable__write_async_using_connection() { let expectation = expectationWithDescription("Test: \(#function)") - var result: TypeUnderTest! = nil + var result: YapItem! = nil - item.asyncWrite(connection) { tmp in + item.asyncWriteWithMetadata(connection, metadata: metadata) { tmp in result = tmp expectation.fulfill() } @@ -816,7 +815,7 @@ class Persistable_Write_ValueWithObjectMetadataTests: ValueWithObjectMetadataTes func test__item_persistable__write_using_opertion() { let expectation = expectationWithDescription("Test: \(#function)") - let operation = item.writeOperation(connection) + let operation = item.writeWithMetadataOperation(connection, metadata: metadata) operation.completionBlock = { expectation.fulfill() } @@ -826,24 +825,24 @@ class Persistable_Write_ValueWithObjectMetadataTests: ValueWithObjectMetadataTes XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) XCTAssertEqual(TypeUnderTest.decode(writeTransaction.didWriteAtIndexes[0].1)!, item) - XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].2 as? NSNumber, item.metadata) + XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].2 as? NSNumber, metadata) XCTAssertTrue(connection.didWrite) } func test__items_persistable__write_using_transaction() { - checkTransactionDidWriteItems(items.write(writeTransaction)) + checkTransactionDidWriteItems(items.writeWithMetadata(writeTransaction, metadata: metadatas)) } func test__items_persistable__write_using_connection() { - checkTransactionDidWriteItems(items.write(connection)) + checkTransactionDidWriteItems(items.writeWithMetadata(connection, metadata: metadatas)) XCTAssertTrue(connection.didWrite) } func test__items_persistable__write_async_using_connection() { let expectation = expectationWithDescription("Test: \(#function)") - var result: [TypeUnderTest] = [] + var result: [YapItem] = [] - items.asyncWrite(connection) { tmp in + items.asyncWriteWithMetadata(connection, metadata: metadatas) { tmp in result = tmp expectation.fulfill() } @@ -855,7 +854,7 @@ class Persistable_Write_ValueWithObjectMetadataTests: ValueWithObjectMetadataTes func test__items_persistable__write_using_opertion() { let expectation = expectationWithDescription("Test: \(#function)") - let operation = items.writeOperation(connection) + let operation = items.writeWithMetadataOperation(connection, metadata: metadatas) operation.completionBlock = { expectation.fulfill() } diff --git a/Tests/ValueWithValueMetadataTests.swift b/Tests/ValueWithValueMetadataTests.swift index a22b05d..4b1b257 100644 --- a/Tests/ValueWithValueMetadataTests.swift +++ b/Tests/ValueWithValueMetadataTests.swift @@ -13,12 +13,15 @@ import XCTest class ValueWithValueMetadataTests: XCTestCase { typealias TypeUnderTest = Product + typealias MetadataTypeUnderTest = Product.Metadata var item: TypeUnderTest! + var metadata: MetadataTypeUnderTest! var index: YapDB.Index! var key: String! var items: [TypeUnderTest]! + var metadatas: [MetadataTypeUnderTest?]! var indexes: [YapDB.Index]! var keys: [String]! @@ -56,9 +59,11 @@ class ValueWithValueMetadataTests: XCTestCase { override func tearDown() { item = nil + metadata = nil index = nil key = nil items = nil + metadatas = nil indexes = nil keys = nil @@ -73,73 +78,76 @@ class ValueWithValueMetadataTests: XCTestCase { func createPersistables() { item = TypeUnderTest( - metadata: TypeUnderTest.Metadata(categoryIdentifier: 1), identifier: "vodka-123", name: "Belvidere", barcode: .UPCA(1, 2, 3, 4) ) + metadata = TypeUnderTest.Metadata(categoryIdentifier: 1) items = [ item, TypeUnderTest( - metadata: TypeUnderTest.Metadata(categoryIdentifier: 2), identifier: "gin-123", name: "Boxer Gin", barcode: .UPCA(5, 10, 15, 20) ), TypeUnderTest( - metadata: TypeUnderTest.Metadata(categoryIdentifier: 3), identifier: "rum-123", name: "Mount Gay Rum", barcode: .UPCA(12, 24, 39, 48) ), TypeUnderTest( - metadata: TypeUnderTest.Metadata(categoryIdentifier: 2), identifier: "gin-234", name: "Monkey 47", barcode: .UPCA(31, 62, 93, 124) ) ] + metadatas = [ + metadata, + MetadataTypeUnderTest(categoryIdentifier: 2), + MetadataTypeUnderTest(categoryIdentifier: 3), + MetadataTypeUnderTest(categoryIdentifier: 4) + ] } func configureForReadingSingle() { readTransaction.object = item.encoded - readTransaction.metadata = item.metadata?.encoded + readTransaction.metadata = metadata?.encoded } func configureForReadingMultiple() { readTransaction.objects = items.encoded - readTransaction.metadatas = items.map { $0.metadata?.encoded } + readTransaction.metadatas = metadatas.map { $0?.encoded } readTransaction.keys = keys } - func checkTransactionDidWriteItem(result: TypeUnderTest) { - XCTAssertEqual(result.identifier, item.identifier) + func checkTransactionDidWriteItem(result: YapItem) { + XCTAssertEqual(result.value.identifier, item.identifier) XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) XCTAssertEqual(TypeUnderTest.decode(writeTransaction.didWriteAtIndexes[0].1)!, item) - XCTAssertEqual(TypeUnderTest.MetadataType.decode(writeTransaction.didWriteAtIndexes[0].2), item.metadata) + XCTAssertEqual(MetadataTypeUnderTest.decode(writeTransaction.didWriteAtIndexes[0].2), metadata) } - func checkTransactionDidWriteItems(result: [TypeUnderTest]) { + func checkTransactionDidWriteItems(result: [YapItem]) { XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.0.key }.sort(), indexes.map { $0.key }.sort()) XCTAssertEqual(writeTransaction.didWriteAtIndexes.map { $0.2 }.count, items.count) XCTAssertFalse(result.isEmpty) - XCTAssertEqual(Set(result), Set(items)) + XCTAssertEqual(Set(result.map({$0.value})), Set(items)) } - func checkTransactionDidReadItem(result: TypeUnderTest?) -> Bool { + func checkTransactionDidReadItem(result: YapItem?) -> Bool { XCTAssertEqual(readTransaction.didReadAtIndex, index) guard let result = result else { return false } XCTAssertEqual(readTransaction.didReadMetadataAtIndex, index) - XCTAssertEqual(result.identifier, item.identifier) - XCTAssertEqual(result.metadata, item.metadata) + XCTAssertEqual(result.value.identifier, item.identifier) + XCTAssertEqual(result.metadata, metadata) return true } - func checkTransactionDidReadItems(result: [TypeUnderTest]) -> Bool { + func checkTransactionDidReadItems(result: [YapItem]) -> Bool { if result.isEmpty { return false } @@ -148,17 +156,17 @@ class ValueWithValueMetadataTests: XCTestCase { return true } - func checkTransactionDidReadMetadataItem(result: TypeUnderTest.MetadataType?) -> Bool { + func checkTransactionDidReadMetadataItem(result: MetadataTypeUnderTest?) -> Bool { XCTAssertNil(readTransaction.didReadAtIndex) guard let result = result else { return false } XCTAssertEqual(readTransaction.didReadMetadataAtIndex, index) - XCTAssertEqual(result, item.metadata) + XCTAssertEqual(result, metadata) return true } - func checkTransactionDidReadMetadataItems(result: [TypeUnderTest.MetadataType]) -> Bool { + func checkTransactionDidReadMetadataItems(result: [MetadataTypeUnderTest]) -> Bool { XCTAssertTrue(readTransaction.didReadAtIndexes.isEmpty) if result.isEmpty { return false @@ -183,7 +191,7 @@ class ValueWithValueMetadataTests: XCTestCase { class Base_ValueWithValueMetadataTests: ValueWithValueMetadataTests { func test__metadata_is_not_nil() { - XCTAssertNotNil(item.metadata) + XCTAssertNotNil(metadata) } } @@ -193,116 +201,116 @@ class Functional_Read_ValueWithValueMetadataTests: ValueWithValueMetadataTests { func test__transaction__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readAtIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readWithMetadataAtIndex(index))) } func test__transaction__read_at_index_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readAtIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readWithMetadataAtIndex(index))) } func test__transaction__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAtIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(indexes))) } func test__transaction__read_at_indexes_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAtIndexes(Set(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(Set(indexes)))) } func test__transaction__read_at_indexes_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readAtIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readWithMetadataAtIndexes(indexes))) } func test__transaction__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readByKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(readTransaction.readWithMetadataByKey(key))) } func test__transaction__read_by_key_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readByKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(readTransaction.readWithMetadataByKey(key))) } func test__transaction__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readByKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(keys))) } func test__transaction__read_by_keys_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readByKeys(Set(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(Set(keys)))) } func test__transaction__read_by_keys_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readByKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(readTransaction.readWithMetadataByKeys(keys))) } func test__transaction__read_all_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readAll())) + XCTAssertTrue(checkTransactionDidReadItems(readTransaction.readWithMetadataAll())) } // Functional API - ConnectionType - Reading func test__connection__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.readAtIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(connection.readWithMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_index_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.readAtIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(connection.readWithMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAtIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAtIndexes(Set(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(Set(indexes)))) XCTAssertTrue(connection.didRead) } func test__connection__read_at_indexes_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.readAtIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(connection.readWithMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.readByKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(connection.readWithMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_key_without_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.readByKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(connection.readWithMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readByKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_with_data_2() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readByKeys(Set(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataByKeys(Set(keys)))) XCTAssertTrue(connection.didRead) } func test__connection__read_by_keys_without_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.readByKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(connection.readWithMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__connection__read_all_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.readAll())) + XCTAssertTrue(checkTransactionDidReadItems(connection.readWithMetadataAll())) XCTAssertTrue(connection.didRead) } } @@ -353,38 +361,29 @@ class Functional_Read_Metadata_ValueWithValueMetadataTests: ValueWithValueMetada class Functional_Write_ValueWithValueMetadataTests: ValueWithValueMetadataTests { func test__transaction__write_item() { - checkTransactionDidWriteItem(writeTransaction.write(item)) + checkTransactionDidWriteItem(writeTransaction.writeWithMetadata(YapItem(item, metadata))) } func test__transaction__write_items() { - checkTransactionDidWriteItems(writeTransaction.write(items)) - } - - func test__transaction__write_items_2() { - checkTransactionDidWriteItems(writeTransaction.write(Set(items))) + checkTransactionDidWriteItems(writeTransaction.writeWithMetadata(items.yapItems(with: metadatas))) } // MARK: - Functional API - Connection - Writing func test__connection__write_item() { - checkTransactionDidWriteItem(connection.write(item)) + checkTransactionDidWriteItem(connection.writeWithMetadata(YapItem(item, metadata))) XCTAssertTrue(connection.didWrite) } func test__connection__write_items() { - checkTransactionDidWriteItems(connection.write(items)) - XCTAssertTrue(connection.didWrite) - } - - func test__connection__write_items_2() { - checkTransactionDidWriteItems(connection.write(Set(items))) + checkTransactionDidWriteItems(connection.writeWithMetadata(items.yapItems(with: metadatas))) XCTAssertTrue(connection.didWrite) } func test__connection__async_write_item() { - var result: TypeUnderTest! + var result: YapItem! let expectation = expectationWithDescription("Test: \(#function)") - connection.asyncWrite(item) { tmp in + connection.asyncWriteWithMetadata(YapItem(item, metadata)) { tmp in result = tmp expectation.fulfill() } @@ -394,9 +393,9 @@ class Functional_Write_ValueWithValueMetadataTests: ValueWithValueMetadataTests } func test__connection__async_write_items() { - var result: [TypeUnderTest] = [] + var result: [YapItem] = [] let expectation = expectationWithDescription("Test: \(#function)") - connection.asyncWrite(items) { received in + connection.asyncWriteWithMetadata(items.yapItems(with: metadatas)) { received in result = received expectation.fulfill() } @@ -463,45 +462,45 @@ class Curried_Read_ValueWithValueMetadataTests: ValueWithValueMetadataTests { func test__curried__read_at_index_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readAtIndex(index)))) + XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataAtIndex(index)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_index_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readAtIndex(index)))) + XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataAtIndex(index)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_indexes_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readAtIndexes(indexes)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataAtIndexes(indexes)))) XCTAssertTrue(connection.didRead) } func test__curried__read_at_indexes_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readAtIndexes(indexes)))) + XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataAtIndexes(indexes)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_key_with_data() { configureForReadingSingle() - XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readByKey(key)))) + XCTAssertTrue(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataByKey(key)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_key_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readByKey(key)))) + XCTAssertFalse(checkTransactionDidReadItem(connection.read(TypeUnderTest.readWithMetadataByKey(key)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_keys_with_data() { configureForReadingMultiple() - XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readByKeys(keys)))) + XCTAssertTrue(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataByKeys(keys)))) XCTAssertTrue(connection.didRead) } func test__curried__read_by_keys_with_no_data() { - XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readByKeys(keys)))) + XCTAssertFalse(checkTransactionDidReadItems(connection.read(TypeUnderTest.readWithMetadataByKeys(keys)))) XCTAssertTrue(connection.didRead) } } @@ -509,7 +508,7 @@ class Curried_Read_ValueWithValueMetadataTests: ValueWithValueMetadataTests { class Curried_Write_ValueWithValueMetadataTests: ValueWithValueMetadataTests { func test__curried__write() { - checkTransactionDidWriteItem(connection.write(item.write())) + checkTransactionDidWriteItem(connection.write(item.writeWithMetadata(metadata))) XCTAssertTrue(connection.didWrite) } } @@ -521,69 +520,69 @@ class Persistable_Read_ValueWithValueMetadataTests: ValueWithValueMetadataTests func test__reader__in_transaction_at_index() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader__in_transaction_at_index_2() { configureForReadingSingle() reader = Read(readTransaction) - let atIndex = reader.inTransactionAtIndex(readTransaction) + let atIndex: YapDB.Index -> YapItem? = reader.withMetadataInTransactionAtIndex(readTransaction) XCTAssertTrue(checkTransactionDidReadItem(atIndex(index))) } func test__reader__at_index_in_transaction() { configureForReadingSingle() reader = Read(readTransaction) - let inTransaction = reader.atIndexInTransaction(index) + let inTransaction: TestableReadTransaction -> YapItem? = reader.withMetadataAtIndexInTransaction(index) XCTAssertTrue(checkTransactionDidReadItem(inTransaction(readTransaction))) } func test__reader__at_indexes_in_transaction_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexesInTransaction(indexes)(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexesInTransaction(indexes)(readTransaction))) } func test__reader__at_indexes_in_transaction_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexesInTransaction(indexes)(readTransaction))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexesInTransaction(indexes)(readTransaction))) } func test__reader__in_transaction_by_key() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, byKey: key))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, byKey: key))) } func test__reader__in_transaction_by_key_2() { configureForReadingSingle() reader = Read(readTransaction) - let byKey = reader.inTransactionByKey(readTransaction) + let byKey: String -> YapItem? = reader.withMetadataInTransactionByKey(readTransaction) XCTAssertTrue(checkTransactionDidReadItem(byKey(key))) } func test__reader__by_key_in_transaction() { configureForReadingSingle() reader = Read(readTransaction) - let inTransaction = reader.byKeyInTransaction(key) + let inTransaction: TestableReadTransaction -> YapItem? = reader.withMetadataByKeyInTransaction(key) XCTAssertTrue(checkTransactionDidReadItem(inTransaction(readTransaction))) } func test__reader__by_keys_in_transaction_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeysInTransaction(keys)(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction(keys)(readTransaction))) } func test__reader__by_keys_in_transaction_with_items_with_keys() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeysInTransaction()(readTransaction))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction()(readTransaction))) } func test__reader__by_keys_in_transaction_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeysInTransaction(keys)(readTransaction))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeysInTransaction(keys)(readTransaction))) } // Reading - With Transaction @@ -591,66 +590,66 @@ class Persistable_Read_ValueWithValueMetadataTests: ValueWithValueMetadataTests func test__reader_with_transaction__at_index_with_item() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader_with_transaction__at_index_with_no_item() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) } func test__reader_with_transaction__at_indexes_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) } func test__reader_with_transaction__at_indexes_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) } func test__reader_with_transaction__by_key_with_item() { configureForReadingSingle() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItem(reader.inTransaction(readTransaction, atIndex: index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataInTransaction(readTransaction, atIndex: index))) } func test__reader_with_transaction__by_key_with_no_item() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataByKey(key))) } func test__reader_with_transaction__by_keys_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) } func test__reader_with_transaction__by_keys_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) } func test__reader_with_transaction__all_with_items() { configureForReadingMultiple() reader = Read(readTransaction) - XCTAssertTrue(checkTransactionDidReadItems(reader.all())) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_transaction__all_with_no_items() { reader = Read(readTransaction) - XCTAssertFalse(checkTransactionDidReadItems(reader.all())) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_transaction__filter() { configureForReadingSingle() reader = Read(readTransaction) - let (items, missing) = reader.filterExisting(keys) + let (items, missing): ([YapItem], [String]) = reader.withMetadataFilterExisting(keys) XCTAssertEqual(readTransaction.didReadAtIndexes.first!, indexes.first!) - XCTAssertEqual(items.map { $0.identifier }, items.prefixUpTo(1).map { $0.identifier }) + XCTAssertEqual(items.map { $0.value.identifier }, items.prefixUpTo(1).map { $0.value.identifier }) XCTAssertEqual(missing, Array(keys.suffixFrom(1))) } @@ -659,66 +658,66 @@ class Persistable_Read_ValueWithValueMetadataTests: ValueWithValueMetadataTests func test__reader_with_connection__at_index_with_item() { configureForReadingSingle() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_index_with_no_item() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItem(reader.atIndex(index))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataAtIndex(index))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_indexes_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__at_indexes_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.atIndexes(indexes))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAtIndexes(indexes))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_key_with_item() { configureForReadingSingle() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertTrue(checkTransactionDidReadItem(reader.withMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_key_with_no_item() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItem(reader.byKey(key))) + XCTAssertFalse(checkTransactionDidReadItem(reader.withMetadataByKey(key))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_keys_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__by_keys_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.byKeys(keys))) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataByKeys(keys))) XCTAssertTrue(connection.didRead) } func test__reader_with_connection__all_with_items() { configureForReadingMultiple() reader = Read(connection) - XCTAssertTrue(checkTransactionDidReadItems(reader.all())) + XCTAssertTrue(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } func test__reader_with_connection__all_with_no_items() { reader = Read(connection) - XCTAssertFalse(checkTransactionDidReadItems(reader.all())) + XCTAssertFalse(checkTransactionDidReadItems(reader.withMetadataAll())) XCTAssertTrue(connection.didRead) XCTAssertEqual(readTransaction.didKeysInCollection, TypeUnderTest.collection) } @@ -789,19 +788,19 @@ class Persistable_Read_Metadata_ValueWithValueMetadataTests: ValueWithValueMetad class Persistable_Write_ValueWithValueMetadataTests: ValueWithValueMetadataTests { func test__item_persistable__write_using_transaction() { - checkTransactionDidWriteItem(item.write(writeTransaction)) + checkTransactionDidWriteItem(item.writeWithMetadata(writeTransaction, metadata: metadata)) } func test__item_persistable__write_using_connection() { - checkTransactionDidWriteItem(item.write(connection)) + checkTransactionDidWriteItem(item.writeWithMetadata(connection, metadata: metadata)) XCTAssertTrue(connection.didWrite) } func test__item_persistable__write_async_using_connection() { let expectation = expectationWithDescription("Test: \(#function)") - var result: TypeUnderTest! = nil + var result: YapItem! = nil - item.asyncWrite(connection) { tmp in + item.asyncWriteWithMetadata(connection, metadata: metadata) { tmp in result = tmp expectation.fulfill() } @@ -813,7 +812,7 @@ class Persistable_Write_ValueWithValueMetadataTests: ValueWithValueMetadataTests func test__item_persistable__write_using_opertion() { let expectation = expectationWithDescription("Test: \(#function)") - let operation = item.writeOperation(connection) + let operation = item.writeWithMetadataOperation(connection, metadata: metadata) operation.completionBlock = { expectation.fulfill() } @@ -823,24 +822,24 @@ class Persistable_Write_ValueWithValueMetadataTests: ValueWithValueMetadataTests XCTAssertFalse(writeTransaction.didWriteAtIndexes.isEmpty) XCTAssertEqual(writeTransaction.didWriteAtIndexes[0].0, index) XCTAssertEqual(TypeUnderTest.decode(writeTransaction.didWriteAtIndexes[0].1)!, item) - XCTAssertEqual(TypeUnderTest.MetadataType.decode(writeTransaction.didWriteAtIndexes[0].2), item.metadata) + XCTAssertEqual(MetadataTypeUnderTest.decode(writeTransaction.didWriteAtIndexes[0].2), metadata) XCTAssertTrue(connection.didWrite) } func test__items_persistable__write_using_transaction() { - checkTransactionDidWriteItems(items.write(writeTransaction)) + checkTransactionDidWriteItems(items.writeWithMetadata(writeTransaction, metadata: metadatas)) } func test__items_persistable__write_using_connection() { - checkTransactionDidWriteItems(items.write(connection)) + checkTransactionDidWriteItems(items.writeWithMetadata(connection, metadata: metadatas)) XCTAssertTrue(connection.didWrite) } func test__items_persistable__write_async_using_connection() { let expectation = expectationWithDescription("Test: \(#function)") - var result: [TypeUnderTest] = [] - - items.asyncWrite(connection) { tmp in + var result: [YapItem] = [] + + items.asyncWriteWithMetadata(connection, metadata: metadatas) { tmp in result = tmp expectation.fulfill() } @@ -852,7 +851,7 @@ class Persistable_Write_ValueWithValueMetadataTests: ValueWithValueMetadataTests func test__items_persistable__write_using_opertion() { let expectation = expectationWithDescription("Test: \(#function)") - let operation = items.writeOperation(connection) + let operation = items.writeWithMetadataOperation(connection, metadata: metadatas) operation.completionBlock = { expectation.fulfill() } diff --git a/Tests/YapDatabaseExtensionsTests.swift b/Tests/YapDatabaseExtensionsTests.swift index 90dfae7..b244ca2 100644 --- a/Tests/YapDatabaseExtensionsTests.swift +++ b/Tests/YapDatabaseExtensionsTests.swift @@ -106,19 +106,18 @@ class YapDatabaseReadWriteTransactionTests: ReadWriteBaseTests { } let written = Employee.read(db).atIndex(index) XCTAssertNotNil(written) - XCTAssertNil(written!.metadata) XCTAssertEqual(written!.identifier, item.identifier) } func test__write_at_index_with_metadata() { let db = YapDB.testDatabase() db.makeNewConnection().readWriteWithBlock { transaction in - transaction.writeAtIndex(self.index, object: self.item, metadata: self.item.metadata) + transaction.writeAtIndex(self.index, object: self.item, metadata: self.metadata) } - let written = Employee.read(db).atIndex(index) + let written: YapItem? = Employee.read(db).withMetadataAtIndex(index) XCTAssertNotNil(written) XCTAssertNotNil(written!.metadata) - XCTAssertEqual(written!.identifier, item.identifier) + XCTAssertEqual(written!.value.identifier, item.identifier) } func test__remove_at_indexes() { @@ -172,7 +171,7 @@ class YapDatabaseConnectionTests: ReadWriteBaseTests { var written: Employee? = .None db.makeNewConnection().asyncWrite({ transaction -> Employee? in - transaction.writeAtIndex(self.index, object: self.item, metadata: self.item.metadata) + transaction.writeAtIndex(self.index, object: self.item, metadata: self.metadata) return self.item }, queue: dispatchQueue) { (result: Employee?) in written = result @@ -206,10 +205,12 @@ class YapDatabaseConnectionTests: ReadWriteBaseTests { class ValueCodingTests: XCTestCase { var item: Product! + var metadata: Product.Metadata! var index: YapDB.Index! var key: String! var items: [Product]! + var metadatas: [Product.Metadata?]! var indexes: [YapDB.Index]! var keys: [String]! @@ -225,9 +226,11 @@ class ValueCodingTests: XCTestCase { override func tearDown() { item = nil + metadata = nil index = nil key = nil items = nil + metadatas = nil indexes = nil keys = nil super.tearDown() @@ -235,32 +238,35 @@ class ValueCodingTests: XCTestCase { func createPersistables() { item = Product( - metadata: Product.Metadata(categoryIdentifier: 1), identifier: "vodka-123", name: "Belvidere", barcode: .UPCA(1, 2, 3, 4) ) + metadata = Product.Metadata(categoryIdentifier: 1) items = [ item, Product( - metadata: Product.Metadata(categoryIdentifier: 2), identifier: "gin-123", name: "Boxer Gin", barcode: .UPCA(5, 10, 15, 20) ), Product( - metadata: Product.Metadata(categoryIdentifier: 3), identifier: "rum-123", name: "Mount Gay Rum", barcode: .UPCA(12, 24, 39, 48) ), Product( - metadata: Product.Metadata(categoryIdentifier: 2), identifier: "gin-234", name: "Monkey 47", barcode: .UPCA(31, 62, 93, 124) ) ] + metadatas = [ + metadata, + Product.Metadata(categoryIdentifier: 2), + Product.Metadata(categoryIdentifier: 3), + Product.Metadata(categoryIdentifier: 2) + ] } func test__index_is_hashable() {