1@function ms-reverse-list($list) {
2  @if length($list) > 1 {
3    @if nth($list, 1) > nth($list, length($list)) {
4      $MS-reversed-list: ();
5      @each $Value in $list {
6        $MS-reversed-list: join($Value, $MS-reversed-list);
7      }
8      @return $MS-reversed-list;
9    }
10  }
11  @return $list;
12}
13
14
15@function ms-generate-list($Value: 0, $Bases: $ms-base, $Ratios: $ms-ratio) {
16
17  // Create blank lists
18  $MS-list: ();
19  $MS-base-list: ();
20
21  // Loop through each ratio AND each base
22  // to generate all possibilities.
23  @each $Ratio in $Ratios {
24    @each $Base in $Bases {
25
26      // Set base variables
27      $MS-base-list: ();
28      $Base-counter: 0;
29
30      // Seed list with an initial value
31      $MS-base-list: $Base;
32
33      // Find values on a positive scale
34      @if $Value >= 0 {
35
36        // Find lower values on the scale
37        $Base-counter: -1;
38        @while ms-calc($Base-counter, $Base, $Ratio) >= nth($Bases, 1) {
39          $MS-base-list: join($MS-base-list, ms-calc($Base-counter, $Base, $Ratio));
40          $Base-counter: $Base-counter - 1;
41        }
42
43        // Ensure the list is smallest to largest
44        $MS-base-list: ms-reverse-list($MS-base-list);
45
46        // Find higher possible values on the scale
47        $Base-counter: 1;
48        @while ms-calc($Base-counter, $Base, $Ratio) <= ms-calc($Value, nth($Bases, 1), $Ratio) {
49          $MS-base-list: join($MS-base-list, ms-calc($Base-counter, $Base, $Ratio));
50          $Base-counter: $Base-counter + 1;
51        }
52      }
53
54      // Find values on a negitive scale
55      @else {
56
57        // Find lower values on the scale
58        $Base-counter: 1;
59        @while ms-calc($Base-counter, $Base, $Ratio) <= nth($Bases, 1) {
60          $MS-base-list: join($MS-base-list, ms-calc($Base-counter, $Base, $Ratio));
61          $Base-counter: $Base-counter + 1;
62        }
63
64        // Ensure the list is smallest to largest
65        $MS-base-list: ms-reverse-list($MS-base-list);
66
67        // Find higher possible values on the scale
68        $Base-counter: -1;
69        @while ms-calc($Base-counter, $Base, $Ratio) >= ms-calc($Value, nth($Bases, 1), $Ratio) {
70          $MS-calc: ms-calc($Base-counter, $Base, $Ratio);
71          // detect if the value excedes the main base value
72          @if $MS-calc < nth($Bases, 1) {
73            $MS-base-list: join($MS-base-list, $MS-calc);
74          }
75          $Base-counter: $Base-counter - 1;
76        }
77
78        // Trim outlier base.
79        @if length($Bases) > 1 {
80          @for $i from 2 through length($Bases) {
81            @if nth($MS-base-list, 1) > nth($Bases, 1) {
82              $MS-new-list: ();
83              @for $i from 2 through length($MS-base-list) {
84                $MS-new-list: join($MS-new-list, nth($MS-base-list, $i));
85              }
86              $MS-base-list: $MS-new-list;
87            }
88          }
89        }
90      }
91
92      // reverse list if its largest to smallest
93      $MS-base-list: ms-reverse-list($MS-base-list);
94
95      // Add new possibilities to the master list
96      $MS-list: append($MS-list, $MS-base-list, comma);
97
98    }
99  }
100
101  // After all the possibilities are found, output a master list
102  @return $MS-list;
103}