         return DenseArray(shape: newShape, baseArray: subarrays)
     }
     
-    // monadic ⊖
     /// Reverse the order of Elements along the first axis
     public func flip() -> DenseArray<Element> {
         return DenseArray(collection: sequenceFirst.reverse())
     }
     
-    // monadic ⌽
     /// Reverse the order of Elements along the last axis (columns)
     public func reverse() -> DenseArray<Element> {
         return DenseArray(collectionOnLastAxis: sequenceLast.reverse()) // Pretty sure one could do this much more efficiently with linear indexing.
     }
     
-    // diadic ⊖
-    /// Reverse the order of Elements along the first axis
-    //    public func rotateFirst(count: Int) -> DenseArray<Element> {
-    ////        return DenseArray(collection: sequenceFirst.reverse())
-    //    }
-    //
-    //    // diadic ⌽
-    //    /// Reverse the order of Elements along the last axis (columns)
-    //    public func rotateLast(count: Int) -> DenseArray<Element> {
-    ////        return DenseArray(collectionOnLastAxis: sequenceLast.reverse()) // Pretty sure one could do this much more efficiently with linear indexing.
-    //    }
-    
+    /// Returns a DenseArray whose dimensions are reversed.
     public func transpose() -> DenseArray<Element> {
         let indexGenerator = makeColumnMajorIndexGenerator(shape)
         let transposedSeq = AnySequence(anyGenerator { () -> Element? in

    
}

// MARK: - Map, Reduce, Scan, Enumerate
public extension Array {
    
    /// Maps a `transform` upon each element of the Array returning an Array of the same shape with the results.

    
}

// MARK: - Rotate, Reduce, Scan, RotateFirst, ReduceFirst, ScanFirst
public extension Array {
    
    /// Returns a DenseArray whose columns are shifted `count` times.
    public func rotate(count: Int) -> DenseArray<Element> {
        return vectorMap(byRows: true, transform: {$0.rotate(count)})
    }
    
    /// Applies the `combine` upon the last axis of the Array; returning an Array with the last element of `self`'s shape dropped.
    public func reduce<A>(initial: A, combine: ((A, Element)-> A)) -> DenseArray<A> {
        return vectorMap(byRows: true, transform: {[$0.reduce(initial, combine: combine)]})
    }
    
    /// Applies the `combine` upon the last axis of the Array; returning an Array with the last element of `self`'s shape dropped.
    public func reduce(combine: (Element, Element) -> Element) -> DenseArray<Element> {
        return vectorMap(byRows: true, transform: {[$0.reduce(combine)]})
    }
    
    /// Applies the `combine` upon the last axis of the Array, returning the partial results of it's appplication.
    public func scan<A>(initial: A, combine: (A, Element) -> A) -> DenseArray<A> {
        return vectorMap(byRows: true, transform: {$0.scan(initial, combine: combine)})
    }
    
    /// Applies the `combine` upon the last axis of the Array, returning the partial results of it's appplication.
    public func scan(combine: (Element, Element) -> Element) -> DenseArray<Element> {
        return vectorMap(byRows: true, transform: {$0.scan(combine)})
    }
    
    /// Returns a DenseArray whose first dimension's elements are shifted `count` times.
    public func rotateFirst(count: Int) -> DenseArray<Element> {
        return vectorMap(byRows: false, transform: {$0.rotate(count)})
    }
    
    /// Applies the `combine` upon the first axis of the Array; returning an Array with the first element of `self`'s shape dropped.
    public func reduceFirst<A>(initial: A, combine: ((A, Element)-> A)) -> DenseArray<A> {
        return vectorMap(byRows: false, transform: {[$0.reduce(initial, combine: combine)]})
    }
    
    /// Applies the `combine` upon the first axis of the Array; returning an Array with the first element of `self`'s shape dropped.
    public func reduceFirst(combine: (Element, Element) -> Element) -> DenseArray<Element> {
        return vectorMap(byRows: false, transform: {[$0.reduce(combine)]})
    }
    
    /// Applies the `combine` upon the first axis of the Array, returning the partial results of it's appplication.
    public func scanFirst<A>(initial: A, combine: (A, Element) -> A) -> DenseArray<A> {
        return vectorMap(byRows: false, transform: {$0.scan(initial, combine: combine)})
    }
    
    /// Applies the `combine` upon the first axis of the Array, returning the partial results of it's appplication.
    public func scanFirst(combine: (Element, Element) -> Element) -> DenseArray<Element> {
        return vectorMap(byRows: false, transform: {$0.scan(combine)})
    }
    
}
