#TIL #elixirlang ets에서 key 리스트만 가져오기
iex> :ets.new(:test, [:named_table]) :test iex> :ets.insert(:test, {:key1, :value1}) true iex> :ets.insert(:test, {:key2, :value2}) true iex> :ets.insert(:test, {:key3, :value3}) true iex> :ets.first(:test) :key1 iex> :ets.next(:test, :key1) :key2 iex> :ets.next(:test, :key2) :key3 iex> :ets.next(:test, :key3) :"$end_of_table"
:ets.first/1 함수와 :ets.next/2 함수를 사용하면 key만 가져올 수 있다.
iex> keys = fn table_name -> Stream.resource( fn -> :ets.first(table_name) end, fn :"$end_of_table" -> {:halt, nil} previous_key -> {[previous_key], :ets.next(table_name, previous_key)} end, fn _ -> :ok end) end #Function<6.128620087/1 in :erl_eval.expr/5> iex> keys.(:test) |> Enum.to_list() [:key1, :key2, :key3]
시작, 종료 조건, 다음을 구하는 함수까지 다 준비되어 있다. Stream.resource/3 함수로 스트림(stream)을 만들기. 딱 좋다.
참고 - How to retrieve a list of ets keys without scanning entire table? - stackoverflow.com