SassyMatrix 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. data/CHANGELOG.md +16 -0
  2. data/README.md +61 -0
  3. data/lib/SassyMatrix.rb +14 -0
  4. data/stylesheets/functions/checkers/_is-diagonal.scss +22 -0
  5. data/stylesheets/functions/checkers/_is-lower-triangular.scss +12 -0
  6. data/stylesheets/functions/checkers/_is-numeric.scss +18 -0
  7. data/stylesheets/functions/checkers/_is-square.scss +12 -0
  8. data/stylesheets/functions/checkers/_is-symmetric.scss +15 -0
  9. data/stylesheets/functions/checkers/_is-upper-triangular.scss +12 -0
  10. data/stylesheets/functions/getters/_get-column.scss +29 -0
  11. data/stylesheets/functions/getters/_get-entry.scss +20 -0
  12. data/stylesheets/functions/getters/_get-row.scss +22 -0
  13. data/stylesheets/functions/helpers/_is-triangular.scss +30 -0
  14. data/stylesheets/functions/helpers/_valid-coords.scss +37 -0
  15. data/stylesheets/functions/init/_matrix.scss +23 -0
  16. data/stylesheets/functions/init/_unit-matrix.scss +25 -0
  17. data/stylesheets/functions/misc/_add-matrices.scss +33 -0
  18. data/stylesheets/functions/misc/_columns.scss +9 -0
  19. data/stylesheets/functions/misc/_display.scss +42 -0
  20. data/stylesheets/functions/misc/_rows.scss +9 -0
  21. data/stylesheets/functions/misc/_transpose.scss +22 -0
  22. data/stylesheets/functions/setters/_add-column.scss +35 -0
  23. data/stylesheets/functions/setters/_add-row.scss +33 -0
  24. data/stylesheets/functions/setters/_set-column.scss +42 -0
  25. data/stylesheets/functions/setters/_set-entry.scss +19 -0
  26. data/stylesheets/functions/setters/_set-row.scss +37 -0
  27. data/stylesheets/functions/swap/_swap-columns.scss +32 -0
  28. data/stylesheets/functions/swap/_swap-entries.scss +20 -0
  29. data/stylesheets/functions/swap/_swap-rows.scss +24 -0
  30. data/stylesheets/matrix.scss +103 -0
  31. metadata +77 -0
data/CHANGELOG.md ADDED
@@ -0,0 +1,16 @@
1
+ # Changelog
2
+
3
+ * `1.0.11`: fixing an issue with scientific number parsing
4
+ * `1.0.10`: improving number and string helpers
5
+ * `1.0.9`: fixing a bug in `_find-exponent`
6
+ * `1.0.8`: fixing a major issue in Ruby Gem
7
+ * `1.0.7`: minor fixes and stable Ruby Gem
8
+ * `1.0.6`: released a Ruby Gem
9
+ * `1.0.5`: improved the encoding mixin
10
+ * `1.0.4`: fixed an error in map parsing
11
+ * `1.0.3`: slightly edited the mixin to dump JSON to CSS
12
+ * `1.0.2`: fixed an issue with string parsing
13
+ * `1.0.1`: fixed an issue with alpha color parsing
14
+ * `1.0.0`: Stable API. `json-encode` and `json-decode`
15
+ * `0.0.2`: added `json-decode` and test
16
+ * `0.0.1`: initial commit
data/README.md ADDED
@@ -0,0 +1,61 @@
1
+ # SassyMatrix [![Build Status](https://travis-ci.org/HugoGiraudel/SassyMatrix.png)](https://travis-ci.org/HugoGiraudel/SassyMatrix)
2
+
3
+ All you ever wanted to deal with matrices in Sass.
4
+
5
+ ## What's in there?
6
+
7
+ ### Instanciating matrix
8
+ * `matrix($x, $y: $x)`: create a matrix of `$x` rows by `$y` columns filled with 0s
9
+ * `unit-matrix($x, $y)`: create a matrix of `$x` rows by `$y` columns filled with 0s except the diagonal which is filled with 1s
10
+
11
+ ### Writing in matrix
12
+ * `set-entry($matrix, $coords, $value)`: set `$value` at `$matrix[$coords[1], $coords[2]]`
13
+ * `set-column($matrix, $index, $column: ())`: set `$column` at `$index` in `$matrix`
14
+ * `set-row($matrix, $index, $row: ())`: set `$row` at `$index` in `$matrix`
15
+ * `add-column($matrix, $column: (), $index: null)`: add `$column` at `$index` in `$matrix`
16
+ * `add-row($matrix, $row: (), $index: null)`: add `$row` at `$index` in `$matrix`
17
+
18
+ ### Reading matrix
19
+ * `get-entry($matrix, $coords)`: get entry at `$matrix[$coords[1], $coords[2]]`
20
+ * `get-column($matrix, $index)`: get column at `$index` from `$matrix`
21
+ * `get-row($matrix, $index)`: get row at `$index` from `$matrix`
22
+
23
+ ### Displaying matrix
24
+ * `display($matrix)`: display matrix
25
+
26
+ ### Altering matrix
27
+ * `swap-entries($matrix, $e1, $e2)`: swaps values `$e1` and `$e2` from `$matrix`
28
+ * `swap-rows($matrix, $r1, $r2)`: swaps rows `$r1` and `$r2` from `$matrix`
29
+ * `swap-columns($matrix, $c1, $c2)`: swaps columns `$c1` and `$c2` from `$matrix`
30
+ * `transpose($matrix)`: rotates `$matrix` around its diagonal
31
+ * `add-matrices($matrix1, $matrix2)`: add `$matrix1` and `$matrix2`
32
+
33
+ ### Checking for matrix properties
34
+ * `columns($matrix)`: return number of columns in `$matrix`
35
+ * `rows($matrix)`: return number of rows in `$matrix`
36
+ * `is-numeric($matrix)`: check whether `$matrix` has only numeric values
37
+ * `is-square($matrix)`: check whether `$matrix` has as many rows as columns
38
+ * `is-diagonal($matrix)`: check whether all values from the main diagonal of `$matrix` are set while all other values are equal to 0
39
+ * `is-lower-triangular($matrix, $flag: null)`: check whether all value below `$matrix` diagonal are equal to 0
40
+ * `is-upper-triangular($matrix, $flag: null)`: check whether all value above `$matrix` diagonal are equal to 0
41
+
42
+ ## Requirements
43
+
44
+ All you need is a clean version of Sass 3.3. Otherwise it's just pure Sass madness.
45
+
46
+ ## Development
47
+
48
+ ### You need
49
+
50
+ * [NodeJS](http://nodejs.org)
51
+ * [Ruby](https://www.ruby-lang.org/)
52
+ * Sass 3.3 via `gem instal sass --pre`
53
+ * `grunt-cli` via `npm install -g grunt-cli`
54
+
55
+ ### How to
56
+
57
+ 1. Fork this repository
58
+ 2. Run `npm install`
59
+ 3. `grunt dev`
60
+ 4. Make your changes + write tests
61
+ 5. Commit + Pull request
@@ -0,0 +1,14 @@
1
+ require 'compass'
2
+ extension_path = File.expand_path(File.join(File.dirname(__FILE__), ".."))
3
+ Compass::Frameworks.register('SassyJSON', :path => extension_path)
4
+
5
+ # Version is a number. If a version contains alphas, it will be created as a prerelease version
6
+ # Date is in the form of YYYY-MM-DD
7
+ module SassyMatrix
8
+ VERSION = "1.0.0"
9
+ DATE = "2014-01-23"
10
+ end
11
+
12
+ module Sass::Script::Functions
13
+
14
+ end
@@ -0,0 +1,22 @@
1
+ // Checks whether all entries from the main diagonal of `$matrix`
2
+ // are set while all other entries are equal to the 0
3
+ // --------------------------------------------------------------------------------
4
+ // @require `get-entry`
5
+ // @require `columns`
6
+ // @require `rows`
7
+ // --------------------------------------------------------------------------------
8
+ // @param $matrix: matrix
9
+ // --------------------------------------------------------------------------------
10
+ // @return boolean
11
+
12
+ @function is-diagonal($matrix) {
13
+ @for $i from 1 through rows($matrix) {
14
+ @for $j from 1 through columns($matrix) {
15
+ $entry: get-entry($matrix, ($i $j));
16
+ @if ($i != $j and $entry != 0) or ($i == $j and $entry == 0) {
17
+ @return false;
18
+ }
19
+ }
20
+ }
21
+ @return true;
22
+ }
@@ -0,0 +1,12 @@
1
+ // Checks whether `$matrix` is lower triangular with `$flag` option
2
+ // --------------------------------------------------------------------------------
3
+ // @require `_is-triangular`
4
+ // --------------------------------------------------------------------------------
5
+ // @param $matrix: matrix
6
+ // @param $flag: advanced option (null | strict | unit | atom)
7
+ // --------------------------------------------------------------------------------
8
+ // @return boolean
9
+
10
+ @function is-lower-triangular($matrix, $flag: null) {
11
+ @return _is-triangular($matrix, bottom, $flag);
12
+ }
@@ -0,0 +1,18 @@
1
+ // Checks whether all entries from `$matrix` are numeric
2
+ // --------------------------------------------------------------------------------
3
+ // @require `rows`
4
+ // @require `columns`
5
+ // @require `get-entry`
6
+ // --------------------------------------------------------------------------------
7
+ // @return boolean
8
+
9
+ @function is-numeric($matrix) {
10
+ @for $i from 1 through rows($matrix) {
11
+ @for $j from 1 through columns($matrix) {
12
+ @if type-of(get-entry($matrix, ($i $j))) != number {
13
+ @return false;
14
+ }
15
+ }
16
+ }
17
+ @return true;
18
+ }
@@ -0,0 +1,12 @@
1
+ // Returns whether `$matrix` has as many rows as columns
2
+ // --------------------------------------------------------------------------------
3
+ // @require `columns`
4
+ // @require `rows`
5
+ // --------------------------------------------------------------------------------
6
+ // @param $matrix: matrix
7
+ // --------------------------------------------------------------------------------
8
+ // @return boolean
9
+
10
+ @function is-square($matrix) {
11
+ @return columns($matrix) == rows($matrix);
12
+ }
@@ -0,0 +1,15 @@
1
+ // Checks whether a matrix is symetric
2
+ // --------------------------------------------------------------------------------
3
+ // @require `transpose`
4
+ // @require `is-square`
5
+ // --------------------------------------------------------------------------------
6
+ // @param $matrix: matrix
7
+ // --------------------------------------------------------------------------------
8
+ // @return boolean
9
+
10
+ @function is-symmetric($matrix) {
11
+ @if not is-square($matrix) {
12
+ @return false;
13
+ }
14
+ @return $matrix == transpose($matrix);
15
+ }
@@ -0,0 +1,12 @@
1
+ // Checks whether `$matrix` is upper triangular with `$flag` option
2
+ // --------------------------------------------------------------------------------
3
+ // @require `_is-triangular`
4
+ // --------------------------------------------------------------------------------
5
+ // @param $matrix: matrix
6
+ // @param $flag: advanced option (null | strict | unit | atom)
7
+ // --------------------------------------------------------------------------------
8
+ // @return boolean
9
+
10
+ @function is-upper-triangular($matrix, $flag: null) {
11
+ @return _is-triangular($matrix, top, $flag);
12
+ }
@@ -0,0 +1,29 @@
1
+ // Return column at `$index` from `$matrix`
2
+ // --------------------------------------------------------------------------------
3
+ // @require `get-entry`
4
+ // @require `rows`
5
+ // @require `columns`
6
+ // --------------------------------------------------------------------------------
7
+ // @param $matrix: matrix
8
+ // @param $index: index
9
+ // --------------------------------------------------------------------------------
10
+ // @return list
11
+
12
+ @function get-column($matrix, $index) {
13
+ @if type-of($index) != number {
14
+ @warn "Invalid column index.";
15
+ @return false;
16
+ }
17
+
18
+ @if abs($index) > columns($matrix) {
19
+ @warn "Out of bound column index.";
20
+ @return false;
21
+ }
22
+
23
+ $column: ();
24
+ @for $i from 1 through rows($matrix) {
25
+ $column: append($column, get-entry($matrix, ($i $index)))
26
+ }
27
+
28
+ @return $column;
29
+ }
@@ -0,0 +1,20 @@
1
+ // Returns entry at `$matrix[$coords[1], $coords[2]]`
2
+ // --------------------------------------------------------------------------------
3
+ // @require `_valid-coords`
4
+ // --------------------------------------------------------------------------------
5
+ // @param $matrix: matrix
6
+ // @param $coords: (x y) coordinates
7
+ // --------------------------------------------------------------------------------
8
+ // @return literal
9
+
10
+ @function get-entry($matrix, $coords) {
11
+ @if length($coords) == 1 {
12
+ $coords: ($coords $coords);
13
+ }
14
+
15
+ @if _valid-coords($coords, $matrix) {
16
+ @return nth(nth($matrix, nth($coords, 1)), nth($coords, 2));
17
+ }
18
+
19
+ @return false;
20
+ }
@@ -0,0 +1,22 @@
1
+ // Return row at `$index` from `$matrix`
2
+ // --------------------------------------------------------------------------------
3
+ // @require `rows`
4
+ // --------------------------------------------------------------------------------
5
+ // @param $matrix: matrix
6
+ // @param $index: index
7
+ // --------------------------------------------------------------------------------
8
+ // @return list
9
+
10
+ @function get-row($matrix, $index) {
11
+ @if type-of($index) != number {
12
+ @warn "Invalid row index.";
13
+ @return false;
14
+ }
15
+
16
+ @if abs($index) > rows($matrix) {
17
+ @warn "Out of bound row index.";
18
+ @return false;
19
+ }
20
+
21
+ @return nth($matrix, $index);
22
+ }
@@ -0,0 +1,30 @@
1
+ // Checks whether `$matrix` is `$side` triangular with `$flag` options
2
+ // --------------------------------------------------------------------------------
3
+ // @require `rows`
4
+ // @require `columns`
5
+ // @require `get-entry`
6
+ // --------------------------------------------------------------------------------
7
+ // @param $matrix: matrix
8
+ // @param $side: side (top | bottom)
9
+ // @param $flag: advanced options (null | strict | unit | atom)
10
+ // --------------------------------------------------------------------------------
11
+ // @return boolean
12
+
13
+ @function _is-triangular($matrix, $side: top, $flag: null) {
14
+ @for $i from 1 through rows($matrix) {
15
+ @for $j from 1 through columns($matrix) {
16
+ $entry: get-entry($matrix, ($i $j));
17
+ @if $i > $j {
18
+ @if $side == top and $entry != 0 { @return false; }
19
+ }
20
+ @else if $i < $j {
21
+ @if $side == bottom and $entry != 0 { @return false; }
22
+ }
23
+ @else {
24
+ @if $flag == strict and $entry != 0 { @return false; }
25
+ @if $flag == unit and $entry != 1 { @return false; }
26
+ }
27
+ }
28
+ }
29
+ @return true;
30
+ }
@@ -0,0 +1,37 @@
1
+ // Checks whether `$coords` are valid coordinates
2
+ // --------------------------------------------------------------------------------
3
+ // @require `rows`
4
+ // @require `columns`
5
+ // --------------------------------------------------------------------------------
6
+ // @param $matrix: matrix
7
+ // @param $coords: coordinates
8
+ // --------------------------------------------------------------------------------
9
+ // @return boolean
10
+
11
+ @function _valid-coords($coords, $matrix: null) {
12
+ @if length($coords) == 1 {
13
+ $coords: ($coords, $coords);
14
+ }
15
+
16
+ $x: nth($coords, 1);
17
+ $y: nth($coords, 2);
18
+
19
+ @if length($coords) != 2 {
20
+ @warn "Wrong number of coordinates.";
21
+ @return false;
22
+ }
23
+
24
+ @if type-of($x) != number or type-of($y) != number {
25
+ @warn "Invalid coordinates.";
26
+ @return false;
27
+ }
28
+
29
+ @if $matrix {
30
+ @if abs($x) > rows($matrix) or abs($y) > columns($matrix) {
31
+ @warn "Out of bound coordinates.";
32
+ @return false;
33
+ }
34
+ }
35
+
36
+ @return true;
37
+ }
@@ -0,0 +1,23 @@
1
+ // Initializing a matrix of `$x` by `$y` with 0s
2
+ // --------------------------------------------------------------------------------
3
+ // @require `_valid-coords`
4
+ // --------------------------------------------------------------------------------
5
+ // @param $x: number of rows
6
+ // @param $y: number of columns
7
+ // --------------------------------------------------------------------------------
8
+ // @return matrix
9
+
10
+ @function matrix($x, $y: $x) {
11
+ @if _valid-coords(($x $y)) {
12
+ $matrix: ();
13
+ @for $i from 1 through $x {
14
+ $tmp: ();
15
+ @for $y from 1 through $y {
16
+ $tmp: append($tmp, 0)
17
+ }
18
+ $matrix: append($matrix, $tmp);
19
+ }
20
+ @return $matrix;
21
+ }
22
+ @return false;
23
+ }
@@ -0,0 +1,25 @@
1
+ // Initializing a matrix of `$x` by `$y` with its diagonal filled with 1s
2
+ // --------------------------------------------------------------------------------
3
+ // @require `_valid-coords`
4
+ // @require `matrix`
5
+ // @require `set-entry`
6
+ // --------------------------------------------------------------------------------
7
+ // @param $x: number of rows
8
+ // @param $y: number of columns
9
+ // --------------------------------------------------------------------------------
10
+ // @return matrix
11
+
12
+ @function unit-matrix($x, $y: $x) {
13
+ @if _valid-coords(($x $y)) {
14
+ $matrix: matrix($x, $y);
15
+ @for $i from 1 through $x {
16
+ @for $j from 1 through $y {
17
+ @if $i == $j {
18
+ $matrix: set-entry($matrix, ($i $j), 1);
19
+ }
20
+ }
21
+ }
22
+ @return $matrix;
23
+ }
24
+ @return false;
25
+ }
@@ -0,0 +1,33 @@
1
+ // Add `$matrices`
2
+ // --------------------------------------------------------------------------------
3
+ // @require `rows`
4
+ // @require `columns`
5
+ // @require `get-entry`
6
+ // @require `set-entry`
7
+ // --------------------------------------------------------------------------------
8
+ // @param $matrices: matrices
9
+ // --------------------------------------------------------------------------------
10
+ // @return matrix
11
+
12
+ @function add-matrices($matrices...) {
13
+ $matrix: nth($matrices, 1);
14
+ @each $m in $matrices {
15
+ @if columns($matrix) != columns($m)
16
+ or rows($matrix) != rows($m) {
17
+ @warn "All matrices do not have same dimensions.";
18
+ @return false;
19
+ }
20
+ }
21
+
22
+ @for $i from 1 through rows($matrix) {
23
+ @for $j from 1 through columns($matrix) {
24
+ $value: null;
25
+ @each $m in $matrices {
26
+ $entry: get-entry($m, ($i $j));
27
+ $value: if($value == null, $entry, $value + $entry);
28
+ }
29
+ $matrix: set-entry($matrix, ($i $j), $value);
30
+ }
31
+ }
32
+ @return $matrix;
33
+ }
@@ -0,0 +1,9 @@
1
+ // Returns number of columns in `$matrix`
2
+ // --------------------------------------------------------------------------------
3
+ // @param $matrix: matrix
4
+ // --------------------------------------------------------------------------------
5
+ // @return number
6
+
7
+ @function columns($matrix) {
8
+ @return length(nth($matrix, 1));
9
+ }
@@ -0,0 +1,42 @@
1
+ // Returns the visual representation of `$matrix` as a string
2
+ // --------------------------------------------------------------------------------
3
+ // @param $matrix: matrix to display
4
+ // --------------------------------------------------------------------------------
5
+ // @return string
6
+
7
+ @function display($matrix) {
8
+ $str: "";
9
+ @each $line in $matrix {
10
+ $tmp: "";
11
+ @each $item in $line {
12
+ $tmp: $tmp + " " + $item;
13
+ }
14
+ $str: $str + $tmp + "\A ";
15
+ }
16
+ @return $str;
17
+ }
18
+
19
+ // Mixin displaying the matrix
20
+ // using body pseudo-elements
21
+ //
22
+ // @param $matrix: matrix to display
23
+ // @param $pseudo: pseudo element to use
24
+
25
+ @mixin display($matrix, $pseudo: before) {
26
+ body:#{$pseudo} {
27
+ content: display($matrix) !important;
28
+
29
+ display: block !important;
30
+ margin: 1em !important;
31
+ padding: .5em !important;
32
+
33
+ background: #EFEFEF !important;
34
+ border: 1px solid #DDD !important;
35
+ border-radius: .2em !important;
36
+
37
+ color: #333 !important;
38
+ font: 1.5em/1.5 "Courier New", monospace !important;
39
+ text-shadow: 0 1px white !important;
40
+ white-space: pre-wrap !important;
41
+ }
42
+ }
@@ -0,0 +1,9 @@
1
+ // Returns number of rows in `$matrix`
2
+ // --------------------------------------------------------------------------------
3
+ // @param $matrix: matrix
4
+ // --------------------------------------------------------------------------------
5
+ // @return number
6
+
7
+ @function rows($matrix) {
8
+ @return length($matrix);
9
+ }
@@ -0,0 +1,22 @@
1
+ // Translate `$matrix` on its diagonal axe
2
+ // --------------------------------------------------------------------------------
3
+ // @require `matrix`
4
+ // @require `columns`
5
+ // @require `rows`
6
+ // @require `get-entry`
7
+ // @require `set-entry`
8
+ // --------------------------------------------------------------------------------
9
+ // @param $matrix: matrix
10
+ // --------------------------------------------------------------------------------
11
+ // @return matrix
12
+
13
+ @function transpose($matrix) {
14
+ $new-matrix: matrix(columns($matrix), rows($matrix));
15
+ @for $i from 1 through rows($matrix) {
16
+ @for $j from 1 through columns($matrix) {
17
+ $entry: get-entry($matrix, ($i $j));
18
+ $new-matrix: set-entry($new-matrix, ($j $i), $entry);
19
+ }
20
+ }
21
+ @return $new-matrix;
22
+ }
@@ -0,0 +1,35 @@
1
+ // Add a new `$column` to `$matrix` at `$index`
2
+ // --------------------------------------------------------------------------------
3
+ // @require `rows`
4
+ // @require `swap-columns`
5
+ // --------------------------------------------------------------------------------
6
+ // @param $matrix: matrix
7
+ // @param $column: column to add
8
+ // @param $index: index to add column at
9
+ // --------------------------------------------------------------------------------
10
+ // @return matrix
11
+
12
+ @function add-column($matrix, $column: (), $index: null) {
13
+ $desired-length: rows($matrix);
14
+
15
+ @if $column == () {
16
+ @for $i from 1 through $desired-length {
17
+ $column: append($column, 0);
18
+ }
19
+ }
20
+
21
+ @if length($column) != $desired-length {
22
+ @warn "Wrong length for new column; should be #{$desired-length}.";
23
+ @return false;
24
+ }
25
+
26
+ @for $i from 1 through $desired-length {
27
+ $matrix: set-nth($matrix, $i, append(nth($matrix, $i), nth($column, $i)));
28
+ }
29
+
30
+ @if $index != null {
31
+ $matrix: swap-columns($matrix, -1, $index);
32
+ }
33
+
34
+ @return $matrix;
35
+ }
@@ -0,0 +1,33 @@
1
+ // Add a new `$row` to `$matrix`
2
+ // --------------------------------------------------------------------------------
3
+ // @require `swap-rows`
4
+ // @require `columns`
5
+ // --------------------------------------------------------------------------------
6
+ // @param $matrix: matrix
7
+ // @param $row: row to add
8
+ // @param $index: index to add row at
9
+ // --------------------------------------------------------------------------------
10
+ // @return matrix
11
+
12
+ @function add-row($matrix, $row: (), $index: null) {
13
+ $desired-length: columns($matrix);
14
+
15
+ @if $row == () {
16
+ @for $i from 1 through $desired-length {
17
+ $row: append($row, 0);
18
+ }
19
+ }
20
+
21
+ @if length($row) != $desired-length {
22
+ @warn "Wrong length for new row; should be #{$desired-length}.";
23
+ @return false;
24
+ }
25
+
26
+ $matrix: append($matrix, $row);
27
+
28
+ @if $index != null {
29
+ $matrix: swap-rows($matrix, -1, $index);
30
+ }
31
+
32
+ @return $matrix;
33
+ }
@@ -0,0 +1,42 @@
1
+ // Set `$column` at `$index` in `$matrix`
2
+ // --------------------------------------------------------------------------------
3
+ // @require `set-entry`
4
+ // @require `rows`
5
+ // @require `columns`
6
+ // --------------------------------------------------------------------------------
7
+ // @param $matrix: matrix
8
+ // @param $column: column
9
+ // @param $index: index
10
+ // --------------------------------------------------------------------------------
11
+ // @return matrix
12
+
13
+ @function set-column($matrix, $index, $column: ()) {
14
+ $desired-length: rows($matrix);
15
+
16
+ @if type-of($index) != number {
17
+ @warn "Invalid column index.";
18
+ @return false;
19
+ }
20
+
21
+ @if abs($index) > columns($matrix) {
22
+ @warn "Out of bound column index.";
23
+ @return false;
24
+ }
25
+
26
+ @if $column == () {
27
+ @for $i from 1 through $desired-length {
28
+ $column: append($column, 0);
29
+ }
30
+ }
31
+
32
+ @if length($column) != $desired-length {
33
+ @warn "Wrong length for new column; should be #{$desired-length}.";
34
+ @return false;
35
+ }
36
+
37
+ @for $i from 1 through $desired-length {
38
+ $matrix: set-entry($matrix, $i $index, nth($column, $i));
39
+ }
40
+
41
+ @return $matrix;
42
+ }
@@ -0,0 +1,19 @@
1
+ // Assign `$value` at `$matrix[$coords[1], $coords[2]]`
2
+ // --------------------------------------------------------------------------------
3
+ // @require `_valid-coords`
4
+ // --------------------------------------------------------------------------------
5
+ // @param $matrix: matrix to update
6
+ // @param $coords: (x y) coordinates
7
+ // @param $value: value to assign at $matrix[$x, $y]
8
+ // --------------------------------------------------------------------------------
9
+ // @return matrix
10
+
11
+ @function set-entry($matrix, $coords, $value) {
12
+ @if length($coords) == 1 {
13
+ $coords: ($coords $coords);
14
+ }
15
+ @if _valid-coords($coords, $matrix) {
16
+ @return set-nth($matrix, nth($coords, 1), set-nth(nth($matrix, nth($coords, 1)), nth($coords, 2), $value));
17
+ }
18
+ @return false;
19
+ }
@@ -0,0 +1,37 @@
1
+ // Set `$row` at `$index` in `$matrix`
2
+ // --------------------------------------------------------------------------------
3
+ // @require `columns`
4
+ // @require `rows`
5
+ // --------------------------------------------------------------------------------
6
+ // @param $matrix: matrix
7
+ // @param $row: row
8
+ // @param $index: index
9
+ // --------------------------------------------------------------------------------
10
+ // @return matrix
11
+
12
+ @function set-row($matrix, $index, $row: ()) {
13
+ $desired-length: columns($matrix);
14
+
15
+ @if type-of($index) != number {
16
+ @warn "Invalid row index.";
17
+ @return false;
18
+ }
19
+
20
+ @if abs($index) > rows($matrix) {
21
+ @warn "Out of bound row index.";
22
+ @return false;
23
+ }
24
+
25
+ @if $row == () {
26
+ @for $i from 1 through $desired-length {
27
+ $row: append($row, 0);
28
+ }
29
+ }
30
+
31
+ @if length($row) != $desired-length {
32
+ @warn "Wrong length for new row; should be #{$desired-length}.";
33
+ @return false;
34
+ }
35
+
36
+ @return set-nth($matrix, $index, $row);
37
+ }
@@ -0,0 +1,32 @@
1
+ // Swaps columns `$c1` and `$c2` from `$matrix`
2
+ // --------------------------------------------------------------------------------
3
+ // @require `rows`
4
+ // @require `columns`
5
+ // @require `get-entry`
6
+ // @require `set-entry`
7
+ // --------------------------------------------------------------------------------
8
+ // @param $matrix: matrix
9
+ // @param $c1: index of column 1
10
+ // @param $c2: index of column 2
11
+ // --------------------------------------------------------------------------------
12
+ // @return $matrix
13
+
14
+ @function swap-columns($matrix, $c1, $c2) {
15
+ @if type-of($c1) != number or type-of($c2) != number {
16
+ @warn "Invalid column index.";
17
+ @return false;
18
+ }
19
+
20
+ @if abs($c1) > columns($matrix) or abs($c2) > columns($matrix) {
21
+ @warn "Out of bounds column index.";
22
+ @return false;
23
+ }
24
+
25
+ @for $i from 1 through rows($matrix) {
26
+ $tmp: get-entry($matrix, ($i $c1));
27
+ $matrix: set-entry($matrix, ($i $c1), get-entry($matrix, ($i $c2)));
28
+ $matrix: set-entry($matrix, ($i $c2), $tmp);
29
+ }
30
+
31
+ @return $matrix;
32
+ }
@@ -0,0 +1,20 @@
1
+ // Swaps entries `$e1` and `$e2` from `$matrix`
2
+ // --------------------------------------------------------------------------------
3
+ // @require `_valid-coords`
4
+ // @require `get-entry`
5
+ // @require `set-entry`
6
+ // --------------------------------------------------------------------------------
7
+ // @param $matrix: matrix
8
+ // @param $e1: (x y) coordinates of first entry
9
+ // @param $e2: (x y) coordinates of second entry
10
+ // --------------------------------------------------------------------------------
11
+ // @return $matrix
12
+
13
+ @function swap-entries($matrix, $e1, $e2) {
14
+ @if _valid-coords($e1, $matrix) and _valid-coords($e2, $matrix) {
15
+ $tmp: get-entry($matrix, $e1);
16
+ $matrix: set-entry(set-entry($matrix, $e1, get-entry($matrix, $e2)), $e2, $tmp);
17
+ @return $matrix;
18
+ }
19
+ @return false;
20
+ }
@@ -0,0 +1,24 @@
1
+ // Swaps rows `$r1` and `$r2` from `$matrix`
2
+ // --------------------------------------------------------------------------------
3
+ // @require `rows`
4
+ // --------------------------------------------------------------------------------
5
+ // @param $matrix: matrix
6
+ // @param $r1: index of row 1
7
+ // @param $r2: index of row 2
8
+ // --------------------------------------------------------------------------------
9
+ // @return $matrix
10
+
11
+ @function swap-rows($matrix, $r1, $r2) {
12
+ @if type-of($r1) != number or type-of($r2) != number {
13
+ @warn "Invalid row index.";
14
+ @return false;
15
+ }
16
+
17
+ @if abs($r1) > rows($matrix) or abs($r2) > rows($matrix) {
18
+ @warn "Out of bounds row index.";
19
+ @return false;
20
+ }
21
+
22
+ $tmp: nth($matrix, $r1);
23
+ @return set-nth(set-nth($matrix, $r1, nth($matrix, $r2)), $r2, $tmp);
24
+ }
@@ -0,0 +1,103 @@
1
+ // Displaying matrix
2
+ // @dep: none
3
+ @import "functions/misc/display";
4
+
5
+ // Getting number of rows in matrix
6
+ // @dep: none
7
+ @import "functions/misc/rows";
8
+
9
+ // Getting number of columns in matrix
10
+ // @dep: none
11
+ @import "functions/misc/columns";
12
+
13
+ // Validate coordinates pairs
14
+ // @dep: none
15
+ @import "functions/helpers/valid-coords";
16
+
17
+ // Creating a matrix
18
+ // @dep: `_valid-coords`
19
+ @import "functions/init/matrix";
20
+
21
+ // Assigning values to matrix
22
+ // @dep: `_valid-coords`
23
+ @import "functions/setters/set-entry";
24
+
25
+ // Reading values from matrix
26
+ // @dep: `_valid-coords`
27
+ @import "functions/getters/get-entry";
28
+
29
+ // Reading values from matrix
30
+ // @dep: `rows`
31
+ @import "functions/getters/get-row";
32
+
33
+ // Swapper two rows from matrix
34
+ // @dep: `rows`
35
+ @import "functions/swap/swap-rows";
36
+
37
+ // Assigning values to matrix
38
+ // @dep: `rows`, `columns`
39
+ @import "functions/setters/set-row";
40
+
41
+ // Checking if matrix is square
42
+ // @dep: `rows`, `columns`
43
+ @import "functions/checkers/is-square";
44
+
45
+ // Transpose a matrix
46
+ // @dep: `columns`, `swap-rows`
47
+ @import "functions/setters/add-row";
48
+
49
+ // Transpose a matrix
50
+ // @dep: `rows`, `swap-columns`
51
+ @import "functions/setters/add-column";
52
+
53
+ // Assigning values to matrix
54
+ // @dep: `rows`, `columns`, `set-entry`
55
+ @import "functions/setters/set-column";
56
+
57
+ // Reading values from matrix
58
+ // @dep: `rows`, `columns`, `get-entry`
59
+ @import "functions/getters/get-column";
60
+
61
+ // Checking if all values from matrix are numbers
62
+ // @dep: `rows`, `columns`, `get-entry`
63
+ @import "functions/checkers/is-numeric";
64
+
65
+ // Checking if matrix is diagonal
66
+ // @dep: `rows`, `columns`, `get-entry`
67
+ @import "functions/checkers/is-diagonal";
68
+
69
+ // Is triangular helper
70
+ // @dep: `rows`, `columns`, `get-entry`
71
+ @import "functions/helpers/is-triangular";
72
+
73
+ // Creating a matrix with diagonal filled
74
+ // @dep: `matrix`, `_valid-coords`, `set-entry`
75
+ @import "functions/init/unit-matrix";
76
+
77
+ // Swapping two values from matrix
78
+ // @dep: `_valid-coords`, `get-entry`, `set-entry`
79
+ @import "functions/swap/swap-entries";
80
+
81
+ // Swapper two columns from matrix
82
+ // @dep: `rows`, `columns`, `get-entry`, `set-entry`
83
+ @import "functions/swap/swap-columns";
84
+
85
+ // Checking if matrix is diagonal
86
+ // @dep: `rows`, `columns`, `get-entry`, `_is-triangular`
87
+ @import "functions/checkers/is-upper-triangular";
88
+
89
+ // Checking if matrix is diagonal
90
+ // @dep: `rows`, `columns`, `get-entry`, `_is-triangular`
91
+ @import "functions/checkers/is-lower-triangular";
92
+
93
+ // Add two matrices
94
+ // @dep: `rows`, `columns`, `get-entry`, `set-entry`
95
+ @import "functions/misc/add-matrices";
96
+
97
+ // Transpose a matrix
98
+ // @dep: `rows`, `columns`, `get-entry`, `set-entry`
99
+ @import "functions/misc/transpose";
100
+
101
+ // Displaying matrix
102
+ // @dep: `is-square`, `transpose`
103
+ @import "functions/checkers/is-symmetric";
metadata ADDED
@@ -0,0 +1,77 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: SassyMatrix
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Hugo Giraudel
9
+ - Fabrice Weinberg
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2014-01-23 00:00:00.000000000 Z
14
+ dependencies: []
15
+ description: Sass API for matrices
16
+ email:
17
+ - hugo.giraudel@gmail.com
18
+ - fabrice@weinberg.me
19
+ executables: []
20
+ extensions: []
21
+ extra_rdoc_files: []
22
+ files:
23
+ - README.md
24
+ - CHANGELOG.md
25
+ - lib/SassyMatrix.rb
26
+ - stylesheets/functions/checkers/_is-diagonal.scss
27
+ - stylesheets/functions/checkers/_is-lower-triangular.scss
28
+ - stylesheets/functions/checkers/_is-numeric.scss
29
+ - stylesheets/functions/checkers/_is-square.scss
30
+ - stylesheets/functions/checkers/_is-symmetric.scss
31
+ - stylesheets/functions/checkers/_is-upper-triangular.scss
32
+ - stylesheets/functions/getters/_get-column.scss
33
+ - stylesheets/functions/getters/_get-entry.scss
34
+ - stylesheets/functions/getters/_get-row.scss
35
+ - stylesheets/functions/helpers/_is-triangular.scss
36
+ - stylesheets/functions/helpers/_valid-coords.scss
37
+ - stylesheets/functions/init/_matrix.scss
38
+ - stylesheets/functions/init/_unit-matrix.scss
39
+ - stylesheets/functions/misc/_add-matrices.scss
40
+ - stylesheets/functions/misc/_columns.scss
41
+ - stylesheets/functions/misc/_display.scss
42
+ - stylesheets/functions/misc/_rows.scss
43
+ - stylesheets/functions/misc/_transpose.scss
44
+ - stylesheets/functions/setters/_add-column.scss
45
+ - stylesheets/functions/setters/_add-row.scss
46
+ - stylesheets/functions/setters/_set-column.scss
47
+ - stylesheets/functions/setters/_set-entry.scss
48
+ - stylesheets/functions/setters/_set-row.scss
49
+ - stylesheets/functions/swap/_swap-columns.scss
50
+ - stylesheets/functions/swap/_swap-entries.scss
51
+ - stylesheets/functions/swap/_swap-rows.scss
52
+ - stylesheets/matrix.scss
53
+ homepage: https://github.com/HugoGiraudel/SassyMatrix/
54
+ licenses: []
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ required_rubygems_version: !ruby/object:Gem::Requirement
66
+ none: false
67
+ requirements:
68
+ - - ! '>='
69
+ - !ruby/object:Gem::Version
70
+ version: 1.3.6
71
+ requirements: []
72
+ rubyforge_project: SassyMatrix
73
+ rubygems_version: 1.8.24
74
+ signing_key:
75
+ specification_version: 3
76
+ summary: SassyMatrix is a Sass-powered API for matrices.
77
+ test_files: []