     
   }
 
-  internal func search(key: Key) -> Payload? {
-    guard let node = self.findNode(key: key) else {
+  func search(key: Key) -> Payload? {
+    guard let node = findNode(key: key) else {
       return nil
     }
 
     return node.next!.data    
   }    
- 
-}
-
-
-
-// MARK: - Inserting
-
-extension SkipList {
-  private func bootstrapBaseLayer(key: Key, data: Payload) -> Void {    
-    self.head          = Node(asHead: true)    
-    var node           = Node(key: key, data: data)
-
-    self.head!.next    = node
+  
+}
+
+
+
+// MARK: - Insert a node into lanes depending on skip list status ( bootstrap base-layer if head is empty / start insertion from current head ).
+
+extension SkipList {
+  private func bootstrapBaseLayer(key: Key, data: Payload) {    
+    head       = Node(asHead: true)    
+    var node   = Node(key: key, data: data)
+
+    head!.next = node
     
     var currentTopNode = node
 

      node           = Node(key: key, data: data)
      node.down      = currentTopNode
      newHead.next   = node
      newHead.down   = self.head
      self.head      = newHead
      currentTopNode = node
    }
    
  }


  private func insertItem(key: Key, data: Payload) -> Void {
    var stack              = Stack<Node>()
    var currentNode: Node? = self.head

    while currentNode != nil {


  }


  func insert(key: Key, data: Payload) {
    if head != nil {
      if let node = findNode(key: key) {
        // replace, in case of key already exists. 
        var currentNode = node.next        
        while currentNode != nil && currentNode!.key == key {
          currentNode!.data = data
          currentNode       = currentNode!.down
        }
      } else {
        insertItem(key: key, data: data)
      }
      
    } else {
      bootstrapBaseLayer(key: key, data: data)
    }
  }
  
}


// MARK: - Remove a node with a given key. First, find its position in layers at the top, then remove it from each lane by traversing down to the base layer.

extension SkipList {
  public func remove(key: Key) {
    guard let item = findNode(key: key) else {
      return
    }
    
