Packages
riptide
0.3.4
0.5.2
0.5.1
0.5.0-beta9
0.5.0-beta8
0.5.0-beta7
0.5.0-beta6
0.5.0-beta5
0.5.0-beta4
0.5.0-beta3
0.5.0-beta2
0.5.0-beta11
0.5.0-beta10
0.5.0-beta
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.13
0.3.12
0.3.11
0.3.10
0.3.9
0.3.8
0.3.7
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.3.0-bd63a38
0.2.79
0.2.78
0.2.74
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.15
0.1.14
0.1.13
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
A data first framework for building realtime applications
Current section
Files
Jump to
Current section
Files
lib/riptide/uuid.ex
defmodule Riptide.UUID do
@moduledoc false
@forwards ~W(0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z)
@forwards_inverse @forwards |> Enum.with_index() |> Enum.into(%{})
@backwards @forwards |> Enum.reverse()
@backwards_inverse @backwards |> Enum.with_index() |> Enum.into(%{})
@base Enum.count(@forwards)
@length 8
@total @length + 12
def descending(), do: descending_from(:os.system_time(:millisecond))
def descending_from(time), do: generate(time, @backwards, @backwards)
def descending_from(time, :uniform), do: generate(time, @backwards, ["0"])
def ascending(), do: ascending_from(:os.system_time(:millisecond))
def ascending_from(time), do: generate(time, @forwards, @forwards)
def ascending_from(time, :uniform), do: generate(time, @forwards, ["0"])
def generate(time, range, random) do
time
|> generate(range, random, @total, [])
|> Enum.join()
end
# Random Part
def generate(time, range, random, count, collect) when count > @length do
collect = [Enum.random(random) | collect]
generate(time, range, random, count - 1, collect)
end
# Time Part
def generate(time, range, random, count, collect) when count > 0 do
n = time |> rem(@base)
collect = [Enum.at(range, n) | collect]
generate(div(time, @base), range, random, count - 1, collect)
end
def generate(_time, _range, _random, _count, collect), do: collect
def ascending_decode_time(key) do
decode_time(@forwards_inverse, key)
end
def descending_decode_time(key) do
decode_time(@backwards_inverse, key)
end
def decode_time(range, key) do
decode_time(range, key, 0, 0)
end
def decode_time(_, _, value, count) when count === @length do
value
end
def decode_time(range, <<head::utf8, tail::binary>>, collect, count) do
value = Map.get(range, <<head>>)
decode_time(range, tail, collect * @base + value, count + 1)
end
end