 
 		super.init()
 		computeFlattenedRanges()
+	}
+
+	public func prependRow(animated: Bool = true) {
+		numberOfPrependedRows += 1
+		tableView.insertRows(at: IndexSet(integer: 0), withAnimation: animated ? config.insertAnimation : [])
+	}
+
+	public func removeFirstPrependedRow(animated: Bool = true) {
+		numberOfPrependedRows -= 1
+		tableView.removeRows(at: IndexSet(integer: 0), withAnimation: animated ? config.removeAnimation : [])
 	}
 
 	@discardableResult


public struct NSTableViewAdapterConfig {
	public var hidesSectionHeader = false
	public var rowAnimation: NSTableViewAnimationOptions = .slideUp

	public init() {}
}

	}

	public func indexPath(fromFlattened index: Int) -> IndexPath {
		let index = index - numberOfPrependedRows

		if index < 0 {
			// Prepended rows
			return IndexPath(row: numberOfPrependedRows - abs(index), section: -1)
		}

		for (sectionIndex, range) in flattenedRanges.enumerated() {
			if !config.hidesSectionHeader && range.lowerBound == index {
				return IndexPath(section: sectionIndex)
