AttrSet
Abstract
An AttrSet
type can be thought of as just a list of pair of name and value
.
fst
onpair of name and value
yields thename
.snd
onpair of name and value
yields thevalue
.
Then AttrSet
can be written as:
[Pair(name,value)]
when you reference a specific name on an AttrSet; You basically implicitly apply a filter
or find
operation on that list where the fst
of the mapped entry
equals the referenced name
For simplicity this is called a member name
from now on, if that name exists.
Redefining some operators
::
-operator within AttrSet
contexts
The ::
-operator maps the Type of its RHS
over the Type
on its LHS
. It can take an Iterable
or a single element
on its LHS.
Within Type-declarations for AttrSets it is possible to declare an explicit member name
of an AttrSet like this.
{
N :: T
}
Then N
is of type String
and N
becomes a member name
of that AttrSet. The snd
operation on the entry of N
would yield a value of type T
.
Introducing: [ N :: T ]
-operator, which can only be used within AttrSet
in member name
fields.
The [ N :: T ]
-operator maps over all member names
of an AttrSet [N]
and applies the type T
to each member name N
if not already done by explicit member__ declaration (see above).
When there are AttrSets with dynamic members it is possible to declare all those members at once with the [ N :: T ]
and ::
operator.
Then an AttrSet with list of dynamic members where each member-name N
references a value of type V
can be written as.
{
[ N :: T ] :: V
}
Examples
# member '.foo' references a value of type string
# all other members `*` are of type string and each member reference value of any variable Type.
{
[ name :: String ] :: a,
foo :: String
}
{ foo :: a }
{}
where the member names `[ N :: T ] are an empty list.
useful ${}
Shortcut
${N} = [ N :: String ]
If we take into account that in AttrSets names
(N
) are always of type String
the user can omit the String
Keyword completely, and instead give only the names. N
That rule allows for intuitive usage of names within type definitions of an AttrSet
/*
type:
packageMap :: {
${pname} :: {
${version} :: Derivation
}
}
*/
packageMap = {
"gcc-utils" = {
"1.2.3" = builtins.Derivation {...};
};
# ...
};