diff --git a/.formatter.exs b/.formatter.exs new file mode 100644 index 0000000..d2cda26 --- /dev/null +++ b/.formatter.exs @@ -0,0 +1,4 @@ +# Used by "mix format" +[ + inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"] +] diff --git a/config/config.exs b/config/config.exs index 718408d..670bb5f 100644 --- a/config/config.exs +++ b/config/config.exs @@ -2,4 +2,4 @@ use Mix.Config config :snowflake, nodes: ["127.0.0.1"], - epoch: 1473562509301 + epoch: 1_473_562_509_301 diff --git a/lib/snowflake.ex b/lib/snowflake.ex index a8ba8b5..eec1e83 100644 --- a/lib/snowflake.ex +++ b/lib/snowflake.ex @@ -18,8 +18,9 @@ defmodule Snowflake do Generates a snowflake ID, each call is guaranteed to return a different ID that is sequantially larger than the previous ID. """ - @spec next_id() :: {:ok, integer} | - {:error, :backwards_clock} + @spec next_id() :: + {:ok, integer} + | {:error, :backwards_clock} def next_id() do GenServer.call(Snowflake.Generator, :next_id) end diff --git a/lib/snowflake/generator.ex b/lib/snowflake/generator.ex index 1c82f3e..be40f01 100644 --- a/lib/snowflake/generator.ex +++ b/lib/snowflake/generator.ex @@ -19,8 +19,10 @@ defmodule Snowflake.Generator do {:error, :seq_overflow} -> :timer.sleep(1) handle_call(:next_id, from, state) + {:error, :backwards_clock} -> {:reply, {:error, :backwards_clock}, state} + {:ok, new_ts, new_seq} -> new_state = {epoch, new_ts, machine_id, new_seq} {:reply, {:ok, create_id(new_ts, machine_id, new_seq)}, new_state} @@ -42,6 +44,7 @@ defmodule Snowflake.Generator do @seq_overflow -> {:error, :seq_overflow} next_seq -> {:ok, prev_ts, next_seq} end + new_ts -> cond do new_ts < prev_ts -> {:error, :backwards_clock} @@ -51,10 +54,11 @@ defmodule Snowflake.Generator do end defp create_id(ts, machine_id, seq) do - << new_id :: unsigned-integer-size(64)>> = << - ts :: unsigned-integer-size(42), - machine_id :: unsigned-integer-size(10), - seq :: unsigned-integer-size(12) >> + <> = << + ts::unsigned-integer-size(42), + machine_id::unsigned-integer-size(10), + seq::unsigned-integer-size(12) + >> new_id end diff --git a/lib/snowflake/helper.ex b/lib/snowflake/helper.ex index fd241d5..861dea4 100644 --- a/lib/snowflake/helper.ex +++ b/lib/snowflake/helper.ex @@ -40,7 +40,7 @@ defmodule Snowflake.Helper do defp machine_id(_id), do: machine_id(nil) defp ip_addrs() do - case :inet.getifaddrs do + case :inet.getifaddrs() do {:ok, ifaddrs} -> ifaddrs |> Enum.flat_map(fn {_, kwlist} -> @@ -49,11 +49,15 @@ defmodule Snowflake.Helper do |> Enum.filter(&(tuple_size(elem(&1, 1)) in [4, 6])) |> Enum.map(fn {_, addr} -> case addr do - {a, b, c, d} -> [a, b, c, d] |> Enum.join(".") # ipv4 - {a, b, c, d, e, f} -> [a, b, c, d, e, f] |> Enum.join(":") # ipv6 + # ipv4 + {a, b, c, d} -> [a, b, c, d] |> Enum.join(".") + # ipv6 + {a, b, c, d, e, f} -> [a, b, c, d, e, f] |> Enum.join(":") end end) - _ -> [] + + _ -> + [] end end @@ -63,7 +67,7 @@ defmodule Snowflake.Helper do end defp fqdn() do - case :inet.get_rc[:domain] do + case :inet.get_rc()[:domain] do nil -> nil domain -> hostname() <> "." <> to_string(domain) end diff --git a/lib/snowflake/util.ex b/lib/snowflake/util.ex index b9ede10..ae09c87 100644 --- a/lib/snowflake/util.ex +++ b/lib/snowflake/util.ex @@ -16,11 +16,12 @@ defmodule Snowflake.Util do @spec first_snowflake_for_timestamp(integer) :: integer def first_snowflake_for_timestamp(timestamp) do ts = timestamp - Snowflake.Helper.epoch() - - << new_id :: unsigned-integer-size(64)>> = << - ts :: unsigned-integer-size(42), - 0 :: unsigned-integer-size(10), - 0 :: unsigned-integer-size(12) >> + + <> = << + ts::unsigned-integer-size(42), + 0::unsigned-integer-size(10), + 0::unsigned-integer-size(12) + >> new_id end @@ -61,7 +62,8 @@ defmodule Snowflake.Util do defp bucket_size(unit_type, units) do case unit_type do :hours -> 1000 * 60 * 60 * units - _ -> 1000 * 60 * 60 * 24 * units # days is default + # days is default + _ -> 1000 * 60 * 60 * 24 * units end end end diff --git a/mix.exs b/mix.exs index 5434bcb..bebe710 100644 --- a/mix.exs +++ b/mix.exs @@ -11,8 +11,8 @@ defmodule Snowflake.Mixfile do app: :snowflake, version: @version, source_url: @url, - build_embedded: Mix.env == :prod, - start_permanent: Mix.env == :prod, + build_embedded: Mix.env() == :prod, + start_permanent: Mix.env() == :prod, maintainers: @maintainers, description: "Elixir Snowflake ID Generator", elixir: "~> 1.3", @@ -24,8 +24,7 @@ defmodule Snowflake.Mixfile do end def application do - [applications: [], - mod: {Snowflake, []}] + [applications: [], mod: {Snowflake, []}] end defp deps do