{ pkgs, config, idris-no-deps, overrides ? (self: super: {}) }: let
  inherit (pkgs.lib) callPackageWith fix' extends;

  /* Taken from haskell-modules/default.nix, should probably abstract this away */
  callPackageWithScope = scope: drv: args: (callPackageWith scope drv args) // {
    overrideScope = f: callPackageWithScope (mkScope (fix' (extends f scope.__unfix__))) drv args;
  };

  mkScope = scope : pkgs // pkgs.xorg // pkgs.gnome2 // scope;

  idrisPackages = self: let
    defaultScope = mkScope self;

    callPackage = callPackageWithScope defaultScope;

    builtins_ = pkgs.lib.mapAttrs self.build-builtin-package {
      prelude = [];

      base = [ self.prelude ];

      contrib = [ self.prelude self.base ];

      effects = [ self.prelude self.base ];

      pruviloj = [ self.prelude self.base ];
    };

  in
    {
    inherit idris-no-deps callPackage;

    # Idris wrapper with specified compiler and library paths, used to build packages

    idris = pkgs.callPackage ./idris-wrapper.nix {
      inherit idris-no-deps;
    };

    # Utilities for building packages

    with-packages = callPackage ./with-packages.nix {} ;

    build-builtin-package = callPackage ./build-builtin-package.nix {};

    build-idris-package = callPackage ./build-idris-package.nix {};

    # The set of libraries that comes with idris

    builtins = pkgs.lib.mapAttrsToList (name: value: value) builtins_;

    # Libraries

    array = callPackage ./array.nix {};

    bi = callPackage ./bi.nix {};

    bifunctors = callPackage ./bifunctors.nix {};

    bytes = callPackage ./bytes.nix {};

    canvas = callPackage ./canvas.nix {};

    categories = callPackage ./categories.nix {};

    coda = callPackage ./coda.nix {};

    config = callPackage ./config.nix {};

    comonad = callPackage ./comonad.nix {};

    composition = callPackage ./composition.nix {};

    console = callPackage ./console.nix {};

    containers = callPackage ./containers.nix {};

    cube = callPackage ./cube.nix {};

    derive = callPackage ./derive.nix {};

    descncrunch = callPackage ./descncrunch.nix {};

    dict = callPackage ./dict.nix {};

    dom = callPackage ./dom.nix {};

    electron = callPackage ./electron.nix {};

    eternal = callPackage ./eternal.nix {};

    farrp = callPackage ./farrp.nix {};

    free = callPackage ./free.nix {};

    fsm = callPackage ./fsm.nix {};

    glfw = callPackage ./glfw.nix {};

    graphviz = callPackage ./graphviz.nix {};

    hamt = callPackage ./hamt.nix {};

    html = callPackage ./html.nix {};

    hezarfen = callPackage ./hezarfen.nix {};

    hrtime = callPackage ./hrtime.nix {};

    http = callPackage ./http.nix {};

    http4idris = callPackage ./http4idris.nix {};

    iaia = callPackage ./iaia.nix {};

    idrishighlighter = callPackage ./idrishighlighter.nix {};

    idrisscript = callPackage ./idrisscript.nix {};

    ipkgparser = callPackage ./ipkgparser.nix {};

    jheiling-extras = callPackage ./jheiling-extras.nix {};

    jheiling-js = callPackage ./jheiling-js.nix {};

    js = callPackage ./js.nix {};

    lens = callPackage ./lens.nix {};

    lightyear = callPackage ./lightyear.nix {};

    logic = callPackage ./logic.nix {};

    mapping = callPackage ./mapping.nix {};

    mhd = callPackage ./mhd.nix {};

    pacman = callPackage ./pacman.nix {};

    patricia = callPackage ./patricia.nix {};

    permutations = callPackage ./permutations.nix {};

    pfds = callPackage ./pfds.nix {};

    pipes = callPackage ./pipes.nix {};

    posix = callPackage ./posix.nix {};

    quantities = callPackage ./quantities.nix {};

    rationals = callPackage ./rationals.nix {};

    recursion_schemes = callPackage ./recursion_schemes.nix {};

    refined = callPackage ./refined.nix {};

    sdl = throw "'idrisPackages.sdl' has been removed, as it was broken and unmaintained"; # added 2024-05-09
    sdl2 = callPackage ./sdl2.nix {};

    semidirect = callPackage ./semidirect.nix {};

    setoids = callPackage ./setoids.nix {};

    smproc = callPackage ./smproc.nix {};

    snippets = callPackage ./snippets.nix {};

    software_foundations = callPackage ./software_foundations.nix {};

    specdris = callPackage ./specdris.nix {};

    tap = callPackage ./tap.nix {};

    test = callPackage ./test.nix {};

    tf-random = callPackage ./tfrandom.nix {};

    tlhydra = callPackage ./tlhydra.nix {};

    tomladris = callPackage ./tomladris.nix {};

    tp = callPackage ./tp.nix {};

    tparsec = callPackage ./tparsec.nix {};

    transducers = callPackage ./transducers.nix {};

    trees = callPackage ./trees.nix {};

    union_type = callPackage ./union_type.nix {};

    vdom = callPackage ./vdom.nix {};

    vecspace = callPackage ./vecspace.nix {};

    webgl = callPackage ./webgl.nix {};

    wl-pprint = callPackage ./wl-pprint.nix {};

    wyvern = callPackage ./wyvern.nix {};

    xhr = callPackage ./xhr.nix {};

    yaml = callPackage ./yaml.nix {};

    yampa = callPackage ./yampa.nix {};

  } // builtins_ // pkgs.lib.optionalAttrs config.allowAliases {
    # removed packages
    protobuf = throw "idrisPackages.protobuf has been removed: abandoned by upstream"; # Added 2022-02-06
  };
in fix' (extends overrides idrisPackages)
