@function output-float($Span-Map) {
  // Set up Left/Right maps
  $Return: ();

  $Span: map-get($Span-Map, 'span');
  $Location: map-get($Span-Map, 'location');

  $Grid: map-get($Span-Map, 'grid');
  $Gutter: map-get($Span-Map, 'gutter');
  $Style: map-get($Span-Map, 'style');

  $Start-Row: map-get($Span-Map, 'start row');
  $End-Row: map-get($Span-Map, 'end row');

  $Fixed-Gutter: map-get($Span-Map, 'fixed gutter');
  $Split-Gutter: map-get($Span-Map, 'split gutter');
  $Gutter-Property: map-get($Span-Map, 'gutter property');

  $Direction: map-get($Span-Map, 'direction');
  $Options: map-get($Span-Map, 'options');

  @if $Start-Row {
    $Location: 1;
  }
  @else if $End-Row {
    $Location: column-count($Grid) - $Span + 1;
  }

  $Width: column-span($Span, $Location, $Grid, $Gutter, $Style);
  $Margin-Span: column-span(($Location - 1), 1, $Grid, $Gutter, $Style);
  $Gutter-Span: gutter-span($Gutter, $Grid);

  // Backwards Compatibility for Options
  @if type-of($Options) != 'map' and $Options != null {
    $Options: ('clear': unquote(nth($Options, 1)));
  }

  $Dir: $Direction;
  $Opp: opposite-direction($Dir);

  $Return: map-merge($Return, ('width': $Width));
  $Return: map-merge($Return, ('clear': $Opp));

  @if ($End-Row) {
    $Return: map-merge($Return, ('float': $Opp));

    @if $Split-Gutter and not $Fixed-Gutter {
      $Return: map-merge($Return, ('#{$Gutter-Property}-#{$Dir}': 0));
      $Return: map-merge($Return, ('#{$Gutter-Property}-#{$Opp}': $Gutter-Span / 2));
    }
    @else if not $Fixed-Gutter {
      $Return: map-merge($Return, ('#{$Gutter-Property}-#{$Opp}': 0));
    }
  }
  @else {
    $Return: map-merge($Return, ('float': $Dir));

    @if $Split-Gutter and not $Fixed-Gutter {
      $Return: map-merge($Return, ('#{$Gutter-Property}-#{$Dir}': $Gutter-Span / 2));
      $Return: map-merge($Return, ('#{$Gutter-Property}-#{$Opp}': $Gutter-Span / 2));
    }
    @else if not $Fixed-Gutter {
      @if $Start-Row {
        $Return: map-merge($Return, ('#{$Gutter-Property}-#{$Dir}': 0));
      }
      $Return: map-merge($Return, ('#{$Gutter-Property}-#{$Opp}': $Gutter-Span));
    }
  }
  // If options are set, we merge them in!
  @if ($Options) {
    $Return: map-merge($Return, $Options);
  }

  // If CLear isn't already available, set it!
  @if not map-has-key($Return, 'clear') {
    $Return: map-merge($Return, ('clear': none));
  }

  // Left Fixed Gutters
  @if $Fixed-Gutter {
    @if index($Style, 'split') {
      $Return: map-merge($Return, ('#{$Gutter-Property}-#{$Dir}': $Gutter-Span / 2));
      $Return: map-merge($Return, ('#{$Gutter-Property}-#{$Opp}': $Gutter-Span / 2));
    }
    @else {
      @if not $End-Row {
        $Return: map-merge($Return, ('#{$Gutter-Property}-#{$Opp}': $Gutter-Span));
      }
      @else {
        $Return: map-merge($Return, ('#{$Gutter-Property}-#{$Opp}': 0));
      }
    }
  }

  @return $Return;
}

//////////////////////////////
// Happy Syntax for Float
//
// Makes working with Float easier, as it allows you to walk the grid for symmetric grids and easy applying of 'last' and 'first', as well as automatically building the verbose grid-span mixin call
//////////////////////////////
@mixin float-span($Span, $Location: false, $grid: false, $gutter: false, $gutter-style: false, $from: false) {
  $grid: find-grid($grid);
  $gutter: find-gutter($gutter);
  $row: false;

  $Options: if($from, ('from': $from), null);

  // Working around SASS treating a number like a list with one element
  @if type-of($grid) == 'list' and length($grid) == 1 {
    $grid: nth($grid, 1);
  }

  // Working with a symmetric grid
  @if type-of($grid) == 'number' {
    // Special treatment for non-numeric location
    @if type-of($Location) != 'number' {
      @if $Location == 'last' or $Location == 'omega' {
        $Location: $grid - $Span + 1;
      }
      @else {
        @if $Location == 'first' or $Location == 'alpha' {
          $row: true;
        }
        $Location: 1;
      }
    }

    @include grid-span($Span, $Location, $grid, $gutter, 'float', $gutter-style, $Options);

    @if $row {
      clear: both;
    }
  }
  // Working with an asymmetric grid, should have location provided
  @else if type-of($grid) == 'list' and $Location != false {
    @include grid-span($Span, $Location, $grid, $gutter, 'float', $gutter-style, $Options);
  }
  @else {
    @warn 'Asymmetric Grids need a Location value as well as a span value in order to know where on the grid you are! Please include a location value!';
  }
}
