2121//
2222
2323import Foundation
24+ // FIXME: comparison operators with optionals were removed from the Swift Standard Libary.
25+ // Consider refactoring the code to use the non-optional operators.
26+ fileprivate func < < T : Comparable > ( lhs: T ? , rhs: T ? ) -> Bool {
27+ switch ( lhs, rhs) {
28+ case let ( l? , r? ) :
29+ return l < r
30+ case ( nil , _? ) :
31+ return true
32+ default :
33+ return false
34+ }
35+ }
36+
37+ // FIXME: comparison operators with optionals were removed from the Swift Standard Libary.
38+ // Consider refactoring the code to use the non-optional operators.
39+ fileprivate func >= < T : Comparable > ( lhs: T ? , rhs: T ? ) -> Bool {
40+ switch ( lhs, rhs) {
41+ case let ( l? , r? ) :
42+ return l >= r
43+ default :
44+ return !( lhs < rhs)
45+ }
46+ }
47+
2448
2549//////////////////////////////////////
2650// MARK: Main algorithm
@@ -39,7 +63,7 @@ import Foundation
3963 - Returns: A new array with sorted elements
4064 */
4165
42- public func bucketSort< T: Sortable > ( elements: [ T ] , distributor: Distributor , sorter: Sorter , buckets: [ Bucket < T > ] ) -> [ T ] {
66+ public func bucketSort< T: Sortable > ( _ elements: [ T ] , distributor: Distributor , sorter: Sorter , buckets: [ Bucket < T > ] ) -> [ T ] {
4367 precondition ( allPositiveNumbers ( elements) )
4468 precondition ( enoughSpaceInBuckets ( buckets, elements: elements) )
4569
@@ -57,12 +81,12 @@ public func bucketSort<T: Sortable>(elements: [T], distributor: Distributor, sor
5781 return results
5882}
5983
60- private func allPositiveNumbers< T: Sortable > ( array: [ T ] ) -> Bool {
84+ private func allPositiveNumbers< T: Sortable > ( _ array: [ T ] ) -> Bool {
6185 return array. filter { $0. toInt ( ) >= 0 } . count > 0
6286}
6387
64- private func enoughSpaceInBuckets< T: Sortable > ( buckets: [ Bucket < T > ] , elements: [ T ] ) -> Bool {
65- let maximumValue = elements. maxElement ( ) ? . toInt ( )
88+ private func enoughSpaceInBuckets< T: Sortable > ( _ buckets: [ Bucket < T > ] , elements: [ T ] ) -> Bool {
89+ let maximumValue = elements. max ( ) ? . toInt ( )
6690 let totalCapacity = buckets. count * ( buckets. first? . capacity) !
6791
6892 return totalCapacity >= maximumValue
@@ -74,7 +98,7 @@ private func enoughSpaceInBuckets<T: Sortable>(buckets: [Bucket<T>], elements: [
7498
7599
76100public protocol Distributor {
77- func distribute< T: Sortable > ( element: T , inout buckets: [ Bucket < T > ] )
101+ func distribute< T: Sortable > ( _ element: T , buckets: inout [ Bucket < T > ] )
78102}
79103
80104/*
@@ -96,7 +120,7 @@ public struct RangeDistributor: Distributor {
96120
97121 public init ( ) { }
98122
99- public func distribute< T: Sortable > ( element: T , inout buckets: [ Bucket < T > ] ) {
123+ public func distribute< T: Sortable > ( _ element: T , buckets: inout [ Bucket < T > ] ) {
100124 let value = element. toInt ( )
101125 let bucketCapacity = buckets. first!. capacity
102126
@@ -121,14 +145,14 @@ public protocol Sortable: IntConvertible, Comparable {
121145//////////////////////////////////////
122146
123147public protocol Sorter {
124- func sort< T: Sortable > ( items: [ T ] ) -> [ T ]
148+ func sort< T: Sortable > ( _ items: [ T ] ) -> [ T ]
125149}
126150
127151public struct InsertionSorter : Sorter {
128152
129153 public init ( ) { }
130154
131- public func sort< T: Sortable > ( items: [ T ] ) -> [ T ] {
155+ public func sort< T: Sortable > ( _ items: [ T ] ) -> [ T ] {
132156 var results = items
133157 for i in 0 ..< results. count {
134158 var j = i
@@ -158,13 +182,13 @@ public struct Bucket<T:Sortable> {
158182 elements = [ T] ( )
159183 }
160184
161- public mutating func add( item: T ) {
185+ public mutating func add( _ item: T ) {
162186 if elements. count < capacity {
163187 elements. append ( item)
164188 }
165189 }
166190
167- public func sort( algorithm: Sorter ) -> [ T ] {
191+ public func sort( _ algorithm: Sorter ) -> [ T ] {
168192 return algorithm. sort ( elements)
169193 }
170194}
0 commit comments