Packages
ex_esdb
0.0.1-alfa
0.11.0
0.10.0
0.9.0
0.8.0
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.1
0.5.0
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.5
0.2.4
0.2.3
0.2.2
0.2.1
0.2.0
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14-alpha
0.0.13-alpha
0.0.12-alpha
0.0.11-alpha
0.0.10-alpha
0.0.9-alpha
0.0.8-alpha
0.0.6-alpha
0.0.5-alpha
0.0.4-alpha
0.0.3-alpha
0.0.2-alfa
0.0.1-alfa
ExESDB is a reincarnation of rabbitmq/khepri, specialized for use as a BEAM-native event store.
Current section
Files
Jump to
Current section
Files
lib/flags.ex
defmodule Flags do
@moduledoc false
import Bitwise
# def set(target, flag), do: bor(target, flag)
def set(target, flag), do: target ||| flag
# def unset(target, flag), do: bxor(target, flag)
def unset(target, flag), do: target &&& bnot(flag)
def set_all(target, flags) do
Enum.reduce(flags, target, fn flag, acc ->
acc ||| flag
end)
end
def unset_all(target, flags) do
Enum.reduce(flags, target, fn flag, acc ->
acc &&& bnot(flag)
end)
end
def has?(target, flag), do: (target &&& flag) == flag
def has_not?(target, flag), do: (target &&& flag) != flag
def to_list(0, flag_map), do: [flag_map[0]]
def to_list(n, flag_map) when n > 0 do
# Extract keys (powers of 2) from the map and sort them
keys = Map.keys(flag_map) |> Enum.sort()
# Iterate through the keys and collect the flags that are set in `n`
flags =
Enum.reduce(keys, [], fn key, acc ->
if Bitwise.band(n, key) != 0 do
[flag_map[key] | acc]
else
acc
end
end)
# Since we collected the flags in reverse order, reverse the list before returning
Enum.reverse(flags)
end
def highest(n, flag_map) do
[head | _] =
to_list(n, flag_map)
|> Enum.reverse()
head
end
def has_all?(status, flags) do
flags |> Enum.all?(fn flag -> has?(status, flag) end)
end
def has_any?(status, flags) do
flags |> Enum.any?(fn flag -> has?(status, flag) end)
end
def lowest(n, flag_map) do
[head | _] =
to_list(n, flag_map)
head
end
def to_string(n, flag_map) do
to_list(n, flag_map)
|> Enum.join(", ")
end
def decompose(target) when target > 0 do
decompose(target, 1, [])
end
defp decompose(0, _, acc), do: Enum.reverse(acc)
defp decompose(target, power, acc) do
if Bitwise.band(target, power) != 0 do
decompose(target - power, power <<< 1, [power | acc])
else
decompose(target, power <<< 1, acc)
end
end
end