Oops, hit <Tab+Enter> before this was fully composed.

On Friday, July 21, 2017 at 11:53:53 PM UTC-7, [email protected] wrote:
>
> Hey all! 
>
> In anticipation of v2.0, I'd like to propose a *big honking API change*, 
> namely, a protocol that has been discussed 
> <https://groups.google.com/forum/#!searchin/elixir-lang-core/indexable%7Csort:relevance/elixir-lang-core/F1vV3mSG-xw/wD79gywVAwAJ>
>  
> here for years 
> <https://groups.google.com/forum/#!searchin/elixir-lang-core/index%7Csort:relevance/elixir-lang-core/lEMa3VK6eVE/D3yj8w_SbFAJ>
>  
> but never implemented: Sequential.
>
> Context
>
> We have several modules dealing with 'collections', each capturing a 
> unique property of being a collection:
>
> Types:
>
> - Tuple <https://hexdocs.pm/elixir/Tuple.html#content>: a collection of 
> values stored contiguously in memory
> - List <https://hexdocs.pm/elixir/List.html#content>: a collection of 
> values stored in a linked list
> - Binary: a collection of bytes
> - String <https://hexdocs.pm/elixir/String.html#content>: a collection of 
> UTF-8-encoded unicode characters stored in a binary
> - Range <https://hexdocs.pm/elixir/Range.html#content>: a collection of 
> integer values explicitly denoted by a discrete start and end integers
>
> Utilities:
>
> - Enum <https://hexdocs.pm/elixir/Enum.html#content>: stratagems for 
> exhaustively traversing a collection
> - Stream <https://hexdocs.pm/elixir/Stream.html#content>: stratagems for 
> lazily traversing a collection
>
> Protocols:
>
> - Enumerable <https://hexdocs.pm/elixir/Enumerable.html#content>: logic 
> for traversing a collection
> - Collectable <https://hexdocs.pm/elixir/Collectable.html#content>: logic 
> for mapping a collection of one type to another
>
> So what would the Sequential protocol bring to the table? Well, it would 
> specify the contract for *countable* collections, be they infinite or 
> not. Much like Enum compliments Enumerable, we would implement a Sequence 
> module to interact with those collections that can be accessed via an 
> index, stealing several functions from existing modules.
>
> Protocol
>
> The Sequential protocol would act like the Enumerable protocol, with two 
> callbacks:
>
> - seek(Sequence.t, index): Scans through the sequence until it reaches 
> the non_neg_integer value at the index position, and returns it.
> - terminable?(Sequence.t): Returns whether or not the provided sequence 
> can be exhaustively iterated.
>
> Any collection function that hinges on *indexabliity* would be unified 
> and moved into the Sequence module. Any collection function that hinges 
> on *exhaustive countability* would be, too, so we could check if the 
> Sequential was terminable?, raising a Sequence.InterminableError if it 
> wasn't, and removing the caveat from the Enum module:
>
> Since the majority of the functions in Enum 
>> <https://hexdocs.pm/elixir/Enum.html#content> enumerate the whole 
>> enumerable and return a list as result, infinite streams need to be 
>> carefully used with such functions, as they can potentially run forever.
>
>
> Module
>
> The Sequence module would utilize Sequential.seek/2 and Sequential
> .terminable?/1 and take on functions from the Enum, Stream, Tuple, List, 
> and String modules, by encapsulating utilities for constructing and 
> manipulating countable collections:
>
> Manipulation:
>
> - Sequence.at(Sequence.t, index): uses seek to find the value at the 
> index, raises if the index is negative and the sequence isn't terminable.
>
> - Sequence.first(Sequence.t): seeks the first value of the sequence.
> - Sequence.last(Sequence.t): seeks last value of the sequence, raises if 
> the sequence isn't terminable.
> - Sequence.random(Sequence.t): seeks a random value of the sequence, 
> raises if the sequence isn't terminable.
> - Sequence.to_list(Sequence.t): converts the sequence to a list, raises 
> if the sequence isn't terminable.
> - Sequence.replace_at(Sequence.t, index, value): replaces the value at 
> the index with the new value.
>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/f3c982fd-b42a-4521-a119-efa8ac886d2a%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to