 
   @inlinable
   @inline(__always)
-  func lookup(_ key: Key) -> Value? {
-    if count == 0 {
-      // Fast path that avoids computing the hash of the key.
-      return nil
-    }
-    let (index, found) = self.find(key)
-    return found ? self.uncheckedValue(at: index) : nil
+  func key(at index: Index) -> Key {
+    _precondition(hashTable.isOccupied(index),
+      "Attempting to access Dictionary elements using an invalid Index")
+    return self.uncheckedKey(at: index)
+  }
+
+  @inlinable
+  @inline(__always)
+  func value(at index: Index) -> Value {
+    _precondition(hashTable.isOccupied(index),
+      "Attempting to access Dictionary elements using an invalid Index")
+    return self.uncheckedValue(at: index)
   }
 }
 

      cocoaPath()
      // We have to migrate the data first.  But after we do so, the Cocoa
      // index becomes useless, so get the key first.
      let cocoaKey = cocoa.key(for: index._asCocoa)
      let native = _NativeDictionary<Key, Value>(cocoa)
      self = .native(native)
      let nativeKey = _forceBridgeFromObjectiveC(cocoaKey, Key.self)


  @inlinable
  @inline(__always)
  func lookup(_ key: Key) -> Value? {
    if count == 0 {
      // Fast path that avoids computing the hash of the key.
      return nil
    }
    let (index, found) = self.find(key)
    return found ? self.uncheckedValue(at: index) : nil
  }

  @inlinable
  @inline(__always)
  func lookup(_ index: Index) -> (key: Key, value: Value) {
    _precondition(hashTable.isOccupied(index),
      "Attempting to access Dictionary elements using an invalid Index")
