less than 1 minute read

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