{ nixpkgs ? import <nixpkgs> {}, compiler ? "default", doBenchmark ? false }:

let

  inherit (nixpkgs) pkgs;

  affection = with haskellPackages; callPackage(
    { mkDerivation, base, bytestring, clock, containers, glib, linear
    , monad-loops, monad-parallel, mtl, OpenGL, sdl2, stdenv, stm, text
    , uuid, vector
    }:
    mkDerivation {
      pname = "affection";
      version = "0.0.0.10";
      src = ../affection;
      isLibrary = true;
      isExecutable = true;
      libraryHaskellDepends = [
        base bytestring clock containers glib linear monad-loops
        monad-parallel mtl OpenGL sdl2 stm text uuid vector
      ];
      homepage = "https://github.com/nek0/affection#readme";
      description = "A simple Game Engine using SDL";
      license = stdenv.lib.licenses.lgpl3;
      doHaddock = false;
    }) {};

  #GLUtil = with haskellPackages; callPackage(
  #  { mkDerivation, array, base, bytestring, containers, directory
  #  , filepath, hpp, JuicyPixels, linear, OpenGL, OpenGLRaw, stdenv
  #  , transformers, vector
  #  }:
  #  mkDerivation {
  #    pname = "GLUtil";
  #    version = "0.10.3";
  #    sha256 = "1933540d309209fb90f0632336ee6c54e160a12da8508dadaf16882a2358ec27";
  #    libraryHaskellDepends = [
  #      array base bytestring containers directory filepath hpp JuicyPixels
  #      linear OpenGL OpenGLRaw transformers vector
  #    ];
  #    libraryToolDepends = [ hpp ];
  #    description = "Miscellaneous OpenGL utilities";
  #    license = stdenv.lib.licenses.bsd3;
  #  }) {};

  f = { mkDerivation, base, bytestring, containers
      , JuicyPixels, JuicyPixels-extra, linear, OpenGL, OpenGLRaw
      , random, sdl2, stdenv, stm
      }:
      mkDerivation {
        pname = "canvas";
        version = "0.0.0.0";
        src = ./.;
        isLibrary = false;
        isExecutable = true;
        executableHaskellDepends = [
          affection base bytestring containers JuicyPixels
          JuicyPixels-extra linear OpenGL OpenGLRaw random sdl2 stm
        ];
        description = "A test implementation for drawing images with SDL2 and OpenGL";
        license = stdenv.lib.licenses.bsd3;
      };

  haskellPackages = if compiler == "default"
                       then pkgs.haskellPackages
                       else pkgs.haskell.packages.${compiler};

  variant = if doBenchmark then pkgs.haskell.lib.doBenchmark else pkgs.lib.id;

  drv = variant (haskellPackages.callPackage f {});

in

  if pkgs.lib.inNixShell then drv.env else drv
