Skip to content

Commit

Permalink
Add subscript methods for range-based access in ArrayExtensions
Browse files Browse the repository at this point in the history
  • Loading branch information
homerooliveira committed Jan 22, 2024
1 parent 74acc4f commit 6260a23
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 0 deletions.
20 changes: 20 additions & 0 deletions Sources/SwiftExtensions/ArrayExtensions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,24 @@ extension Array {
self[index.rawValue] = newValue
}
}

public subscript<T>(_ range: Range<T>) -> ArraySlice<Element> where T: RawRepresentable, T: Comparable, T.RawValue == Index {
self[range.lowerBound.rawValue..<range.upperBound.rawValue]
}

Check failure on line 23 in Sources/SwiftExtensions/ArrayExtensions.swift

View workflow job for this annotation

GitHub Actions / lint

Lines should not have trailing whitespace (trailing_whitespace)
public subscript<T>(_ range: ClosedRange<T>) -> ArraySlice<Element> where T: RawRepresentable, T.RawValue == Index, T: Comparable {
self[range.lowerBound.rawValue...range.upperBound.rawValue]
}

public subscript<T>(_ range: PartialRangeFrom<T>) -> ArraySlice<Element> where T: RawRepresentable, T.RawValue == Index, T: Comparable {
self[range.lowerBound.rawValue...]
}

public subscript<T>(_ range: PartialRangeUpTo<T>) -> ArraySlice<Element> where T: RawRepresentable, T.RawValue == Index, T: Comparable {
self[..<range.upperBound.rawValue]
}

public subscript<T>(_ range: PartialRangeThrough<T>) -> ArraySlice<Element> where T: RawRepresentable, T.RawValue == Index, T: Comparable {
self[...range.upperBound.rawValue]
}
}
18 changes: 18 additions & 0 deletions Tests/SwiftExtensionsTests/ArrayExtensionsTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,22 @@ final class ArrayExtensionsTests: XCTestCase {

XCTAssertEqual(numbers, [12, 13])
}

func testSubscriptGetWithRange() throws {
enum Index: Int, Comparable {
case zero
case one

static func < (lhs: Index, rhs: Index) -> Bool {
lhs.rawValue < rhs.rawValue
}
}

let numbers = [0, 1, 2, 3, 4, 5]

XCTAssertEqual(numbers[Index.zero...Index.one], [0, 1])
XCTAssertEqual(numbers[Index.zero...], [0, 1, 2, 3, 4, 5])
XCTAssertEqual(numbers[...Index.one], [0, 1])
XCTAssertEqual(numbers[..<Index.one], [0])
}
}

0 comments on commit 6260a23

Please sign in to comment.