-
Notifications
You must be signed in to change notification settings - Fork 10.5k
/
Copy pathRangeSelection.swift
86 lines (81 loc) · 2.99 KB
/
RangeSelection.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
//===--- RangeSelection.swift ---------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
import StdlibUnittest
public enum RangeSelection {
case emptyRange
case leftEdge
case rightEdge
case middle
case leftHalf
case rightHalf
case full
case offsets(Int, Int)
public var isEmpty: Bool {
switch self {
case .emptyRange: return true
default: return false
}
}
public func range<C : Collection>(in c: C) -> Range<C.Index> {
switch self {
case .emptyRange: return c.endIndex..<c.endIndex
case .leftEdge: return c.startIndex..<c.startIndex
case .rightEdge: return c.endIndex..<c.endIndex
case .middle:
let start = c.index(c.startIndex, offsetBy: c.count / 4)
let end = c.index(c.startIndex, offsetBy: 3 * c.count / 4 + 1)
return start..<end
case .leftHalf:
let start = c.startIndex
let end = c.index(start, offsetBy: c.count / 2)
return start..<end
case .rightHalf:
let start = c.index(c.startIndex, offsetBy: c.count / 2)
let end = c.endIndex
return start..<end
case .full:
return c.startIndex..<c.endIndex
case let .offsets(lowerBound, upperBound):
let start = c.index(c.startIndex, offsetBy: numericCast(lowerBound))
let end = c.index(c.startIndex, offsetBy: numericCast(upperBound))
return start..<end
}
}
public func closedRange<C : Collection>(in c: C) -> ClosedRange<C.Index> {
switch self {
case .emptyRange: fatalError("Closed range cannot be empty")
case .leftEdge: return c.startIndex...c.startIndex
case .rightEdge:
let beforeEnd = c.index(c.startIndex, offsetBy: c.count - 1)
return beforeEnd...beforeEnd
case .middle:
let start = c.index(c.startIndex, offsetBy: c.count / 4)
let end = c.index(c.startIndex, offsetBy: 3 * c.count / 4)
return start...end
case .leftHalf:
let start = c.startIndex
let end = c.index(start, offsetBy: c.count / 2 - 1)
return start...end
case .rightHalf:
let start = c.index(c.startIndex, offsetBy: c.count / 2)
let beforeEnd = c.index(c.startIndex, offsetBy: c.count - 1)
return start...beforeEnd
case .full:
let beforeEnd = c.index(c.startIndex, offsetBy: c.count - 1)
return c.startIndex...beforeEnd
case let .offsets(lowerBound, upperBound):
let start = c.index(c.startIndex, offsetBy: numericCast(lowerBound))
let end = c.index(c.startIndex, offsetBy: numericCast(upperBound))
return start...end
}
}
}