I'm aware that this does not make sense for every type of stream. A very
large part of streams depends on either the last item (like this example or
for example a Fibonacci implementation) or something like a pointer (for
example File.stream). In those cases a solution like that should work
without problems.
The example I posted was supposed to be very simple and could easily be
re-arranged to work with the current stream implementation. It was supposed
to illustrate that you can handle the rest of a stream separately. There's
a lot of cases where this is not as simple.
Am Donnerstag, 11. Juni 2020 15:15:53 UTC+1 schrieb José Valim:
>
> The reason why such operations doesn't exist on stream is because streams
> may encapsulate resources. For example, Repo.stream is a lazy database
> query. Having operations such as Stream.head(...) | Stream.tail(...) means
> you would have to execute the query twice, one to get the head, and another
> for the tail, which can be very wasteful in those cases.
>
> You probably could be tackled without head and tail, by first applying all
> transforms to streams and then running it:
>
> ~e[*/10]
> |> Crontab.Scheduler.get_next_run_dates()
> |> Stream.each(fn date ->
> date
> |> DateTime.from_naive!("Etc/UTC")
> |> DateTime.diff(DateTime.utc_now(), :millisecond)
> |> min(0)
> |> Process.sleep()
> callback.(date)
> end)
> |> Stream.run()
>
> The stream programming model requires you to think about working with the
> collection as a whole, instead of item by item.
>
> On Thu, Jun 11, 2020 at 4:10 PM Jonatan Männchen <[email protected]
> <javascript:>> wrote:
>
>> I would like to propose two new functions for the `Stream` module:
>>
>> *Head Function*
>>
>> @spec head(Enumerable.t) :: Stream.element
>>
>> This function is the equivalent of the following code:
>>
>> [element] = stream
>> |> Stream.take(1)
>> |> Enum.to_list
>>
>> *Tail Function*
>>
>> @spec tail(Enumerable.t) :: Enumerable.t # %Stream{...}
>>
>> This function returns a new stream without the head element.
>>
>> *Syntax Sugar*
>>
>> It would further be awesome if the following would work:
>>
>> [element1, elementN... | rest] = stream # I'm aware that this would not
>> work as a function head / case etc.
>> %Stream{} = rest
>>
>> *Real Wold Example*
>>
>> This capability would for example enable the following (using
>> https://hexdocs.pm/crontab):
>>
>> def setup do
>> ~e[*/10] # Every 10 Minutes
>> |> Crontab.Scheduler.get_next_run_dates() # Creating a Stream with
>> dates matching schedule
>> |> run(fn date ->
>> # Do something useful
>> end)
>> end
>>
>>
>> def run(schedules, callback) do
>> [next_date | rest] = schedules # With Syntax Sugar
>>
>> next_date = Stream.head(schedules) # Without Syntax Sugar
>> rest = Stream.tail(schedules) # Without Syntax Sugar
>>
>> next_date
>> |> DateTime.from_naive!("Etc/UTC")
>> |> DateTime.diff(DateTime.utc_now(), :millisecond)
>> |> min(0)
>> |> Process.sleep()
>>
>> callback.(next_date)
>>
>> run(schedules, callback)
>> end
>>
>> *Problems*
>>
>> There's some problems with this exact approach since pattern matching
>> doesn't work with streams. Therefore all of the above will need some work.
>> It should however illustrate the intention of this proposal.
>>
>> --
>> 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] <javascript:>.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/elixir-lang-core/31cc6e90-2235-4f31-aa76-9fc045b8aa88o%40googlegroups.com
>>
>> <https://groups.google.com/d/msgid/elixir-lang-core/31cc6e90-2235-4f31-aa76-9fc045b8aa88o%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>
--
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/5a416f4c-cec8-4848-8292-79a1b83529aeo%40googlegroups.com.