This extended article discusses the merits of Jake Wharton's Reagent framework for Kotlin which has deep theoretical advantages standing in for ReactiveX. I've stripped away any class definitions to make a lightweight functional version that I'll derive and justify from first principles here, with implementations for Hacklang, Javascript and Kotlin. Jake Wharton has put the project on hiatus, and while I agree that it's hard to fight the massive mindshare of ReactiveX, Reagent is at least a powerful lens to the semantics of streaming and the minimum that we require of our languages to make them reactive. At least I hope to convey that if one feels ReactiveX is wasteful on top of an async-await language, their feeling isn't wrong.
Writing
Hey look! I write, technically
XKCD 2585 Implemented: Round the world ⏹ ⏺
Using lambda term statistics to show how hard we try to declutter programs
There are a couple of [a]symmetries in programming that really grip me, lifting my hands off the keyboard and pushing me deep into a mind vortex for some time. I'm especially entranced by the flows of control, data and abstraction it seems. When arguments and returns are treated differently (in a symmetry s…
Condensed Asterius quickstart
Here's an Asterius quickstart that aims to be a little more make-it-work-oriented than the official docs…
deepseq
for Data
Here's a very short but useful snippet I recently started using to force Data
instances deeply…
Reified types in Hack
Hack is beginning to support reified types in their latest 4.17 release, which adds a very interesting dimension to Hack's type system. Its interactions with Hack's unique medley of type features can be quite subtle, and when any new type feature emerges, I always like to learn how and where it interacts with o…
Simplifying reactive operators
I've argued that I have reason to believe that ReactiveX (Rx) is backwards. At first I promoted InteractiveX (Ix), which inverts the control, swapping callbacks for await
. If you follow the road of trying to simplify Ix and its iterator acrobatics, I believe you'll arrive where I was, reimplementing Reagent. Originally built …
Tracing values with state
The development of ra.hs
has called for an interesting task in the domain of symbolic programming. ra.hs
is a Haskell linter for reactive programs, the first implementation I'm undertaking to identify possible race conditions in reactive code. The violation to look for is a subtle one: if two threads consume the sa…
Guide to InteractiveX in Kotlin
How to make a ReactiveX
- Project_writeup
- Reactive
- Software
I was tipped off to Reactive Frameworks from @Robert Harvey on a long-winded StackExchange question of mine for what "reactive databases" were called. I was infatuated with Hack's elegant async API and let me tell you it absolutely expanded my world in all the right ways.
Why ReactiveX operators are hard to make and InteractiveX operators aren't
Full-featured reactive stream libraries, like Rx, come with a very large set of operators to create, transform, combine and otherwise process the corresponding streams. Creating your own operators with support for back-pressure is notoriously difficult.
Coroutines and channels are designed to provide an opposite experience. There are no built-in operators, but processing streams of elements is extremely simple and back-pressure is supported automatically without you having to explicitly think about it.
from Kotlin's guide to reactive channels
Kotlin Coroutines: How SelectBuilder
magically pulls coroutines out of the select
block
I was puzzled for a while about the syntactic sugar around select
— Kotlin's experimental feature to process streams from multiple sources (docs). Take a look at this…
Logo sketches: Shard
My logo already uses forced perspective to create an illusion, so why not really force it a little harder? Shard
splits polygons at random vertices and carefully hurls them in front of a camera where they appear like the original. That is... until you put a spin on them…
Logo sketches: Trace
While designing some branding around my personal logo, I noticed the following in-spiral that felt like it was leading somewhere interesting: