         return indexList
     }
     
-    private class func LCSDiff<U>(#oldValue: [T], newValue: [T], mapFunc: Int -> U) -> ArrayDiff<U> {
+    private class func LCSDiff<U>(#oldValue: [T], newValue: [T], mapFunc: IndexType -> U) -> ArrayDiff<U> {
         let matrix = LCSLength(x: oldValue, y: newValue)
         let unchanged = LCSBacktrack(matrix: matrix, x: oldValue, y: newValue)
         

    
    /// @return a mapped list of [x] - [y]
    /// precondition: y is a subset of x
    private class func LCSSubtract<U>(x xlist: [T], y ylist: [T], mapFunc: Int -> U) -> [U] {
        let xlen = countElements(xlist)
        let ylen = countElements(ylist)
        


extension ArrayDiffer {
    
    private typealias IndexType = Int
    private typealias LCSMatrix = Array<Array<IndexType>>
    
    /// @return LCS matrix
    private class func LCSLength(x xlist: [T], y ylist: [T]) -> LCSMatrix {
