 		}
 	}
 
+	public func canSend(value: V) -> Bool {
+		var receiver: WaitForSend<V>?
+
+		dispatch_sync(q) {
+			if self.waitingForSendQ.count > 0 {
+				receiver = self.waitingForSendQ.removeAtIndex(0)
+			}
+		}
+
+		if let r = receiver {
+			r.send(value)
+			return true
+		}
+
+		return false
+	}
+
 	public func recv() -> V {
 		var sender: WaitForRecv<V>?
 		var receiver: WaitForSend<V>?

public protocol SendChannel {
	typealias ValueType
	func send(value: ValueType)
}

public protocol RecvChannel {
	typealias ValueType
	func recv() -> ValueType
}

public struct ASyncRecv<V> {

			return receiver!.waitForSender()
		}
	}

	public func canRecv() -> (V?, Bool) {
		var sender: WaitForRecv<V>?

		dispatch_sync(q) {
			if self.waitingForRecvQ.count > 0 {
				sender = self.waitingForRecvQ.removeAtIndex(0)
			}
		}

		if let s = sender {
			return (s.recv(), true)
		}

		return (nil, false)
	}
}

public struct SendOnlyChan<C: SendChannel>: SendChannel {
