diff --git a/Sources/FoundationExtensions/Collection/Array+LeftRightOf.swift b/Sources/FoundationExtensions/Collection/Array+LeftRightOf.swift new file mode 100644 index 0000000..f35cc60 --- /dev/null +++ b/Sources/FoundationExtensions/Collection/Array+LeftRightOf.swift @@ -0,0 +1,28 @@ +// +// Array+LeftRightOf.swift +// FoundationExtensions +// +// Created by Thomas Mellenthin on 15.09.20. +// Copyright © 2018 Lautsprecher Teufel GmbH. All rights reserved. +// + +import Foundation + +extension Array where Self.Element : Equatable { + + public func left(of element: Element) -> Element? { + guard let elementIndex = firstIndex(of: element) else { return nil } + if elementIndex == 0 { + return self.last + } + return self[safe: (elementIndex - 1)] + } + + public func right(of element: Element) -> Element? { + guard let elementIndex = firstIndex(of: element) else { return nil } + if elementIndex >= (count - 1) { + return self.first + } + return self[safe: (elementIndex + 1)] + } +} diff --git a/Tests/FoundationExtensionsTests/Array+LeftRightOfTests.swift b/Tests/FoundationExtensionsTests/Array+LeftRightOfTests.swift new file mode 100644 index 0000000..2eba449 --- /dev/null +++ b/Tests/FoundationExtensionsTests/Array+LeftRightOfTests.swift @@ -0,0 +1,39 @@ +// +// ArrayLeftRightOfTests.swift +// FoundationExtensionsTests +// +// Created by Thomas Mellenthin on 15.09.20. +// Copyright © 2018 Lautsprecher Teufel GmbH. All rights reserved. +// + +#if !os(watchOS) +import FoundationExtensions +import XCTest + +class ArrayLeftRightOfTests: XCTestCase { +} + +extension ArrayLeftRightOfTests { + func testRightOf() { + // whe + let sut = [1, 3, 7, 9, 25] + + // then + XCTAssertEqual(sut.right(of: 1), 3) + XCTAssertEqual(sut.right(of: 9), 25) + XCTAssertEqual(sut.right(of: 25), 1) + XCTAssertEqual(sut.right(of: 666), nil) + } + + func testLeftOf() { + // whe + let sut = [1, 3, 7, 9, 25] + + // then + XCTAssertEqual(sut.left(of: 1), 25) + XCTAssertEqual(sut.left(of: 3), 1) + XCTAssertEqual(sut.left(of: 25), 9) + XCTAssertEqual(sut.left(of: 666), nil) + } +} +#endif