 			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 {

		}
	}

	public func recv() -> V {
		var sender: WaitForRecv<V>?
		var receiver: WaitForSend<V>?

	public func send(value: C.ValueType) {
		ch.send(value)
	}

	public func canSend(value: C.ValueType) -> Bool {
		return ch.canSend(value)
	}
}

public struct RecvOnlyChan<C: RecvChannel>: RecvChannel {
