:ets
matchspec helper library for elixir. Exposes the fun2ms/1
macro which
transforms elixir-style function code into ets matchspecs.
iex> require MatchSpec
iex> MatchSpec.fun2ms(fn {key, value} when key === :foo -> value end)
[{{:"$1", :"$2"}, [{:"=:=", :"$1", {:const, :foo}}], [:"$2"]}]
Also exposes the ms2fun/2
function which converts a matchspec to function code
or ast which represents a function that performs the same task as the ets matchspec
iex> MatchSpec.ms2fun([{{:"$1", :"$2"}, [{:"=:=", :"$1", {:const, :foo}}], [:"$2"]}], :code)
"fn {v1, v2} when v1 === :foo -> v2 end"
iex> :ets.test_ms({:foo, :bar}, MatchSpec.fun2ms(fn {key, value} when key === :foo -> value end))
{:ok, :bar}
Provides fun2msfun/4
macro which can be used to parametrize the matchspec:
iex> require MatchSpec
iex> lambda = MatchSpec.fun2msfun(fn {^key, value} -> value end, [key])
iex> lambda.(:key)
[{{:"$1", :"$2"}, [{:"=:=", :"$1", {:const, :key}}], [:"$2"]}]
Provides defmatchspec/2
and defmatchspecp/2
macros which can be used to
directly generate functions in your module
defmodule MyModule do
use MatchSpec
defmatchspec my_matchspec(key) do
{^key, value} -> value
end
end
MyModule.my_matchspec(:key)
[{{:"$1", :"$2"}, [{:"=:=", :"$1", {:const, :key}}], [:"$2"]}]
The package can be installed by adding match_spec
to your list of dependencies in mix.exs
:
def deps do
[
{:match_spec, "~> 0.3.1"}
]
end
Documentation can be found at https://hexdocs.pm/match_spec.