Skip to content

Latest commit

 

History

History
61 lines (46 loc) · 1.66 KB

README.md

File metadata and controls

61 lines (46 loc) · 1.66 KB

MatchSpec

tests

: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"]}]

Installation

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.