In Swift, I want to loop over an array and compare each element to the previous and/or next. For each comparison I will either produce a new element or nothing. Is there \"funct
I was looking for a variation of the original Q that I hope might help someone else. I needed to map every item in the array while considering the previous and next values:
extension Sequence {
var withPreviousAndNext: [(Element?, Element, Element?)] {
let optionalSelf = self.map(Optional.some)
let next = optionalSelf.dropFirst() + [nil]
let prev = [nil] + optionalSelf.dropLast()
return zip(self, zip(prev, next)).map {
($1.0, $0, $1.1)
}
}
}
And the not so pretty way to use that with original Q:
let a = [ 1,2,2,3,5,4,2,5,7,9,5,3,8,10 ]
let indices = a.enumerated().withPreviousAndNext.compactMap { values -> Int? in
let (prev, cur, next) = values
return (cur.1 < (prev?.1 ?? Int.min) && cur.1 < (next?.1 ?? Int.min)) ? cur.0 : nil
}
indices // [6,11]