mirror of
https://github.com/nmattia/snack.git
synced 2024-10-11 02:47:39 +03:00
57 lines
1.7 KiB
Nix
57 lines
1.7 KiB
Nix
# module related operations
|
|
{ lib
|
|
, callPackage
|
|
, runCommand
|
|
, singleOut
|
|
, haskellPackages
|
|
}:
|
|
|
|
with (callPackage ./files.nix {});
|
|
|
|
rec {
|
|
# Turns a module name to a file
|
|
moduleToFile = mod:
|
|
(lib.strings.replaceChars ["."] ["/"] mod) + ".hs";
|
|
|
|
# Turns a module name into the filepath of its object file
|
|
# TODO: bad name, this is module _name_ to object
|
|
moduleToObject = mod:
|
|
(lib.strings.replaceChars ["."] ["/"] mod) + ".o";
|
|
|
|
# Turns a filepath name to a module name
|
|
fileToModule = file:
|
|
lib.strings.removeSuffix ".hs"
|
|
(lib.strings.replaceChars ["/"] ["."] file);
|
|
|
|
# Singles out a given module (by module name) (derivation)
|
|
singleOutModule = base: mod: singleOut base (moduleToFile mod);
|
|
|
|
# Singles out a given module (by module name) (path to module file)
|
|
singleOutModulePath = base: mod:
|
|
"${singleOut base (moduleToFile mod)}/${moduleToFile mod}";
|
|
|
|
# Generate a list of haskell module names needed by the haskell file
|
|
listModuleImports = baseByModuleName: modName:
|
|
builtins.fromJSON
|
|
(builtins.readFile (listAllModuleImportsJSON (baseByModuleName modName) modName))
|
|
;
|
|
|
|
listModulesInDir = dir: map fileToModule (listFilesInDir dir);
|
|
|
|
doesModuleExist = baseByModuleName: modName:
|
|
doesFileExist (baseByModuleName modName) (moduleToFile modName);
|
|
|
|
# Lists all module dependencies, not limited to modules existing in this
|
|
# project
|
|
listAllModuleImportsJSON = base: modName:
|
|
let
|
|
importParser = runCommand "import-parser"
|
|
{ buildInputs =
|
|
[ (haskellPackages.ghcWithPackages
|
|
(ps: [ ps.haskell-src-exts ]))
|
|
];
|
|
} "ghc ${./Imports.hs} -o $out" ;
|
|
in runCommand "dependencies-json" {}
|
|
"${importParser} ${singleOutModulePath base modName} > $out";
|
|
}
|