Interpose
This function returns the given items, with element inserted between
every count items. The implementation below makes sure that the
elements are only interposed and not appended at the end.
func interpose<T>(items: [T], element: T, count: Int = 1) -> [T] {
typealias Acc = (ac: [T], cur: Int, cnt: Int)
return items.reduce((ac: [], cur: 0, cnt: 1), { (a: Acc, o: T) -> Acc in
switch a {
// the last item will not have any interposition
case let (ac, cur, _) where (cur+1) == items.count: return (ac + [o], 0, 0)
// interpose
case let (ac, cur, c) where c == count:
return (ac + [o, element], cur + 1, 1)
// next
case let (ac, cur, c):
return (ac + [o], cur + 1, c + 1)
}
}).ac
}
print(interpose(items: [1, 2, 3, 4, 5], element: 9))
// : [1, 9, 2, 9, 3, 9, 4, 9, 5]
print(interpose(items: [1, 2, 3, 4, 5], element: 9, count: 2))
// : [1, 2, 9, 3, 4, 9, 5]
