 
 @NSApplicationMain
 class AppDelegate: NSObject, NSApplicationDelegate {
-    
-    
     func keystrokeSignal() -> RACSignal {
         return RACSignal.createSignal({ (subscriber) -> RACDisposable! in
             NSLog("Keyboard listener created!")
             
-            // TODO: how do I tear this listener down when the listener is no longer needed? Does ARC do it for me?
+            // TODO: tear down this listener in the RACDisposable
             NSEvent.addGlobalMonitorForEventsMatchingMask(NSEventMask.KeyDownMask, handler: { (event) -> Void in
                 subscriber.sendNext(event);
             })


import CoreAudio

func osStatusToString(status: OSStatus) -> String {
    // this sucks. lol objc API
    

//        return nil;
//    }
//    
    
    // TODO: namespace all of these shits into a "static" class?
    

    
//    
//    struct HysteresisTimeout {
//        let type: HysteresisTimeoutEventType
//        let
//    }
    
    /**
      * Be informed of when a RACSignal has gone quiet after a while.
      *
      * You'll receive values of HysteresisTimeoutEvents.
    */
    func hysteresisTimeout<T>(incoming: RACSignal, seconds: NSTimeInterval) -> RACSignal/*<HysteresisTimeoutEvent<T>>*/ {
        // https://github.com/ReactiveCocoa/ReactiveCocoa/blob/ee85a34731382b01ea028026ef267b0952b7edde/ReactiveCocoa/RACSignal%2BOperations.m
        
        return RACSignal.createSignal { (subscriber:  RACSubscriber!) -> RACDisposable! in
            
            // create a scheduler to handle our delays (TODO; RAC's own code seems to look for a an existing scheduler "context". should do same for consistency, even if it seems gross)
            var scheduler = RACScheduler();
            
            var scheduledTimeoutDisposable = scheduler.afterDelay(seconds, schedule: { () -> Void in
               
                subscriber.sendNext(EnumContainer<HysteresisTimeoutEvent<T>>(v: HysteresisTimeoutEvent<T>.Timeout))
            })
            
            scheduledTimeoutDisposable.dispose();
            
            scheduler.afterDelay(7, schedule: { () -> Void in
                
            })
            
            return nil; // not bothering with disposable for now
        }
        
    }

    func everyOtherEvent() -> RACStreamBindBlock {
        var fdsafasdf = HysteresisTimeoutEvent.Arrival("lollerbutts")
        
        var poop = RACStream();
        var clazz = self.superclass!;
        
