// Margin Syntax
// =============

// Pre
// ---
// Add spanning-margins before an element.
// - $span  : <span>
@mixin pre(
  $span
) {
  $inspect: $span;
  $span   : map-merge((spread: wide), parse-span($span));
  $flow   : susy-get(flow, $span);
  $split  : if(susy-get(gutter-position, $span) == split, true, false);
  $width  : if($split, span($span) + gutter($span), span($span));

  @include susy-inspect(pre, $inspect);
  @include margin-output($width, null, $flow);
}

// Post
// ----
// Add spanning-margins after an element.
// - $span  : <span>
@mixin post(
  $span
) {
  $inspect  : $span;
  $span     : map-merge((spread: wide), parse-span($span));
  $flow     : susy-get(flow, $span);
  $split    : if(susy-get(gutter-position, $span) == split, true, false);
  $width    : if($split, span($span) + gutter($span), span($span));

  @include susy-inspect(post, $inspect);
  @include margin-output(null, $width, $flow);
}

// Push
// ----
// Simple synonymn for pre.
// - $span  : <span>
@mixin push(
  $span
) {
  @include pre($span);
}

// Pull
// ----
// Add negative spanning-margins before an element.
// - $span  : <span>
@mixin pull(
  $span
) {
  $inspect  : $span;
  $span     : map-merge((spread: wide), parse-span($span));
  $flow     : susy-get(flow, $span);
  $split    : if(susy-get(gutter-position, $span) == split, true, false);
  $width    : if($split, 0 - span($span) + gutter($span), 0 - span($span));

  @include susy-inspect(pull, $inspect);
  @include margin-output($width, null, $flow);
}

// Squish
// ------
// Add spanning-margins before and after an element.
// - $pre     : <span>
// - [$post]  : <span>
@mixin squish(
  $pre,
  $post: false
) {
  $inspect      : $pre, $post;
  $pre          : map-merge((spread: wide), parse-span($pre));

  @if $post {
    $post: map-merge((spread: wide), parse-span($post));
  } @else {
    $span: susy-get(span, $pre);
    @if length($span) > 1 {
      $pre: map-merge($pre, (span: nth($span, 1)));
      $post: map-merge($pre, (span: nth($span, 2)));
    } @else {
      $post: $pre;
    }
  }

  @include susy-inspect(squish, $inspect...);
  @include pre($pre);
  @include post($post);
}
