defmodule Merkel do @moduledoc """ Essentially a driver module but allows for the decoupled addition of e.g. new tree types and/or other proof types. """ alias Merkel.BinaryHashTree, as: Tree alias Merkel.Audit # Merkle tree CRUD @spec new(none | list(tuple)) :: Tree.t() def new(), do: Tree.create() def new(list) when is_list(list), do: Tree.create(list) @spec lookup(Tree.t(), Tree.key()) :: tuple def lookup(%Tree{} = t, key) when is_binary(key), do: Tree.lookup(t, key) @spec keys(Tree.t()) :: list def keys(%Tree{} = t), do: Tree.keys(t) @spec insert(Tree.t(), Tree.pair()) :: Tree.t() def insert(%Tree{} = t, {k, v}) when is_binary(k), do: Tree.insert(t, {k, v}) @spec delete(Tree.t(), Tree.key()) :: Tree.t() def delete(%Tree{} = t, key) when is_binary(key), do: Tree.delete(t, key) # Proof and verification @spec audit(Tree.t(), Tree.key()) :: Audit.t() def audit(%Tree{} = t, key) when is_binary(key), do: Audit.create(t, key) @spec verify(Audit.t(), String.t()) :: boolean def verify(%Audit{} = proof, root_hash) do Audit.verify(proof, root_hash) end # Helpers @spec tree_hash(Tree.t()) :: String.t() def tree_hash(%Tree{} = t), do: Tree.tree_hash(t) @spec size(Tree.t()) :: non_neg_integer def size(%Tree{} = t), do: Tree.size(t) end