use typeclass to enforce immutability
use explicit lock

private constructor

define map