vishal-h

vishal-h

Let’s say we’ve a stream S1 that generates a random number between 1..100.
There is also another stream S2 that also generates a random number between 1..100.

Is it possible to compose S1 and S2 into another Stream S3 such that S3 emits if s1 + s2 is even? Functionality that I am looking for is similar to the one that is in RxJS.

I know the example is made up, but would like to know if streams in Elixir are composable.

Thanks!

Showing Posts 1 to 3

NobbZ

NobbZ

There are 2 means of composing streams, you can zip them or concatenate them.

Only of those makes sense in your case.

You can filter the resulting stream into another Stream.

Please take a look at

Marcus

Marcus

iex(63)> s1 = Stream.repeatedly(fn -> :rand.uniform(100) end)
#Function<54.33009823/2 in Stream.repeatedly/1>
iex(64)> s2 = Stream.repeatedly(fn -> :rand.uniform(100) end)
#Function<54.33009823/2 in Stream.repeatedly/1>
iex(65)> s3 = s1 |> Stream.zip(s2)
#Function<69.33009823/2 in Stream.zip/1>
iex(66)> s4 = Stream.map(s3, fn {a, b} -> a + b end)
#Stream<[
  enum: #Function<69.33009823/2 in Stream.zip/1>,
  funs: [#Function<49.33009823/1 in Stream.map/2>]
]>
iex(67)> s5 = Stream.filter(s4, fn x -> rem(x, 2) == 0 end)
#Stream<[
  enum: #Function<69.33009823/2 in Stream.zip/1>,
  funs: [#Function<49.33009823/1 in Stream.map/2>,
   #Function<41.33009823/1 in Stream.filter/2>]
]>
iex(68)> Enum.take(s2, 5)
[31, 48, 21, 15, 7]
iex(69)> Enum.take(s3, 5)
[{97, 90}, {22, 37}, {11, 100}, {12, 44}, {24, 83}]
iex(71)> Enum.take(s4, 5)
[109, 62, 79, 105, 178]
iex(72)> Enum.take(s5, 5)
[144, 68, 34, 104, 50]
vishal-h

vishal-h OP

Aha! Both excellent answers. Thank you

— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
kszambelanczyk
Hello! Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app. I creat...
New
RemyXRenard
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
samoloth
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
FlyingNoodle
If a change or preparation module uses Ash.Changeset.get_argument/2 or Ash.Query.get_argument/2 (or any of the other get_argument functio...
New
ryanwinchester
apply_graft/2 doesn’t rewrite an add_many sub-workflow’s deps on an add step. Grafted jobs cancel with “upstream job was deleted” Version...
New

Other Trending Topics Top

mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge &amp; Solve. They are GUI (Emerge) and State management (S...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews