Test-Driven Development Freedom
In My previous log I mentioned my bad intuition regarding code design. Let's task a real-world example. I have written my log on Caddy after working w… ...more
In My previous log I mentioned my bad intuition regarding code design. Let's task a real-world example. I have written my log on Caddy after working w… ...more
I was pair programming a while ago, when, at some point, when have realized that the initial task was way under-estimated. So we decided to tackle it … ...more
Since the beginning of this website, I have a backlog of my next logs (which is becoming smaller and smaller). That's one of the reason Polysemy updat… ...more
A while ago I was working with a product-owner which was really, really keen on integrating SaaS solutions in our product as a way to bring value to e… ...more
I have just reached the 3-years-mark using Haskell in production, after 3 years as freelance Haskell teacher. First and foremost, I'd like to emphasiz… ...more
At some point in my previous position we had to set up live updates (i.e. getting changes without reloading the page) in our SPA. Instead of relying o… ...more
In my previous company we used to work with ElasticSearch, after some times I became the maintainer of Bloodhound. While I planned to increase type-sa… ...more
A while ago I was looking for something in base, when I landed in Foreign.Storable. Which made me realized that Haskell has pure C/C++ macros, not onl… ...more
Few months ago, I joined the Haskell Security Response Team. I've been involved in hsec-tools, which aims, in the medium terms, to support the whole s… ...more
A while ago, I was working on some cache-based code, I had a primitive function: fetchCached :: Member (Cached key value) r => key -> Sem r (Boo… ...more
The last thing we have to provide is an OpenAPI description. Thanks to Haskell's type system and servant-openapi3, we can generate it, by first annota… ...more
The last part, in order to make our API is to be able to query it, that's why we have to introduce Views. Since our project is rather simple, we have … ...more
If you followed this series, you may have noticed that, neither in Interface Adapters nor in Drivers. For Interface Adapters, I don't test it because,… ...more
Last time we introduced Interface Adapters with servant to serve a HTTP (REST) API. But we've been left with some Sem r-based definition we have to tr… ...more
After the Use Cases there are the Interface Adapters, namely the HTTP (REST) API. We'll use servant to build a REST API. Let's start by setting the la… ...more
The Use Cases is a simple application-dependant wiring layer, however, I tend to have one or two tests to ensure that Interpreters are well coordinati… ...more
After introducing Commands as our Entites/Core Domain, we then have to introduce next layer: Use Cases. For reference, it is the place where applicati… ...more
Previous log saw the introduction of Commands. One of the reason I favor Clean Architecture specifically over Hexagonal Architecture is to have a pure… ...more
Previous log has let us with the following events: data AbaksEvent = Started {periodId :: PeriodId, name :: Text, from :: Day, to :: Day, initialBal… ...more
I tend to start with the events whenever I start an event source-based system. But first, let's recall the requirements: I should start a Period wit… ...more
A long time ago I "started" a side project called abaks, which is a project for personal bank reconciliation statements. I've been quite bus… ...more
I spend most of my day in a linux terminal (KDE's konsole), doing so, I interact directly with git. I usually starts working on a topic: $ git co -b f… ...more
With Polysemy 1.9.0.0 came the Scoped effect. It's defined as follows: data Scoped (param :: Type) (effect :: Effect) :: Effect where Run :: forall … ...more
With Polysemy 1.9.0.0 came the Opaque effect. It's defined as follows: newtype Opaque (e :: Effect) m a where Opaque :: forall e m a. e m a -> Op… ...more
Until now we only seen "low-level" effects (either classical Monad, or technical effects). On of my main motivation with effects systems is … ...more
When it comes to interpreters relying on other effects, you can either hide or expose them. For example, last year we introduced a Cache effect: data … ...more
At some point you may have strongly typed effects: data DocumentsEffects (d :: Type) (m :: Type -> Type) (a :: Type) where StoreDocument :: d -&g… ...more
As a last lecture, instead of writing regular Plutus code through Haskell, alternatives are presented. First, we have MeshJS, which aims to bootstrap … ...more
In the codebases I have worked on all have multiple global interpreters, most noticeably for production and tests. From time to time, you want to have… ...more
Today's lecture aims to be a wrap-up of previous lectures by implementing a stablecoin. It's supposed to be the indexed (i.e. synchronized) representa… ...more
In a previous log I mentioned that I some point I totally "give up" some of my architecture choices. Let me start by stating that I'm comfor… ...more
We came over Cardano's staking mechanism over and over. At some point, a reward transaction is emitted and, like Script and Minting, there are Validat… ...more