anchor.diff:      {noreply, NewState :: term()} |
       {stop, Reason :: term(), NewState :: term()}.
   
  --callback handle_tick(TickId :: term(), TickGeneration :: non_neg_integer(), State :: term()) ->
  +-callback handle_tick(TickId :: term(), TickGeneration :: non_neg_integer(),
  +                      State :: term()) ->
       {noreply, NewState :: term()}.
   
   -callback terminate(Reason :: (normal | shutdown | {shutdown, term()} |
  
positive.code: 
  -spec min_timeout_value_ms() -> non_neg_integer() | none.
  min_timeout_value_ms() ->
      Now = now_timestamp_us(),
      case get(?PROCDIC_TICKS) of
          [] -> none;
          Ticks ->
              [#tick{ deadline_us=MinDeadlineUS } | _]
                  = lists:keysort(#tick.deadline_us, Ticks),
              round(max(0, MinDeadlineUS - Now) / 1000)
      end.
  
  -ifdef(pre18).
  -spec now_timestamp_us() -> non_neg_integer().
  now_timestamp_us() ->
      {MegaSecs, Secs, MicroSecs} = os:timestamp(),
      (((MegaSecs * 1000000) + Secs) * 1000000) + MicroSecs.
  -else.
  -spec now_timestamp_us() -> integer().
  now_timestamp_us() ->
      erlang:monotonic_time(micro_seconds).
  -endif.
  
  -spec split_start_options([start_option()]) -> {[{ticks, tick_start_option()}],
  
negative.code: 
  -record(tick, {
            id :: term(),
            duration_ns :: pos_integer(),
            deadline_ns :: timestamp(),
            generation :: non_neg_integer()
  }).
  -type tick() :: #tick{}.
  