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 3 to 1

vishal-h

vishal-h OP

Aha! Both excellent answers. Thank you

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]
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

— 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
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
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

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
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
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
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
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

Latest on Elixir Forum

Elixir Forum

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews