• Jump To … +
    server.coffee src/actionknob.coffee src/autosem.coffee src/bitbucket_kba.coffee src/browserlog.coffee src/datareduction.coffee src/dci.coffee src/dciknob.coffee src/deeseeeye.coffee src/dnd.coffee src/doof.coffee src/formurla-mngr.coffee src/fractalpanel.coffee src/fractalpanel_test.coffee src/front.coffee src/ingestor.coffee src/kbabitbucket.coffee src/knobctrl.coffee src/lib_test.coffee src/nanoclock.coffee src/noodb.coffee src/noodbabstract.coffee src/noodbbrowser.coffee src/noodbbrowser_test.coffee src/noodbsec.coffee src/noorauth.coffee src/noorplugin.coffee src/noorquery.coffee src/noorvm.coffee src/noorwrite.coffee src/quadparser.coffee src/quadparsern3.coffee src/rbac.coffee src/reactor.coffee src/rebase.coffee src/rsrcidx.coffee src/sandboxactions.coffee src/screen_ctx.coffee src/spogi.coffee src/tabular_widget.coffee src/visctrl.coffee src/voicesknob.coffee src/whowhen.coffee src/xsd2native.coffee
  • nanoclock.coffee

  • ¶
    one_million = 1000 * 1000
    one_billion = 1000 * one_million
    
    date_to_now = (date) ->
      now = {}
      now_msec = date.getTime()
      now.sec = Math.floor(now_msec/1000)
      now.nsec = (now_msec % 1000) * one_million
      return now
    
    class Clock
      longAgo: -> new Date(1) # one second after the epoch
        
      now: (date_or_now) ->
  • ¶

    Accept either: a ‘now’ object like {sec: 123412343, nsec: 192837465} a Date() or nothing Returns a ‘now’ object at least one nanosecond later

        date_or_now = date_or_now ? new Date()
        
        if date_or_now.sec?
          now = date_or_now
        else
          now = date_to_now(date_or_now)
        if @last?
          if @last.sec is now.sec
            if @last.nsec is now.nsec
              now.nsec++
              if now.nsec >= one_billion # carry!
                now.nsec = 0
                ++now.nsec
            else
              now.nsec = @last.nsec + 1
        @last = now
        return {sec:@last.sec, nsec:@last.nsec}
    
      asDate: () ->
        return new Date(@asMsec())
      asMsec: () ->
        now = @now()
        return (now.sec * 1000) + ((now.nsec / one_million) | 0)
      
    class ControlledClock extends Clock
      constructor: (date) ->
        if not date?
          throw new Error "ControlledClock(initial_date) requires an initial Date()"
        @last = date_to_now(date)
      now: (date_or_now) ->
        super(@last)
    
    (exports ? this).ControlledClock = ControlledClock
    (exports ? this).Clock = Clock
    (exports ? this).date_to_now = date_to_now
    (exports ? this).one_million = one_million