![Page 2: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/2.jpg)
Reactive Continuations Ranges Streams Epilogue
About me
KDE developmentTalks and teachingFunctional programming enthusiast, but not a purist
2
![Page 3: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/3.jpg)
Reactive Continuations Ranges Streams Epilogue
Disclaimer
Make your code readable. Pretend the next personwho looks at your code is a psychopath and they knowwhere you live.
Philip Wadler
3
![Page 4: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/4.jpg)
Reactive Continuations Ranges Streams Epilogue
Disclaimer
The code snippets are optimized for presentation, it is notproduction-ready code.std namespace is omitted, value arguments used instead of const-refs orforwarding refs, etc.
4
![Page 5: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/5.jpg)
REACTIVE
![Page 6: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/6.jpg)
Reactive Continuations Ranges Streams Epilogue
What is reactive?
We believe that a coherent approach to systemsarchitecture is needed, and we believe that allnecessary aspects are already recognised individually:we want systems that are Responsive, Resilient, Elasticand Message Driven. We call these Reactive Systems.Systems built as Reactive Systems are more flexible,loosely-coupled and scalable. This makes them easierto develop and amenable to change. They aresignificantly more tolerant of failure and when failuredoes occur they meet it with elegance rather thandisaster. Reactive Systems are highly responsive, givingusers effective interactive feedback.
Reactive Manifesto 2.0
6
![Page 7: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/7.jpg)
.
![Page 8: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/8.jpg)
Reactive Continuations Ranges Streams Epilogue
What is reactive?
Showing a response to a stimulus
Oxford Dictionary
8
![Page 9: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/9.jpg)
Reactive Continuations Ranges Streams Epilogue
What is reactive?
C: event call-backsJava: event listenersC++/Qt: signals and slots
even IO streams?
9
![Page 10: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/10.jpg)
Reactive Continuations Ranges Streams Epilogue
What is reactive?
No shared stateSeparate isolated componentsCommunication only through message passing
10
![Page 11: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/11.jpg)
Reactive Continuations Ranges Streams Epilogue
Reactive programming
connect(mouse, SIGNAL(mouseMoved(int, int)),widget, SLOT(resize(int, int)));
11
![Page 12: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/12.jpg)
Reactive Continuations Ranges Streams Epilogue
Reactive programming
connect(mouse, SIGNAL(mouseMoved(int, int)),widget, SLOT(setWidth(int)));
12
![Page 13: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/13.jpg)
Reactive Continuations Ranges Streams Epilogue
Reactive programming
Rectangle {width: mouse.xheight: mouse.y
}
MouseArea {id: mouse. . .
}
13
![Page 14: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/14.jpg)
Reactive Continuations Ranges Streams Epilogue
Functional reactive programming
Rectangle {width: Math.sin(mouse.x - mouse.width / 2)height: Math.cos(mouse.y - mouse.height / 2)
}
MouseArea {id: mouse. . .
}
Connections {. . .
}
14
![Page 15: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/15.jpg)
Reactive Continuations Ranges Streams Epilogue
Functional reactive programming
Timer {id: delayedStatusUpdateinterval: 1000running: trueonTriggered: {
if (!hasBlahBlah) {item.status = Core.PassiveStatusreturn
}
item.status = enabled? Core.PassiveStatus: Core.ActiveStatus
}}
15
![Page 16: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/16.jpg)
Reactive Continuations Ranges Streams Epilogue
Stream processing
16
![Page 17: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/17.jpg)
CONTINUATIONS
![Page 18: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/18.jpg)
Reactive Continuations Ranges Streams Epilogue
Concurrency
Interactive systemsThreadsMultiple processesDistributed systems
Note: "concurrency" will mean that different tasks are executed atoverlapping times.
18
![Page 19: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/19.jpg)
Reactive Continuations Ranges Streams Epilogue
Plain threads are bad
A large fraction of the flaws in software developmentare due to programmers not fully understanding all thepossible states their code may execute in. In amultithreaded environment, the lack of understandingand the resulting problems are greatly amplified,almost to the point of panic if you are paying attention.
John CarmackIn-depth: Functional programming in C++
19
![Page 20: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/20.jpg)
Reactive Continuations Ranges Streams Epilogue
Plain threads are bad
Threads are not composableParallelism can’t be ‘disabled’Difficult to ensure balanced load manually
Hartmut KaiserPlain Threads are the GOTO of Today’s Computing
Meeting C++ 2014
20
![Page 21: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/21.jpg)
Reactive Continuations Ranges Streams Epilogue
Plain synchronization primitives are bad
You will likely get it wrongS.L.O.W. (starvation, latency, overhead, wait)
Sean ParentBetter Code: Concurrency
C++ Russia, 2015
21
![Page 22: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/22.jpg)
Reactive Continuations Ranges Streams Epilogue
Amdahl’s Law
1(1−P )+ PN
22
![Page 23: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/23.jpg)
Reactive Continuations Ranges Streams Epilogue
Locks are the main problem
The biggest of all the big problems with recursive mutexes is thatthey encourage you to completely lose track of your locking schemeand scope. This is deadly. Evil. It’s the "thread eater". You hold locksfor the absolutely shortest possible time. Period. Always. If you’recalling something with a lock held simply because you don’t know it’sheld, or because you don’t know whether the callee needs the mutex,then you’re holding it too long. You’re aiming a shotgun at yourapplication and pulling the trigger. You presumably started usingthreads to get concurrency; but you’ve just PREVENTED concurrency.
I’ve often joked that instead of picking up Djikstra’s cuteacronym we should have called the basic synchronizationobject "the bottleneck". Bottlenecks are useful at times,sometimes indispensible – but they’re never GOOD.
David ButenhofRe: recursive mutexes
23
![Page 24: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/24.jpg)
Reactive Continuations Ranges Streams Epilogue
Futures
Futures should be the lowest level concurrency abstractions.
std::futureboost::futureQFutureFolly Future
any continuation - *.then([] . . .)
24
![Page 25: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/25.jpg)
Reactive Continuations Ranges Streams Epilogue
Future
T value = function();
future<T> value = function(); . . .; value.get();)
25
![Page 26: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/26.jpg)
Reactive Continuations Ranges Streams Epilogue
Future
future<T> value = function(); . . .; value.get();
future<T2> value = function().then(continuation);
26
![Page 27: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/27.jpg)
Reactive Continuations Ranges Streams Epilogue
Futures
page("http://qtworldsummit.com/").get().then(
[] (auto &&result) {cout << result.headers();
})
27
![Page 28: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/28.jpg)
Reactive Continuations Ranges Streams Epilogue
Futures
page("http://qtworldsummit.com/").get().then(
[] (auto &&result) {cout << result.headers();
for (image: result.image_tags) {image.get().then(
[] (auto &&image_result) {// do something// with image_result
});
}}
)28
![Page 29: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/29.jpg)
Reactive Continuations Ranges Streams Epilogue
Imperative chaining of futures
result = get("http://qtworldsummit.com/"),for_(image = result.image_tags) (
image_result = image.get(),// do something with image_result. . .
)
29
![Page 30: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/30.jpg)
Reactive Continuations Ranges Streams Epilogue
Imperative chaining of futureswhile_(
// Wait until we get a connection.client = ws::server::accept(server),
// Start a detached execution path to process the client.detach_([] {
. . .
serial_(// WebSocket handshakeheader = ws::client::get_header(),server_key = ws::server::create_key(header),ws::client::send_header(client, server_key),
// Sending the initial greeting messagews::client::message_write(client, "Hello, I’m Echo"),
// Connection establishedwhile_(
// getting and echoing the messagemessage = ws::client::message_read(client),ws::client::message_write(client, message)
))
}))
Check out "Monads in chains" from Meeting C++ 201430
![Page 31: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/31.jpg)
RANGES
![Page 32: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/32.jpg)
Reactive Continuations Ranges Streams Epilogue
Ranges in C++
vector<int> xs;int sum = 0;
for (x: xs) {sum += x;
}
return sum;
32
![Page 33: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/33.jpg)
Reactive Continuations Ranges Streams Epilogue
Ranges in C++
return accumulate(xs.cbegin(), xs.cend(),0);
33
![Page 34: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/34.jpg)
Reactive Continuations Ranges Streams Epilogue
Ranges in C++
return accumulate(xs.cbegin(), xs.cend(),1,_1 * _2);
34
![Page 35: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/35.jpg)
Reactive Continuations Ranges Streams Epilogue
Ranges in C++
How to do an aggregation on a transformed list?
vector<int> xs;int sum = 0;
for (x: xs) {sum += x * x;
}
return sum;
35
![Page 36: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/36.jpg)
Reactive Continuations Ranges Streams Epilogue
Ranges in C++
How to do an aggregation on a transformed list?
sum $ map (λ x → x * x) xs
36
![Page 37: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/37.jpg)
Reactive Continuations Ranges Streams Epilogue
Ranges in C++
How to do an aggregation on a transformed list?
vector<int> temp;
std::transform(xs.cbegin(), xs.cend(),std::back_inserter(temp),_1 * _1);
return std::accumulate(temp.cbegin(),temp.cend());
37
![Page 38: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/38.jpg)
Reactive Continuations Ranges Streams Epilogue
Ranges in C++, boost.range, N4128
How to do an aggregation on a transformed list?
return accumulate(xs | transformed(_1 * _1));
38
![Page 39: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/39.jpg)
Reactive Continuations Ranges Streams Epilogue
Example
transactions| filter(Transactions::price() > 1000)| groupBy(Transactions::customerId())| sort(
Transactions::price().desc() |Transactions::customerName()
);
39
![Page 40: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/40.jpg)
Reactive Continuations Ranges Streams Epilogue
Example boilerplate
namespace Transactions {struct Record {
int customerId;. . .
};
DECL_COLUMN(customerId). . .
}
Column meta-type has all operators implemented, asc(),desc(), etc.
40
![Page 41: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/41.jpg)
STREAMS
![Page 42: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/42.jpg)
Reactive Continuations Ranges Streams Epilogue
Anything you think that you could ever be
for (item: items) {// do something
}
for_each(items, [] (item i) {// do something
});
42
![Page 43: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/43.jpg)
Reactive Continuations Ranges Streams Epilogue
Just passing our time
43
![Page 44: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/44.jpg)
Reactive Continuations Ranges Streams Epilogue
Oh we’ll keep on trying
44
![Page 45: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/45.jpg)
Reactive Continuations Ranges Streams Epilogue
Flow of information
45
![Page 46: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/46.jpg)
Reactive Continuations Ranges Streams Epilogue
Through the eons, and on and on
Web server client connection requestsUser interface eventsDatabase accessI/OAnything and everything
46
![Page 47: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/47.jpg)
Reactive Continuations Ranges Streams Epilogue
Till the end of time
Message passing:continuation!newClientMessageCall-callback:onNewMessage(continuation)Signals-slots:connect(socket, &Socket::newConnection,
receiver, &Receiver::continuation)Any data collection:for_each(xs, continuation)
47
![Page 48: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/48.jpg)
Reactive Continuations Ranges Streams Epilogue
Stream transformation
Streams can only be transformed with algorithms that acceptinput ranges, since we don’t have all the items. We don’t evenknow when (if) they will end.
map, bind, filter, take, drop, etc.
48
![Page 49: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/49.jpg)
Reactive Continuations Ranges Streams Epilogue
Stream transformation
49
![Page 50: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/50.jpg)
Reactive Continuations Ranges Streams Epilogue
Map / Transform
We have a stream of 2D coordinates (mouse coordinates).
// Projecting on the x-axismouse_position >>=
map(λ point → (point.x, 0))
// Projecting on the y-axismouse_position >>=
map(λ point → (0, point.y))
50
![Page 51: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/51.jpg)
Reactive Continuations Ranges Streams Epilogue
Implementation detail
namespace stream {template <typename Stream, typename Cont>auto operator >>= (Stream &&stream,
Cont &&cont){
return stream.then(cont);}
template <typename Under>auto make_stream(Under &&under);
}
51
![Page 52: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/52.jpg)
Reactive Continuations Ranges Streams Epilogue
Map
template <typename Func, typename Cont>struct map_cont {
map_cont(Func f, Cont c) : f(f), c(c) { }
template <typename InType>void operator () (const InType &in) {
c(f(in));}
Func f;Cont c;
};
52
![Page 53: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/53.jpg)
Reactive Continuations Ranges Streams Epilogue
Fork (or parallel), tee
tee(print) >>=fork(
receiver1,receiver2
)
53
![Page 54: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/54.jpg)
Reactive Continuations Ranges Streams Epilogue
Fork (or parallel), tee
template <typename ... Conts>struct fork_impl;
template <typename Cont, typename ... Conts>struct fork_impl<Cont, Conts...>: fork_impl<Conts...>{
using parent_type = fork_impl<Conts...>;
fork_impl(Cont c, Conts... cs): parent_type(cs...), c(c)
{ }
template <typename InType>void operator() (const InType &in) {
c(in);parent_type::operator()(in);
}
Cont c;};
54
![Page 55: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/55.jpg)
Reactive Continuations Ranges Streams Epilogue
Stateful function objects
class gravity_object {public:
gravity_object() { }
template <typename Cont>void then(Cont &&c) { _f = std::forward<Cont>(c); }
QPointF operator() (const QPointF &new_point) {m_point.setX(m_point.x() * .99 + new_point.x() * .01);m_point.setY(m_point.y() * .99 + new_point.y() * .01);return m_point;
}
private:std::function<void(QPointF)> _f;QPointF m_point;
};
55
![Page 56: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/56.jpg)
Reactive Continuations Ranges Streams Epilogue
Stateful function objects
56
![Page 57: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/57.jpg)
Reactive Continuations Ranges Streams Epilogue
Filter
bool pointFilter(const QPointF &point) {return int(point.y()) % 100 == 0;
}
events >>=filter(predicate) >>=
. . .
57
![Page 58: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/58.jpg)
Reactive Continuations Ranges Streams Epilogue
Flat map
template <typename Func, typename Cont>struct flatmap_cont {
flatmap_cont(Func f, Cont c): f(f), c(c)
{}
template <typename InType>void operator () (const InType &in) {
boost::for_each(f(in), c);}
Func f;Cont c;
};58
![Page 59: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/59.jpg)
Reactive Continuations Ranges Streams Epilogue
Flat mapclass more_precision {public:
more_precision() { }
template <typename Cont>void then(Cont &&c) { _f = std::forward<Cont>(c); }
std::vector<QPointF> operator() (const QPointF &new_point) {std::vector<QPointF> result;
int stepX = (m_previous_point.x() < new_point.x()) ? 1 : -1;for (int i = (int)m_previous_point.x(); i != (int)new_point.x(); i += stepX) {
result.emplace_back(i, m_previous_point.y());}
int stepY = (m_previous_point.y() < new_point.y()) ? 1 : -1;for (int i = (int)m_previous_point.y(); i != (int)new_point.y(); i += stepY) {
result.emplace_back(new_point.x(), i);}
m_previous_point = new_point;return result;
}
private:std::function<void(QPointF)> _f;QPointF m_previous_point;
};
59
![Page 60: Reactive programming and Qt - Ivan Čukić · Reactive Continuations Ranges StreamsEpilogue Disclaimer Thecodesnippetsareoptimizedforpresentation,itisnot production-readycode. std](https://reader033.vdocuments.net/reader033/viewer/2022042305/5ed15499efd7b2537304c63d/html5/thumbnails/60.jpg)
Reactive Continuations Ranges Streams Epilogue
Answers? Questions! Questions? Answers!
Kudos:
Friends at KDE, Dr Sasa Malkov
Worth reading and watching:
Iterators Must Go, Andrei AlexandrescuValue Semantics and Range Algorithms, Chandler CarruthSystematic Error Handling in C++, Andrei AlexandrescuRanges proposal, Eric NieblerReactive manifesto, Books on Erlang or Scala/Akka
60