Enumerable.slice

You're seeing just the function slice, go back to Enumerable module for more information.

Specs

slice(t()) ::
  {:ok, size :: non_neg_integer(), slicing_fun()} | {:error, module()}

Returns a function that slices the data structure contiguously.

It should return {:ok, size, slicing_fun} if the enumerable has a known bound and can access a position in the enumerable without traversing all previous elements.

Otherwise it should return {:error, __MODULE__} and a default algorithm built on top of reduce/3 that runs in linear time will be used.

Differences to count/1

The size value returned by this function is used for boundary checks, therefore it is extremely important that this function only returns :ok if retrieving the size of the enumerable is cheap, fast and takes constant time. Otherwise the simplest of operations, such as Enum.at(enumerable, 0), will become too expensive.

On the other hand, the count/1 function in this protocol should be implemented whenever you can count the number of elements in the collection without traversing it.