GHC stage restriction forces us to split definitions into two files