OSDN Git Service

Sequenceのextensionを分離
[kcd/KCD.git] / KCD / ArrayExtensions.swift
1 //
2 //  ArrayExtensions.swift
3 //  KCD
4 //
5 //  Created by Hori,Masaki on 2017/03/01.
6 //  Copyright © 2017年 Hori,Masaki. All rights reserved.
7 //
8
9 import Foundation
10
11 extension Array {
12     
13     func appended(_ elem: () -> Element) -> Array {
14         
15         return self + [elem()]
16     }
17 }
18
19 infix operator ==? : ComparisonPrecedence
20 func ==? <T: Comparable> (lhv: T, rhv: T) -> ComparisonResult {
21     
22     if lhv == rhv {
23         
24         return .orderedSame
25     }
26     if lhv < rhv {
27         
28         return .orderedAscending
29     }
30     
31     return .orderedDescending
32 }
33
34 extension MutableCollection {
35     
36     private func bsearch(min: Int, max: Int, comparator: (Iterator.Element) -> ComparisonResult) -> Iterator.Element? {
37         
38         if max < min {
39             
40             return nil
41         }
42         
43         let current = min + (max - min) / 2
44         let v = self[self.index(self.startIndex, offsetBy: current)]
45         let compRes = comparator(v)
46         
47         if compRes == .orderedSame {
48             
49             return v
50         }
51         
52         let newMin = (compRes == .orderedAscending) ? current + 1 : min
53         let newMax = (compRes == .orderedDescending) ? current - 1 : max
54         
55         return bsearch(min: newMin, max: newMax, comparator: comparator)
56     }
57     
58     func binarySearch(comparator: (Iterator.Element) -> ComparisonResult) -> Iterator.Element? {
59         
60         return bsearch(min: 0, max: self.count - 1, comparator: comparator)
61     }
62 }