Code Golf in Elixir

Elixir has some great short forms of functions:

This is the identity function:

& &1

You can use this to turn a list into a map of counts:

~w[a b c]a |> Map.new(&{&1, 0})

The if statement is an expression and will return nil for the else clause

a = if foo == "hello", do: "yes", else: nil end

There is also an unless that is the reverse of if

Building a Domain Model in Elixir part 4

The domain model is still developing well. https://github.com/chriseyre2000/pandemic.

The technique of using one line composable functions works well. It also makes the code really readable.

I was surprised how easy it was to enable the “quiet night” card. This can be used at any time and will prevent the next infect city phase from doing anything. It was simple to add a new property to the model, set and unset it. I had expected to have had to build this into the UI (which does not exist yet).

Building a Domain Model in Elixir Part 2

I have now got a bit further with my domain model of the Pandemic game. There are very few complex examples of functional domain models. The problem is that problems that benefit from this approach are normally too complex to make a good example.

Pandemic is a complex cooperative board game. Players race to find cures for 4 diseases. There are lots of ways to lose. It’s a Euro game so it has built in termination options. You lose if:

– You can’t draw from the player deck

– On the 8th outbreak

– If you run out of any one of the 4 disease counters and are unable to place one.

The team wins if all 4 diseases have a cure.

https://github.com/chriseyre2000/pandemic

This now has a model of the cities with the links between them. The this was test driven with some useful checks. I used exhaustive property tests to check the link validity. This includes checks that all links are reversable, that no city links to itself and that there are no orphan cities. These caught a number of cut and paste errors.

The next part is a model of the board state. This includes the initial draw of cards, the infection of new cities and the cascade of an outbreak.

This follows an Elixir pattern of using functions in modules using struts. Every non-query function takes and returns the struct defined in the module. This makes composition much easier.

Installing Lumen

Lumen is an alternative BEAM Implementation.
Warning that this is still at a very early stage. It promises the ability to build WebAssembly

I am not currently interested in using Rust to build it from sources, but there are now images published here

https://github.com/lumen/lumen/releases

I used the following to install the tarball (I use a mac):

sudo tar xf lumen-0.1.0-nightly-x86_64-apple-darwin.tar.gz -C /opt

This deploys the bundle to: /opt/lumen

The compiler is now available at: /opt/lumen/bin/lumen

Here are more details on lumen: https://getlumen.org/

On having a Useless Superpower

I am going to admit to having a minor superpower. I can hear high pitch sounds that most people can’t.

This is not at all useful as it results in me getting a headache in lots of shops or museums (and in one especially annoying instance a job interview). It’s typically a 50hz signal.