90 lines
2.3 KiB
Nix
90 lines
2.3 KiB
Nix
{ core, ... } @ libs:
|
|
let
|
|
inherit(core) debug library list set type;
|
|
|
|
uid
|
|
= {
|
|
__functor
|
|
= self:
|
|
counter:
|
|
{
|
|
inherit counter;
|
|
keys = { };
|
|
values = [ ];
|
|
inserted = null;
|
|
};
|
|
|
|
insert
|
|
= { ... } @ self:
|
|
value:
|
|
let
|
|
self' = tryInsert self value;
|
|
in
|
|
if !self'.inserted
|
|
then
|
|
debug.panic [ "uid" "insert" ] "Cannot insert value to unique, because it is already there!"
|
|
else
|
|
self';
|
|
|
|
length#:
|
|
= { values, ... }:
|
|
list.length values;
|
|
|
|
tryInsert
|
|
= { counter, keys, values, ... } @ self:
|
|
value:
|
|
let
|
|
key = string value;
|
|
in
|
|
if keys.${key} or null == null
|
|
then
|
|
{
|
|
counter = counter + 1;
|
|
keys = keys // { ${key} = value; };
|
|
values = values ++ [ value ];
|
|
inserted = true;
|
|
}
|
|
else
|
|
self
|
|
// {
|
|
inserted = false;
|
|
};
|
|
};
|
|
|
|
preparePerson
|
|
= identifier:
|
|
value:
|
|
value
|
|
// {
|
|
__functor
|
|
= self:
|
|
{ surname, ... }:
|
|
"##${surname}##";
|
|
};
|
|
|
|
preparePeople
|
|
= people:
|
|
type.matchPrimitiveOrPanic people
|
|
{
|
|
lambda
|
|
= preparePeople
|
|
(
|
|
people
|
|
(
|
|
libs
|
|
// {
|
|
Person
|
|
= name:
|
|
{
|
|
inherit name;
|
|
};
|
|
}
|
|
)
|
|
);
|
|
path = preparePeople ( library.import people );
|
|
set = set.map preparePerson people;
|
|
};
|
|
in
|
|
{
|
|
initEvaluationState = uid 0;
|
|
} |