Using Nix to deploy a Haskell web app to Heroku
— 16 February, 2020

Deploying Ruby on Rails apps to Heroku has always been a delight, and now that they have a container registry other run-times are similarly delightfully deployable. No build-packs required.

with (import <nixpkgs> {});
dockerTools.buildImage {
  name = "hello";
  contents = [ hello ];

Home sweet home
— 12 February, 2020

~ » nix-shell -p figlet
brad@brad [nix:shell]
~ » figlet -f smscript nifty

      o |\_|_
/|/|  | |/ |  |  |
 | |_/|/|_/|_/ \/|/
        |)      (|

If you're like me, you develop on both macOS and Linux and are very much a creature of habit, then this may be of interest. It's a description of how I arrived at my current approach for maintaining a base development environment across the two platforms.

Getting close to the conceptual metal
— 27 January, 2020

Writing software can give us the ability to take a nearly impossibly abstract idea and use it to create a runnable program.

In this post we're to talk about "fundamental things" and see how much we can build with them.

type a × b =
  forall c.
    (a -> b -> c) -> c

type a + b =
  forall c.
    (a -> c) -> (b -> c) -> c

Deploying a fully automated Nix-based static website
— 21 November, 2019

{ config, pkgs, ... }:
  repo = builtins.fetchTarball {
    url = https://repo.tar.gz;
  imports = ["${repo}/module.nix"];

  services."site".enable = true;

I can't promise that this will take you five minutes (it won't). What I will say is this: if you'd like to learn more about Nix and NixOs then this may be interesting.

Servant's type-level domain specific language
— 05 October, 2019

Haskell has some very interesting type-level features, Servant is a great case-study in how they can be used to build a practical and feature rich library. This post walks through an example in an attempt to become more familiar with its inner workings.

type UsersIndex =
  Get '[JSON] [User]

type UsersShow =
  Capture "username" String
    :> Get '[JSON] User

type UsersAPI =
    :> (UsersIndex :<|> UsersShow)

Let's learn about lenses
— 21 August, 2018

type Lens s t a b =
  forall f. Functor f =>
    (a -> f b) -> s -> f t

_1 :: Lens (a, c) (b, c) a b
_1 = _

_2 :: Lens (c, a) (c, b) a b
_2 = _

Gaining an understanding of the Lens type has been on my todo list for a long time. So I finally bit the bullet and read up a little. These are (more or less) my notes as I went along.

You already know what Monads are
— 06 January, 2017

I sought to understand what the fuss was all about and I've now added to the mass of Monad Explainer posts on the internet.

readAFile().then(function (content) {
  return writeAFile(content)
}).then(function (report) {