Skip to content

Instantly share code, notes, and snippets.

@DanielCardonaRojas
Last active September 17, 2021 13:50
Show Gist options
  • Save DanielCardonaRojas/01a8c4a406bbb1be603c28ecf33bc97e to your computer and use it in GitHub Desktop.
Save DanielCardonaRojas/01a8c4a406bbb1be603c28ecf33bc97e to your computer and use it in GitHub Desktop.
Extension for swift arrays to intersperse elements
extension Array {
func interspersing(_ element: Element) -> Array {
var newArray: [Element] = []
for (index, item) in self.enumerated() {
newArray.append(item)
if index < self.count - 1 {
newArray.append(element)
}
}
return newArray
}
}
@Arrrlex
Copy link

Arrrlex commented Aug 1, 2019

Useful idiom! Here's an alternative implementation:

func interspersing(_ element: Element) -> Array {
  flatMap { [$0, element] }.dropLast()
}

@DanielCardonaRojas
Copy link
Author

Yes, flatMap implementation is definately more elegant.

@justinmeiners
Copy link

justinmeiners commented Sep 15, 2021

@Arrrlex wins for elegance. Here is one for performance sticklers.

extension Array {
    func interspersing(_ element: Element) -> Array {
        var newArray: [Element] = []
        guard !isEmpty else {
            return newArray
        }
        newArray.reserveCapacity(2 * count - 1)
        
        var i = startIndex
        let beforeEnd = index(before: endIndex)
        
        while i != beforeEnd {
            newArray.append(self[i])
            newArray.append(element)
            formIndex(after: &i)
        }
        newArray.append(self[i])
        return newArray
    }
}

@DanielCardonaRojas
Copy link
Author

@Arrrlex wins for elegance. Here is one for performance sticklers.

extension Array {
    func interspersing(_ element: Element) -> Array {
        var newArray: [Element] = []
        guard !isEmpty else {
            return newArray
        }
        newArray.reserveCapacity(2 * count - 1)
        
        var i = startIndex
        let beforeEnd = index(before: endIndex)
        
        while i != beforeEnd {
            newArray.append(self[i])
            newArray.append(element)
            formIndex(after: &i)
        }
        newArray.append(self[i])
        return newArray
    }
}

Awesome thanks @justinmeiners

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment