0001    // Select.swift
0002    //
0003    // The MIT License (MIT)
0004    //
0005    // Copyright (c) 2015 Zewo
0006    //
0007    // Permission is hereby granted, free of charge, to any person obtaining a copy
0008    // of this software and associated documentation files (the "Software"), to deal
0009    // in the Software without restriction, including without limitation the rights
0010    // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
0011    // copies of the Software, and to permit persons to whom the Software is
0012    // furnished to do so, subject to the following conditions:
0013    //
0014    // The above copyright notice and this permission notice shall be included in all
0015    // copies or substantial portions of the Software.
0016    //
0017    // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0018    // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0019    // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
0020    // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
0021    // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
0022    // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
0023    // SOFTWARE.
0024    
0025    import CLibvenice
0026    
0027    protocol SelectCase
Select.swift:32
final class ChannelReceiveCase<T>: SelectCase {
Select.swift:52
final class ReceivingChannelReceiveCase<T>: SelectCase {
Select.swift:72
final class FallibleChannelReceiveCase<T>: SelectCase {
Select.swift:92
final class FallibleReceivingChannelReceiveCase<T>: SelectCase {
Select.swift:112
final class ChannelSendCase<T>: SelectCase {
Select.swift:132
final class SendingChannelSendCase<T>: SelectCase {
Select.swift:152
final class FallibleChannelSendCase<T>: SelectCase {
Select.swift:172
final class FallibleSendingChannelSendCase<T>: SelectCase {
Select.swift:192
final class FallibleChannelSendErrorCase<T>: SelectCase {
Select.swift:212
final class FallibleSendingChannelSendErrorCase<T>: SelectCase {
Select.swift:232
final class TimeoutCase<T>: SelectCase {
Select.swift:251
    var cases: [SelectCase] = []
{ 0028 func register
Select.swift:347
        selectCase.register(clause, index: index)
(clause: UnsafeMutablePointer<Void>, index: Int) 0029 func execute
Select.swift:359
        builder.cases[Int(index)].execute()
() 0030 } 0031 0032 final class ChannelReceiveCase
Select.swift:256
            let selectCase = ChannelReceiveCase(channel: channel, closure: closure)
<T
Select.swift:33
    let channel: Channel<T>
Select.swift:34
    let closure: T -> Void
Select.swift:36
    init(channel: Channel<T>, closure: T -> Void) {
Select.swift:36
    init(channel: Channel<T>, closure: T -> Void) {
>: SelectCase { 0033 let channel
Select.swift:37
        self.channel = channel
Select.swift:42
        channel.registerReceive(clause, index: index)
Select.swift:46
        if let value = channel.getValueFromBuffer() {
: Channel<T> 0034 let closure
Select.swift:38
        self.closure = closure
Select.swift:47
            closure(value)
: T -> Void 0035 0036 init
Select.swift:256
            let selectCase = ChannelReceiveCase(channel: channel, closure: closure)
(channel: Channel<T>, closure: T -> Void) { 0037 self.channel = channel 0038 self.closure = closure 0039 } 0040 0041 func register(clause: UnsafeMutablePointer<Void>, index: Int) { 0042 channel.registerReceive(clause, index: index) 0043 } 0044 0045 func execute() { 0046 if let value = channel.getValueFromBuffer() { 0047 closure(value) 0048 } 0049 } 0050 } 0051 0052 final class ReceivingChannelReceiveCase
Select.swift:263
            let selectCase = ReceivingChannelReceiveCase(channel: channel, closure: closure)
<T
Select.swift:53
    let channel: ReceivingChannel<T>
Select.swift:54
    let closure: T -> Void
Select.swift:56
    init(channel: ReceivingChannel<T>, closure: T -> Void) {
Select.swift:56
    init(channel: ReceivingChannel<T>, closure: T -> Void) {
>: SelectCase { 0053 let channel
Select.swift:57
        self.channel = channel
Select.swift:62
        channel.registerReceive(clause, index: index)
Select.swift:66
        if let value = channel.getValueFromBuffer() {
: ReceivingChannel<T> 0054 let closure
Select.swift:58
        self.closure = closure
Select.swift:67
            closure(value)
: T -> Void 0055 0056 init
Select.swift:263
            let selectCase = ReceivingChannelReceiveCase(channel: channel, closure: closure)
(channel: ReceivingChannel<T>, closure: T -> Void) { 0057 self.channel = channel 0058 self.closure = closure 0059 } 0060 0061 func register(clause: UnsafeMutablePointer<Void>, index: Int) { 0062 channel.registerReceive(clause, index: index) 0063 } 0064 0065 func execute() { 0066 if let value = channel.getValueFromBuffer() { 0067 closure(value) 0068 } 0069 } 0070 } 0071 0072 final class FallibleChannelReceiveCase
Select.swift:270
            let selectCase = FallibleChannelReceiveCase(channel: channel, closure: closure)
<T
Select.swift:73
    let channel: FallibleChannel<T>
Select.swift:74
    var closure: ChannelResult<T> -> Void
Select.swift:76
    init(channel: FallibleChannel<T>, closure: ChannelResult<T> -> Void) {
Select.swift:76
    init(channel: FallibleChannel<T>, closure: ChannelResult<T> -> Void) {
>: SelectCase { 0073 let channel
Select.swift:77
        self.channel = channel
Select.swift:82
        channel.registerReceive(clause, index: index)
Select.swift:86
        if let result = channel.getResultFromBuffer() {
: FallibleChannel<T> 0074 var closure
Select.swift:78
        self.closure = closure
Select.swift:87
            closure(result)
: ChannelResult<T> -> Void 0075 0076 init
Select.swift:270
            let selectCase = FallibleChannelReceiveCase(channel: channel, closure: closure)
(channel: FallibleChannel<T>, closure: ChannelResult<T> -> Void) { 0077 self.channel = channel 0078 self.closure = closure 0079 } 0080 0081 func register(clause: UnsafeMutablePointer<Void>, index: Int) { 0082 channel.registerReceive(clause, index: index) 0083 } 0084 0085 func execute() { 0086 if let result = channel.getResultFromBuffer() { 0087 closure(result) 0088 } 0089 } 0090 } 0091 0092 final class FallibleReceivingChannelReceiveCase
Select.swift:277
            let selectCase = FallibleReceivingChannelReceiveCase(channel: channel, closure: closure)
<T
Select.swift:93
    let channel: FallibleReceivingChannel<T>
Select.swift:94
    var closure: ChannelResult<T> -> Void
Select.swift:96
    init(channel: FallibleReceivingChannel<T>, closure: ChannelResult<T> -> Void) {
Select.swift:96
    init(channel: FallibleReceivingChannel<T>, closure: ChannelResult<T> -> Void) {
>: SelectCase { 0093 let channel
Select.swift:97
        self.channel = channel
Select.swift:102
        channel.registerReceive(clause, index: index)
Select.swift:106
        if let result = channel.getResultFromBuffer() {
: FallibleReceivingChannel<T> 0094 var closure
Select.swift:98
        self.closure = closure
Select.swift:107
            closure(result)
: ChannelResult<T> -> Void 0095 0096 init
Select.swift:277
            let selectCase = FallibleReceivingChannelReceiveCase(channel: channel, closure: closure)
(channel: FallibleReceivingChannel<T>, closure: ChannelResult<T> -> Void) { 0097 self.channel = channel 0098 self.closure = closure 0099 } 0100 0101 func register(clause: UnsafeMutablePointer<Void>, index: Int) { 0102 channel.registerReceive(clause, index: index) 0103 } 0104 0105 func execute() { 0106 if let result = channel.getResultFromBuffer() { 0107 closure(result) 0108 } 0109 } 0110 } 0111 0112 final class ChannelSendCase
Select.swift:284
            let selectCase = ChannelSendCase(channel: channel, value: value, closure: closure)
<T
Select.swift:113
    let channel: Channel<T>
Select.swift:114
    var value: T
Select.swift:117
    init(channel: Channel<T>, value: T, closure: Void -> Void) {
Select.swift:117
    init(channel: Channel<T>, value: T, closure: Void -> Void) {
>: SelectCase { 0113 let channel
Select.swift:118
        self.channel = channel
Select.swift:124
        channel.send(value, clause: clause, index: index)
: Channel<T> 0114 var value
Select.swift:119
        self.value = value
Select.swift:124
        channel.send(value, clause: clause, index: index)
: T 0115 let closure
Select.swift:120
        self.closure = closure
Select.swift:128
        closure()
: Void -> Void 0116 0117 init
Select.swift:284
            let selectCase = ChannelSendCase(channel: channel, value: value, closure: closure)
(channel: Channel<T>, value: T, closure: Void -> Void) { 0118 self.channel = channel 0119 self.value = value 0120 self.closure = closure 0121 } 0122 0123 func register(clause: UnsafeMutablePointer<Void>, index: Int) { 0124 channel.send(value, clause: clause, index: index) 0125 } 0126 0127 func execute() { 0128 closure() 0129 } 0130 } 0131 0132 final class SendingChannelSendCase
Select.swift:291
            let selectCase = SendingChannelSendCase(channel: channel, value: value, closure: closure)
<T
Select.swift:133
    let channel: SendingChannel<T>
Select.swift:134
    var value: T
Select.swift:137
    init(channel: SendingChannel<T>, value: T, closure: Void -> Void) {
Select.swift:137
    init(channel: SendingChannel<T>, value: T, closure: Void -> Void) {
>: SelectCase { 0133 let channel
Select.swift:138
        self.channel = channel
Select.swift:144
        channel.send(value, clause: clause, index: index)
: SendingChannel<T> 0134 var value
Select.swift:139
        self.value = value
Select.swift:144
        channel.send(value, clause: clause, index: index)
: T 0135 let closure
Select.swift:140
        self.closure = closure
Select.swift:148
        closure()
: Void -> Void 0136 0137 init
Select.swift:291
            let selectCase = SendingChannelSendCase(channel: channel, value: value, closure: closure)
(channel: SendingChannel<T>, value: T, closure: Void -> Void) { 0138 self.channel = channel 0139 self.value = value 0140 self.closure = closure 0141 } 0142 0143 func register(clause: UnsafeMutablePointer<Void>, index: Int) { 0144 channel.send(value, clause: clause, index: index) 0145 } 0146 0147 func execute() { 0148 closure() 0149 } 0150 } 0151 0152 final class FallibleChannelSendCase
Select.swift:298
            let selectCase = FallibleChannelSendCase(channel: channel, value: value, closure: closure)
<T
Select.swift:153
    let channel: FallibleChannel<T>
Select.swift:154
    let value: T
Select.swift:157
    init(channel: FallibleChannel<T>, value: T, closure: Void -> Void) {
Select.swift:157
    init(channel: FallibleChannel<T>, value: T, closure: Void -> Void) {
>: SelectCase { 0153 let channel
Select.swift:158
        self.channel = channel
Select.swift:164
        channel.send(value, clause: clause, index: index)
: FallibleChannel<T> 0154 let value
Select.swift:159
        self.value = value
Select.swift:164
        channel.send(value, clause: clause, index: index)
: T 0155 let closure
Select.swift:160
        self.closure = closure
Select.swift:168
        closure()
: Void -> Void 0156 0157 init
Select.swift:298
            let selectCase = FallibleChannelSendCase(channel: channel, value: value, closure: closure)
(channel: FallibleChannel<T>, value: T, closure: Void -> Void) { 0158 self.channel = channel 0159 self.value = value 0160 self.closure = closure 0161 } 0162 0163 func register(clause: UnsafeMutablePointer<Void>, index: Int) { 0164 channel.send(value, clause: clause, index: index) 0165 } 0166 0167 func execute() { 0168 closure() 0169 } 0170 } 0171 0172 final class FallibleSendingChannelSendCase
Select.swift:305
            let selectCase = FallibleSendingChannelSendCase(channel: channel, value: value, closure: closure)
<T
Select.swift:173
    let channel: FallibleSendingChannel<T>
Select.swift:174
    let value: T
Select.swift:177
    init(channel: FallibleSendingChannel<T>, value: T, closure: Void -> Void) {
Select.swift:177
    init(channel: FallibleSendingChannel<T>, value: T, closure: Void -> Void) {
>: SelectCase { 0173 let channel
Select.swift:178
        self.channel = channel
Select.swift:184
        channel.send(value, clause: clause, index: index)
: FallibleSendingChannel<T> 0174 let value
Select.swift:179
        self.value = value
Select.swift:184
        channel.send(value, clause: clause, index: index)
: T 0175 let closure
Select.swift:180
        self.closure = closure
Select.swift:188
        closure()
: Void -> Void 0176 0177 init
Select.swift:305
            let selectCase = FallibleSendingChannelSendCase(channel: channel, value: value, closure: closure)
(channel: FallibleSendingChannel<T>, value: T, closure: Void -> Void) { 0178 self.channel = channel 0179 self.value = value 0180 self.closure = closure 0181 } 0182 0183 func register(clause: UnsafeMutablePointer<Void>, index: Int) { 0184 channel.send(value, clause: clause, index: index) 0185 } 0186 0187 func execute() { 0188 closure() 0189 } 0190 } 0191 0192 final class FallibleChannelSendErrorCase
Select.swift:312
            let selectCase = FallibleChannelSendErrorCase(channel: channel, error: error, closure: closure)
<T
Select.swift:193
    let channel: FallibleChannel<T>
Select.swift:197
    init(channel: FallibleChannel<T>, error: ErrorType, closure: Void -> Void) {
>: SelectCase { 0193 let channel
Select.swift:198
        self.channel = channel
Select.swift:204
        channel.send(error, clause: clause, index: index)
: FallibleChannel<T> 0194 let error
Select.swift:199
        self.error = error
Select.swift:204
        channel.send(error, clause: clause, index: index)
: ErrorType 0195 let closure
Select.swift:200
        self.closure = closure
Select.swift:208
        closure()
: Void -> Void 0196 0197 init
Select.swift:312
            let selectCase = FallibleChannelSendErrorCase(channel: channel, error: error, closure: closure)
(channel: FallibleChannel<T>, error: ErrorType, closure: Void -> Void) { 0198 self.channel = channel 0199 self.error = error 0200 self.closure = closure 0201 } 0202 0203 func register(clause: UnsafeMutablePointer<Void>, index: Int) { 0204 channel.send(error, clause: clause, index: index) 0205 } 0206 0207 func execute() { 0208 closure() 0209 } 0210 } 0211 0212 final class FallibleSendingChannelSendErrorCase
Select.swift:319
            let selectCase = FallibleSendingChannelSendErrorCase(channel: channel, error: error, closure: closure)
<T
Select.swift:213
    let channel: FallibleSendingChannel<T>
Select.swift:217
    init(channel: FallibleSendingChannel<T>, error: ErrorType, closure: Void -> Void) {
>: SelectCase { 0213 let channel
Select.swift:218
        self.channel = channel
Select.swift:224
        channel.send(error, clause: clause, index: index)
: FallibleSendingChannel<T> 0214 let error
Select.swift:219
        self.error = error
Select.swift:224
        channel.send(error, clause: clause, index: index)
: ErrorType 0215 let closure
Select.swift:220
        self.closure = closure
Select.swift:228
        closure()
: Void -> Void 0216 0217 init
Select.swift:319
            let selectCase = FallibleSendingChannelSendErrorCase(channel: channel, error: error, closure: closure)
(channel: FallibleSendingChannel<T>, error: ErrorType, closure: Void -> Void) { 0218 self.channel = channel 0219 self.error = error 0220 self.closure = closure 0221 } 0222 0223 func register(clause: UnsafeMutablePointer<Void>, index: Int) { 0224 channel.send(error, clause: clause, index: index) 0225 } 0226 0227 func execute() { 0228 closure() 0229 } 0230 } 0231 0232 final class TimeoutCase
Select.swift:330
        let selectCase = TimeoutCase<Bool>(channel: done, closure: closure)
<T
Select.swift:233
    let channel: Channel<T>
Select.swift:236
    init(channel: Channel<T>, closure: Void -> Void) {
>: SelectCase { 0233 let channel
Select.swift:237
        self.channel = channel
Select.swift:242
        channel.registerReceive(clause, index: index)
: Channel<T> 0234 let closure
Select.swift:238
        self.closure = closure
Select.swift:246
        closure()
: Void -> Void 0235 0236 init(channel: Channel<T>, closure: Void -> Void) { 0237 self.channel = channel 0238 self.closure = closure 0239 } 0240 0241 func register(clause: UnsafeMutablePointer<Void>, index: Int) { 0242 channel.registerReceive(clause, index: index) 0243 } 0244 0245 func execute() { 0246 closure() 0247 } 0248 } 0249 0250 public class SelectCaseBuilder
Select.swift:339
private func select(builder: SelectCaseBuilder) {
Select.swift:365
public func select(@noescape build: (when: SelectCaseBuilder) -> Void) {
Select.swift:366
    let builder = SelectCaseBuilder()
Select.swift:371
public func sel(@noescape build: (when: SelectCaseBuilder) -> Void) {
Select.swift:375
public func forSelect(@noescape build: (when: SelectCaseBuilder, done: Void -> Void) -> Void) {
Select.swift:376
    let builder = SelectCaseBuilder()
Select.swift:382
        let builder = SelectCaseBuilder()
Select.swift:388
public func forSel(@noescape build: (when: SelectCaseBuilder, done: Void -> Void) -> Void) {
{ 0251 var cases
Select.swift:257
            cases.append(selectCase)
Select.swift:264
            cases.append(selectCase)
Select.swift:271
            cases.append(selectCase)
Select.swift:278
            cases.append(selectCase)
Select.swift:285
            cases.append(selectCase)
Select.swift:292
            cases.append(selectCase)
Select.swift:299
            cases.append(selectCase)
Select.swift:306
            cases.append(selectCase)
Select.swift:313
            cases.append(selectCase)
Select.swift:320
            cases.append(selectCase)
Select.swift:331
        cases.append(selectCase)
Select.swift:344
    for (index, selectCase) in builder.cases.enumerate() {
Select.swift:359
        builder.cases[Int(index)].execute()
: [SelectCase] = [] 0252 var otherwise
Select.swift:335
        self.otherwise = closure
Select.swift:350
    if builder.otherwise != nil {
Select.swift:357
        builder.otherwise?()
: (Void -> Void)? 0253 0254 public func receiveFrom<T>(channel: Channel<T>?, closure: T -> Void) { 0255 if let channel = channel { 0256 let selectCase = ChannelReceiveCase(channel: channel, closure: closure) 0257 cases.append(selectCase) 0258 } 0259 } 0260 0261 public func receiveFrom<T>(channel: ReceivingChannel<T>?, closure: T -> Void) { 0262 if let channel = channel { 0263 let selectCase = ReceivingChannelReceiveCase(channel: channel, closure: closure) 0264 cases.append(selectCase) 0265 } 0266 } 0267 0268 public func receiveFrom<T>(channel: FallibleChannel<T>?, closure: ChannelResult<T> -> Void) { 0269 if let channel = channel { 0270 let selectCase = FallibleChannelReceiveCase(channel: channel, closure: closure) 0271 cases.append(selectCase) 0272 } 0273 } 0274 0275 public func receiveFrom<T>(channel: FallibleReceivingChannel<T>?, closure: ChannelResult<T> -> Void) { 0276 if let channel = channel { 0277 let selectCase = FallibleReceivingChannelReceiveCase(channel: channel, closure: closure) 0278 cases.append(selectCase) 0279 } 0280 } 0281 0282 public func send<T>(value: T, to channel: Channel<T>?, closure: Void -> Void) { 0283 if let channel = channel where !channel.closed { 0284 let selectCase = ChannelSendCase(channel: channel, value: value, closure: closure) 0285 cases.append(selectCase) 0286 } 0287 } 0288 0289 public func send<T>(value: T, to channel: SendingChannel<T>?, closure: Void -> Void) { 0290 if let channel = channel where !channel.closed { 0291 let selectCase = SendingChannelSendCase(channel: channel, value: value, closure: closure) 0292 cases.append(selectCase) 0293 } 0294 } 0295 0296 public func send<T>(value: T, to channel: FallibleChannel<T>?, closure: Void -> Void) { 0297 if let channel = channel where !channel.closed { 0298 let selectCase = FallibleChannelSendCase(channel: channel, value: value, closure: closure) 0299 cases.append(selectCase) 0300 } 0301 } 0302 0303 public func send<T>(value: T, to channel: FallibleSendingChannel<T>?, closure: Void -> Void) { 0304 if let channel = channel where !channel.closed { 0305 let selectCase = FallibleSendingChannelSendCase(channel: channel, value: value, closure: closure) 0306 cases.append(selectCase) 0307 } 0308 } 0309 0310 public func throwError<T>(error: ErrorType, into channel: FallibleChannel<T>?, closure: Void -> Void) { 0311 if let channel = channel where !channel.closed { 0312 let selectCase = FallibleChannelSendErrorCase(channel: channel, error: error, closure: closure) 0313 cases.append(selectCase) 0314 } 0315 } 0316 0317 public func throwError<T>(error: ErrorType, into channel: FallibleSendingChannel<T>?, closure: Void -> Void) { 0318 if let channel = channel where !channel.closed { 0319 let selectCase = FallibleSendingChannelSendErrorCase(channel: channel, error: error, closure: closure) 0320 cases.append(selectCase) 0321 } 0322 } 0323 0324 public func timeout(deadline: Deadline, closure: Void -> Void) { 0325 let done = Channel<Bool>() 0326 co { 0327 wakeUp(deadline) 0328 done <- true 0329 } 0330 let selectCase = TimeoutCase<Bool>(channel: done, closure: closure) 0331 cases.append(selectCase) 0332 } 0333 0334 public func otherwise(closure: Void -> Void) { 0335 self.otherwise = closure 0336 } 0337 } 0338 0339 private func select
Select.swift:368
    select(builder)
Select.swift:384
        select(builder)
(builder: SelectCaseBuilder) { 0340 mill_choose_init("select") 0341 0342 var clauses: [UnsafeMutablePointer<Void>] = [] 0343 0344 for (index, selectCase) in builder.cases.enumerate() { 0345 let clause = malloc(mill_clauselen()) 0346 clauses.append(clause) 0347 selectCase.register(clause, index: index) 0348 } 0349 0350 if builder.otherwise != nil { 0351 mill_choose_otherwise() 0352 } 0353 0354 let index = mill_choose_wait() 0355 0356 if index == -1 { 0357 builder.otherwise?() 0358 } else { 0359 builder.cases[Int(index)].execute() 0360 } 0361 0362 clauses.forEach(free) 0363 } 0364 0365 public func select
Select.swift:372
    select(build)
(@noescape build: (when: SelectCaseBuilder) -> Void) { 0366 let builder = SelectCaseBuilder() 0367 build(when: builder) 0368 select(builder) 0369 } 0370 0371 public func sel(@noescape build: (when: SelectCaseBuilder) -> Void) { 0372 select(build) 0373 } 0374 0375 public func forSelect
Select.swift:389
    forSelect(build)
(@noescape build: (when: SelectCaseBuilder, done: Void -> Void) -> Void) { 0376 let builder = SelectCaseBuilder() 0377 var keepRunning = true 0378 func done() { 0379 keepRunning = false 0380 } 0381 while keepRunning { 0382 let builder = SelectCaseBuilder() 0383 build(when: builder, done: done) 0384 select(builder) 0385 } 0386 } 0387 0388 public func forSel(@noescape build: (when: SelectCaseBuilder, done: Void -> Void) -> Void) { 0389 forSelect(build) 0390 } 0391