// 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;

}