112 lines
1.9 KiB
SCSS
112 lines
1.9 KiB
SCSS
// Map Functions
|
|
// =============
|
|
|
|
|
|
// Truncate List
|
|
// -------------
|
|
// - Return a list, truncated to a given length
|
|
@function _susy-truncate-list(
|
|
$list,
|
|
$length
|
|
) {
|
|
$_return: ();
|
|
|
|
@for $i from 1 through length($list) {
|
|
$_return: if($i <= $length, append($_return, nth($list, $i)), $_return);
|
|
}
|
|
|
|
@return $_return;
|
|
}
|
|
|
|
|
|
// Deep Get
|
|
// --------
|
|
// - Return a value deep in nested maps
|
|
@function _susy-deep-get(
|
|
$map,
|
|
$keys...
|
|
) {
|
|
$_return: $map;
|
|
|
|
@each $key in $keys {
|
|
@if type-of($_return) == map {
|
|
$_return: map-get($_return, $key);
|
|
}
|
|
}
|
|
|
|
@return $_return;
|
|
}
|
|
|
|
|
|
// Deep Set
|
|
// --------
|
|
// - Set a value deep in nested maps
|
|
@function _susy-deep-set(
|
|
$map,
|
|
$keys-value...
|
|
) {
|
|
$_value: nth($keys-value, -1);
|
|
$_keys: _susy-truncate-list($keys-value, length($keys-value) - 1);
|
|
$_length: length($_keys);
|
|
$_return: ();
|
|
|
|
@for $i from 1 through $_length {
|
|
$_n: 0 - $i;
|
|
$_level: _susy-truncate-list($_keys, $_length + $_n);
|
|
$_level: _susy-deep-get($map, $_level...);
|
|
$_merge: nth($_keys, $_n);
|
|
$_merge: ($_merge: $_value);
|
|
$_return: if($_level, map-merge($_level, $_merge), $_merge);
|
|
$_value: $_return;
|
|
}
|
|
|
|
@return $_return;
|
|
}
|
|
|
|
|
|
// Deep Merge
|
|
// ----------
|
|
// Return 2 objects of any depth, merged
|
|
@function _susy-deep-merge(
|
|
$map1,
|
|
$map2
|
|
) {
|
|
|
|
@if type-of($map1) != map or type-of($map2) != map {
|
|
$map1: $map2;
|
|
} @else {
|
|
@each $key, $value in $map2 {
|
|
$_new: ($key: _susy_deep-merge(map-get($map1, $key), $value));
|
|
$map1: map-merge($map1, $_new);
|
|
}
|
|
}
|
|
|
|
@return $map1;
|
|
}
|
|
|
|
|
|
// Deep Has-Key
|
|
// ------------
|
|
// - Return true if a deep key exists
|
|
@function _susy-deep-has-key(
|
|
$map,
|
|
$keys...
|
|
) {
|
|
$_return: null;
|
|
$_stop: false;
|
|
|
|
@each $key in $keys {
|
|
@if not($_stop) {
|
|
$_return: map-has-key($map, $key);
|
|
}
|
|
|
|
@if $_return {
|
|
$map: map-get($map, $key);
|
|
} @else {
|
|
$_stop: true;
|
|
}
|
|
}
|
|
|
|
@return $_return;
|
|
}
|