#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