131 lines
5.5 KiB
Nix
131 lines
5.5 KiB
Nix
{ chemistry, core, document, physical, Substance, ... } @ libs:
|
|
let
|
|
inherit(core) context debug list path type;
|
|
inherit(chemistry) compound elements;
|
|
inherit(elements) calculateMassOfFormula normaliseMolecularFormula;
|
|
|
|
defaultOptions#: { code: bool ? false, ... } -> { code: bool, ... }
|
|
= {
|
|
code ? false,
|
|
id ? false,
|
|
mass ? false,
|
|
name ? false,
|
|
structure ? false,
|
|
}:
|
|
{ inherit code id mass name structure; };
|
|
|
|
parseOptions
|
|
= options:
|
|
defaultOptions
|
|
(
|
|
{
|
|
"i" = { id = true; };
|
|
}.${options}
|
|
);
|
|
|
|
format#: Substance -> Options -> string
|
|
= { name, fake ? false, ... } @ substance:
|
|
options:
|
|
let
|
|
options'
|
|
= type.matchPrimitiveOrPanic options
|
|
{
|
|
set = defaultOptions options;
|
|
string = parseOptions options;
|
|
};
|
|
in
|
|
if options' == { code = false; id = false; mass = false; name = false; structure = false; }
|
|
then
|
|
"\\directlua{substances.printNumber([[${name}]])}"
|
|
else if options' == { code = true; id = false; mass = false; name = false; structure = false; }
|
|
then
|
|
"\\directlua{substances.printCode([[${name}]])}"
|
|
else if options' == { code = false; id = true; mass = false; name = false; structure = false; }
|
|
then
|
|
"\\directlua{substances.printNumber([[${name}]])}"
|
|
else if options' == { code = true; id = true; mass = false; name = false; structure = false; }
|
|
then
|
|
"\\directlua{substances.printCodeID([[${name}]])}"
|
|
else if options' == { code = false; id = false; mass = true; name = false; structure = false; }
|
|
then
|
|
"\\directlua{substances.printMass([[${name}]])}"
|
|
else if options' == { code = false; id = false; mass = false; name = true; structure = false; }
|
|
then
|
|
"\\directlua{substances.printName([[${name}]])}"
|
|
else if options' == { code = true; id = false; mass = false; name = true; structure = false; }
|
|
then
|
|
"\\directlua{substances.printWithCode([[${name}]])}"
|
|
else if options' == { code = false; id = true; mass = false; name = true; structure = false; }
|
|
then
|
|
"\\directlua{substances.printWithID([[${name}]])}"
|
|
else if options' == { code = false; id = false; mass = false; name = false; structure = true; }
|
|
then
|
|
"\\directlua{substances.printMolecule([[${name}]])}"
|
|
else if options' == { code = true; id = false; mass = false; name = false; structure = true; }
|
|
then
|
|
"\\directlua{substances.printMoleculeWithCode([[${name}]])}"
|
|
else if options' == { code = false; id = true; mass = false; name = false; structure = true; }
|
|
then
|
|
"\\directlua{substances.printMoleculeWithNumber([[${name}]])}"
|
|
else if options' == { code = true; id = true; mass = false; name = false; structure = true; }
|
|
then
|
|
"\\directlua{substances.printMoleculeWithNumberCode([[${name}]])}"
|
|
else if options' == { code = false; id = false; mass = true; name = false; structure = true; }
|
|
then
|
|
"\\directlua{substances.printMoleculeWithMass([[${name}]])}"
|
|
else
|
|
debug.unimplemented "format";
|
|
|
|
libs'
|
|
= libs
|
|
// {
|
|
chemistry
|
|
= chemistry
|
|
// {
|
|
inherit Substance;
|
|
};
|
|
};
|
|
|
|
prepare
|
|
= source:
|
|
substances:
|
|
type.matchPrimitiveOrPanic substances
|
|
{
|
|
null = [];
|
|
lambda = prepare source ( substances libs' );
|
|
path
|
|
= prepare
|
|
(source substances)
|
|
(path.importScoped { inherit Substance; } substances);
|
|
list = list.concatMap (prepare source) substances;
|
|
set
|
|
= let
|
|
substance = substances;
|
|
formula = normaliseMolecularFormula substance.formula or [];
|
|
value
|
|
= substance
|
|
// {
|
|
inherit formula source;
|
|
dalton = calculateMassOfFormula formula;
|
|
};
|
|
in
|
|
[
|
|
{
|
|
inherit(value) name;
|
|
value
|
|
= value
|
|
// {
|
|
__functor = _: format value;
|
|
__toString = _: format value {};
|
|
CodeID = format value { code = true; id = true; };
|
|
ID = format value { id = true; };
|
|
Name = format value { name = true; };
|
|
NameID = format value { id = true; name = true; };
|
|
};
|
|
}
|
|
];
|
|
};
|
|
in
|
|
substances:
|
|
list.toSet (prepare (context "substances") substances)
|