         return nil
     }
     
-    public func fetch<T, U>(key: [String], transformation: T -> U?) throws -> U {
+    public func fetch<T, U>(_ key: [String], transformation: (T) -> U?) throws -> U {
         let fetched: T = try fetch(key)
         guard let transformed = transformation(fetched) else {
             throw ParserError(message: "The value \"\(fetched)\" at key \"\(key)\" could not be transformed.")

        return transformed
    }

    public func fetch<T, U>(key: String, transformation: T -> U?) throws -> U {
        return try self.fetch([key], transformation: transformation)
    }
    
    public func fetchOptional<T, U>(key: [String], transformation: T -> U?) throws -> U? {
        return try self.fetchOptional(key, transformation: transformation)
    }
    
    public func fetchOptional<T, U>(key: String, transformation: T -> U?) throws -> U? {
        return try self.fetchOptional(key).flatMap(transformation)
    }
    
    public func fetchArray<T, U>(key: String, transformation: T -> U?) throws -> [U] {
        return try self.fetchArray([key], transformation: transformation)
    }
    
    public func fetchArray<T, U>(key: [String], transformation: T -> U?) throws -> [U] {
        let fetched: [T] = try fetch(key)
        return fetched.flatMap(transformation)
    }
    
    public func fetchOptionalArray<T, U>(key: String, transformation: T -> U?) throws -> [U]? {
        return try self.fetchOptionalArray([key], transformation: transformation)
    }
    
    public func fetchOptionalArray<T, U>(key: [String], transformation: T -> U?) throws -> [U]? {
        let fetched: [T]? = try fetchOptional(key)
        if let fetched = fetched {
            if fetched.flatMap(transformation).count == 0 {


typealias 🔨 = ParsableObject

struct ParserError: Error {
    let message: String
}

