     }
 }
 
-struct Etch<ImpulseType: Impulse> { // "Observer"
+public struct Etch<ImpulseType: Impulse> { // "Observer"
     /// A unique identifier for this Etch. For supporting equatable.
     private let id = NSUUID()
     


import Foundation

class Circuit<ImpulseType: Impulse> {  // Signal
    private var etches = [Etch<ImpulseType>]()
    
    private let impulseQueue: dispatch_queue_t = dispatch_queue_create("circuit_impulse_queue", DISPATCH_QUEUE_SERIAL)
    private let defaultDispatchQueue: dispatch_queue_t = dispatch_queue_create("circuit_default_dispatch_queue", DISPATCH_QUEUE_CONCURRENT)
    
    /// Add an etch to this circuit from any thread.
    internal func addEtch(etch: Etch<ImpulseType>) {
        dispatch_async(impulseQueue) { _ in
            self.etches.append(etch)
        }
    }
    
    /// Send an impulse from any thread.
    internal func sendImpulse(impulse: ImpulseType) {
        dispatch_async(impulseQueue) { _ in
            self.recursiveSendImpulseToEtches(impulse, etches: self.etches)
        }

    /// The code to run in response to a matching Impulse.
    private(set) internal var dispatch: (AnyObject -> [ImpulseType]?) = { _ in nil }
    
    public init() { }
    
    public func withAlive(block: (() -> Bool)) -> Etch {
        var etch = self
        etch.alive = block
        return etch
