anchor.diff:  -type spawn_start_option() :: term().
   -export_type([spawn_start_option/0]).
   
  --type tick_start_option() :: {TickId :: term(), TickDuration :: pos_integer()}.
  +-type tick_start_option() ::
  +    ({TickId :: term(), TickDuration :: pos_integer()} |
  +     {TickId :: term(), TickDuration :: pos_integer(), TickSettings :: [tick_setting()]}).
   -export_type([tick_start_option/0]).
  +
  +-type tick_setting() :: skip_missed | dont_skip_missed.
  +-export_type([tick_setting/0]).
   
   -ifdef(pre18).
   -type timestamp() :: non_neg_integer().
  
positive.code:            {error, {already_started, pid()}} |
             {error, Reason :: term()}.
  start(Name, Mod, Args, Options) ->
      {TickOptions, GenServerOptions} = split_start_options(Options),
      gen_server:start(Name, ?MODULE, {Mod, Args, TickOptions}, GenServerOptions).
  
  -spec start_link(Mod :: module(), Args :: term(), Options :: [start_option()])
          -> {ok, pid()} |
             {error, {already_started, pid()}} |
             {error, Reason :: term()}.
  start_link(Mod, Args, Options) ->
      {TickOptions, GenServerOptions} = split_start_options(Options),
      gen_server:start_link(?MODULE, {Mod, Args, TickOptions}, GenServerOptions).
  
  -spec start_link(Name :: {local, atom()} | {global, atom()} | {via, atom(), term()},
                   Mod :: module(), Args :: term(), Options :: [start_option()])
  
negative.code:   when DeadlineNS =< NowNS ->
      #tick{id = Id,
            duration_ns = DurationNS,
            generation = Generation,
            skip_missed = SkipMissed} = Tick,
      GenerationsSkip = case SkipMissed of
                          false -> 0;
                          true  -> trunc((NowNS - DeadlineNS) / DurationNS)
                        end,
      {noreply, NewState} = Mod:handle_tick(Id, Generation + GenerationsSkip, State),
      NewTick = Tick#tick{deadline_ns = DeadlineNS + ((1 + GenerationsSkip) * DurationNS),
                          generation = Generation + GenerationsSkip + 1},
      handle_tick_deadlines(NewState, UntriggeredTicks, NowNS, Mod, [NewTick | TriggeredTicks]);
  handle_tick_deadlines(State, UntriggeredTicks, _NowNS, _Mod, TriggeredTicks) ->
      {State, TriggeredTicks ++ UntriggeredTicks}.
  