sass-aleksi 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +44 -0
  3. data/lib/sass-aleksi.rb +31 -0
  4. data/stylesheets/_aleksi.scss +23 -0
  5. data/stylesheets/aleksi/_colors.scss +0 -0
  6. data/stylesheets/aleksi/_config.scss +11 -0
  7. data/stylesheets/aleksi/_general.scss +11 -0
  8. data/stylesheets/aleksi/_lengths.scss +8 -0
  9. data/stylesheets/aleksi/_lists.scss +16 -0
  10. data/stylesheets/aleksi/_maps.scss +21 -0
  11. data/stylesheets/aleksi/_math.scss +10 -0
  12. data/stylesheets/aleksi/_sides.scss +11 -0
  13. data/stylesheets/aleksi/config/_constants.scss +73 -0
  14. data/stylesheets/aleksi/general/_apply.scss +42 -0
  15. data/stylesheets/aleksi/general/_css-rule.scss +88 -0
  16. data/stylesheets/aleksi/general/_default-to.scss +35 -0
  17. data/stylesheets/aleksi/general/_is-of-type.scss +72 -0
  18. data/stylesheets/aleksi/general/_throw.scss +125 -0
  19. data/stylesheets/aleksi/lengths/_convert.scss +100 -0
  20. data/stylesheets/aleksi/lengths/_strip-unit.scss +37 -0
  21. data/stylesheets/aleksi/lists/_contained-in.scss +34 -0
  22. data/stylesheets/aleksi/lists/_depth.scss +46 -0
  23. data/stylesheets/aleksi/lists/_get-nth.scss +44 -0
  24. data/stylesheets/aleksi/lists/_is-list.scss +35 -0
  25. data/stylesheets/aleksi/lists/_list-filter.scss +48 -0
  26. data/stylesheets/aleksi/lists/_next.scss +47 -0
  27. data/stylesheets/aleksi/lists/_prepend.scss +40 -0
  28. data/stylesheets/aleksi/lists/_previous.scss +47 -0
  29. data/stylesheets/aleksi/lists/_set-list-separator.scss +173 -0
  30. data/stylesheets/aleksi/lists/_walk.scss +96 -0
  31. data/stylesheets/aleksi/lists/_wrap-in-list.scss +42 -0
  32. data/stylesheets/aleksi/maps/_debug-map.scss +39 -0
  33. data/stylesheets/aleksi/maps/_is-map.scss +31 -0
  34. data/stylesheets/aleksi/maps/_map-clean.scss +45 -0
  35. data/stylesheets/aleksi/maps/_map-depth.scss +46 -0
  36. data/stylesheets/aleksi/maps/_map-extend.scss +50 -0
  37. data/stylesheets/aleksi/maps/_map-filter.scss +84 -0
  38. data/stylesheets/aleksi/maps/_map-find.scss +95 -0
  39. data/stylesheets/aleksi/maps/_map-get-tuple.scss +33 -0
  40. data/stylesheets/aleksi/maps/_map-has-keys.scss +92 -0
  41. data/stylesheets/aleksi/maps/_map-merge-deep.scss +54 -0
  42. data/stylesheets/aleksi/maps/_map-select.scss +56 -0
  43. data/stylesheets/aleksi/maps/_map-sort.scss +125 -0
  44. data/stylesheets/aleksi/maps/_map-unique.scss +46 -0
  45. data/stylesheets/aleksi/maps/_map-walk.scss +79 -0
  46. data/stylesheets/aleksi/maps/_map-zip.scss +64 -0
  47. data/stylesheets/aleksi/math/_add.scss +66 -0
  48. data/stylesheets/aleksi/math/_divide.scss +66 -0
  49. data/stylesheets/aleksi/math/_multiply.scss +66 -0
  50. data/stylesheets/aleksi/math/_subtract.scss +66 -0
  51. data/stylesheets/aleksi/sides/_output-sides.scss +71 -0
  52. data/stylesheets/aleksi/sides/_reduce-sides.scss +74 -0
  53. data/stylesheets/aleksi/sides/_side-name.scss +48 -0
  54. data/stylesheets/aleksi/sides/_side-value.scss +83 -0
  55. data/stylesheets/aleksi/sides/_sides-shorthand.scss +64 -0
  56. data/stylesheets/aleksi/sides/_to-sides-list.scss +63 -0
  57. data/stylesheets/aleksi/sides/_to-sides-map.scss +57 -0
  58. metadata +199 -0
@@ -0,0 +1,96 @@
1
+ // =============================================================================
2
+ // =ALEKSI - WALK
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-lists
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "SassyLists";
9
+ @import "aleksi/general/throw";
10
+ @import "aleksi/maps/map-walk";
11
+ @import "aleksi/lists/set-list-separator";
12
+
13
+ // =walk( $list, $func[, $args... ])
14
+ // -----------------------------------------------------------------------------
15
+ /// Applies the given function to each value inside a list, arglist or a map.
16
+ /// **Note**: SassyLists offers the similar `sl-walk()` function. The difference
17
+ /// is that Aleksi's `walk()` function will delegate to `map-walk()` when the
18
+ /// first argument is a map.
19
+ /// **Note**: When passed a simple value (not a list, arglist or map), it will
20
+ /// apply the function to it and return the result inside a single item list.
21
+ ///
22
+ /// @param {list|map} $list [default] - The values to walk over.
23
+ /// @param {string} $func - The name of the function to apply to each value.
24
+ /// @param {arglist} $args... - Additional arguments passed to '$func`.
25
+ ///
26
+ /// @return {list|map} - The list, arglist or map with modified values.
27
+ /// @throw Warning when walking over a simple value.
28
+ ///
29
+ /// @example scss
30
+ /// $foo: map-walk(('foo': 'bar', 'bar': 'baz'), 'to-upper-case');
31
+ /// // => ('foo': 'BAR', 'bar': 'BAZ')
32
+ /// $bar: list-walk('foo' 'bar' 'baz', 'to-upper-case');
33
+ /// // => 'FOO' 'BAR' 'BAZ'
34
+ /// $baz: list-walk('foo', 'to-upper-case');
35
+ /// // => 'FOO'
36
+ ///
37
+ /// @access public
38
+ /// @since 0.1.0
39
+
40
+ @function walk( $list, $func, $args... )
41
+ {
42
+ @if type-of($list) == 'map' {
43
+ @return map-walk($list, $func, $args...);
44
+ }
45
+
46
+ @else if is-list($list) {
47
+ @return list-walk($list, $func, $args...);
48
+ }
49
+
50
+ $w: throw-warning("Walking over a simple value #{inspect($list)} — resulting value will be returned inside a list.");
51
+ @return call($func, $list, $args...);
52
+ }
53
+
54
+ // =list-walk( $list, $func[, $args... ])
55
+ // -----------------------------------------------------------------------------
56
+ /// Applies the given function to each value inside a list or arglist or a map.
57
+ /// **Note**: SassyLists offers the similar `sl-walk()` function but it throws
58
+ /// an wrong-type error in Libsass when passing a function that only accepts one
59
+ /// argument and an empty arglist as third parameter.
60
+ ///
61
+ /// @param {list} $list [default] - The list of values to walk over.
62
+ /// @param {string} $func - The name of the function to apply to each value.
63
+ /// @param {arglist} $args... - Additional arguments passed to '$func`.
64
+ ///
65
+ /// @return {list|map} - The list, arglist or map with modified values.
66
+ /// @throw Error if `$value` is not a list.
67
+ /// @throw Warning when walking over a simple value.
68
+ ///
69
+ /// @example scss
70
+ /// $foo: map-walk(('foo': 'bar', 'bar': 'baz'), 'to-upper-case');
71
+ /// // => ('foo': 'BAR', 'bar': 'BAZ')
72
+ /// $bar: list-walk('foo' 'bar' 'baz', 'to-upper-case');
73
+ /// // => 'FOO' 'BAR' 'BAZ'
74
+ /// $baz: list-walk('foo', 'to-upper-case');
75
+ /// // => 'FOO'
76
+ ///
77
+ /// @access public
78
+ /// @since 0.1.0
79
+
80
+ @function list-walk( $list, $func, $args... )
81
+ {
82
+ @if not is-list($list) {
83
+ $e: throw-error("list-walk():: $list must be a list, was #{inspect($list)}.");
84
+ }
85
+
86
+ $sep: list-separator($list);
87
+ $res: ();
88
+
89
+ @each $item in $list {
90
+ $new: if( length($args) == 0, call($func, $item), call($func, $item, $args...) );
91
+ $res: append($res, $new);
92
+ }
93
+
94
+ // keep original list separator
95
+ @return set-list-separator($res, $sep);
96
+ }
@@ -0,0 +1,42 @@
1
+ // =============================================================================
2
+ // =ALEKSI - WRAP-IN-LIST
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-lists
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "aleksi/lists/set-list-separator";
9
+
10
+ // =wrap-in-list( $value[, $separator ])
11
+ // -----------------------------------------------------------------------------
12
+ /// Wraps any value inside a single-item list.
13
+ /// **Note**: contrary to SassyCast's `to-list()` function, maps won't be
14
+ /// transformed into lists, and lists will get nested.
15
+ ///
16
+ /// @param {any} $value - The value to wrap inside a list.
17
+ /// @param {string} $separator ['space'] - The separator type the list should use.
18
+ ///
19
+ /// @return {list} - A single item list with `$value` inside, and using `$separator`.
20
+ ///
21
+ /// @example scss
22
+ /// $foo: wrap-in-list(10);
23
+ /// // => 10
24
+ /// type-of($foo);
25
+ /// // => list
26
+ /// $bar: wrap-in-list('foo' 'bar');
27
+ /// // => 'foo' 'bar'
28
+ /// length($bar);
29
+ /// // => 1
30
+ /// $baz: wrap-in-list( ('a': 'foo', 'b': 'bar') );
31
+ /// // => ('a': 'foo', 'b': 'bar')
32
+ /// type-of($baz);
33
+ /// // => list
34
+ ///
35
+ /// @access public
36
+ /// @since 0.1.0
37
+
38
+ @function wrap-in-list( $value, $separator: 'space' )
39
+ {
40
+ $value: ($value,);
41
+ @return if($separator == 'space', to-space-list($value), $value);
42
+ }
@@ -0,0 +1,39 @@
1
+ // =============================================================================
2
+ // =ALEKSI - DEBUG-MAP
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-maps
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "aleksi/maps/map-depth";
9
+
10
+ // =debug-map( $map )
11
+ // -----------------------------------------------------------------------------
12
+ /// Prints out the given map's contents and useful information for debugging
13
+ /// purposes.
14
+ /// @author [Hugo Giraudel](http://hugogiraudel.com)
15
+ ///
16
+ /// @param {map} $map - The map to print out.
17
+ ///
18
+ /// @throw Error if `$map` is not a map.
19
+ ///
20
+ /// @access public
21
+ /// @since 0.1.0
22
+
23
+ @mixin debug-map( $map )
24
+ {
25
+ @at-root {
26
+ @debug-map {
27
+ __toString__: inspect($map);
28
+ __length__: length($map);
29
+ __depth__: map-depth($map);
30
+ __keys__: map-keys($map);
31
+ __properties__ {
32
+ @each $key, $value in $map {
33
+ $key-str: '(#{type-of($value)})-#{$key}';
34
+ #{$key-str}: inspect($value);
35
+ }
36
+ }
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,31 @@
1
+ // =============================================================================
2
+ // =ALEKSI - IS-MAP
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-maps
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ // =is-map( $value )
9
+ // -----------------------------------------------------------------------------
10
+ /// Verifies if the given value is a map. Also accepts `()`, contrary to testing
11
+ /// manually `type-of(()) == map`.
12
+ ///
13
+ /// @param {any} $value - The value to test.
14
+ ///
15
+ /// @return {bool} - Whether `$value` is a map.
16
+ ///
17
+ /// @example scss
18
+ /// $foo: is-map(('a': 10, 'b': 'foo'));
19
+ /// // => true
20
+ /// $bar: is-map(());
21
+ /// // => true
22
+ /// $baz: is-map('a' 10 'b' 'foo');
23
+ /// // => false
24
+ ///
25
+ /// @access public
26
+ /// @since 0.1.0
27
+
28
+ @function is-map( $value )
29
+ {
30
+ @return (type-of($value) == map or $value == ());
31
+ }
@@ -0,0 +1,45 @@
1
+ // =============================================================================
2
+ // =ALEKSI - MAP-CLEAN
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-maps
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "aleksi/general/throw";
9
+ @import "aleksi/maps/is-map";
10
+
11
+ // =map-clean( $map )
12
+ // -----------------------------------------------------------------------------
13
+ /// Removes all falsy values from a map.
14
+ /// **Note**: if all item shave been removed, it will return `()` to act like
15
+ /// all other map filtering functions (emptying a list with `map-remove()` would
16
+ /// normally return a *real* empty map ``);
17
+ ///
18
+ /// @param {map} $map - The map to clean.
19
+ ///
20
+ /// @return {map} - A new map, without falsy values.
21
+ /// @throw Error if `$map` is not a map.
22
+ ///
23
+ /// @example scss
24
+ /// $foo: map-clean( ('a': 10, 'b': false, 'c': 'foo', 'd': null) );
25
+ /// // => ('a': 10, 'c': 'foo')
26
+ ///
27
+ /// @access public
28
+ /// @since 0.1.0
29
+
30
+ @function map-clean( $map )
31
+ {
32
+ @if not is-map($map) {
33
+ @return throw-error('map-clean():: $map must be a map. Was #{inspect($map)}');
34
+ }
35
+
36
+ @each $key, $value in $map {
37
+ @if not $value {
38
+ $map: map-remove($map, $key);
39
+ }
40
+ }
41
+
42
+ // return the empty map `()` instead of `` if all map
43
+ // items have been remove.
44
+ @return if(length($map) == 0, (), $map);
45
+ }
@@ -0,0 +1,46 @@
1
+ // =============================================================================
2
+ // =ALEKSI - MAP-DEPTH
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-maps
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "aleksi/general/throw";
9
+ @import "aleksi/maps/is-map";
10
+
11
+ // =map-depth( $map )
12
+ // -----------------------------------------------------------------------------
13
+ /// Returns the depth level of a given map.
14
+ /// @author [Hugo Giraudel](http://hugogiraudel.com)
15
+ ///
16
+ /// @param {map} $map - The map to analyze.
17
+ ///
18
+ /// @return {number} - The depth of `$map`.
19
+ /// @throw Error if `$map` is not a map.
20
+ ///
21
+ /// @example scss
22
+ /// $foo: map-depth( ('a': 'foo', 'b': ( 'ba': 'bar', 'bb': 'baz' )));
23
+ /// // => 2
24
+ /// $bar: map-depht('a': 'foo', 'b': 'bar', 'c': 'baz');
25
+ /// // => 1
26
+ ///
27
+ ///
28
+ /// @access public
29
+ /// @since 0.1.0
30
+
31
+ @function map-depth( $map )
32
+ {
33
+ @if not is-map($map) {
34
+ @return throw-error('map-depth():: $map must be a map, was #{inspect($map)}.');
35
+ }
36
+
37
+ $lvl: 1;
38
+
39
+ @each $key, $val in $map {
40
+ @if type-of($val) == 'map' {
41
+ $lvl: max(map-depth($val) + 1, $lvl);
42
+ }
43
+ }
44
+
45
+ @return $lvl;
46
+ }
@@ -0,0 +1,50 @@
1
+ // =============================================================================
2
+ // =ALEKSI - MAP-EXTEND
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-maps
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "SassyLists";
9
+ @import "aleksi/general/throw";
10
+ @import "aleksi/maps/is-map";
11
+ @import "aleksi/maps/map-merge-deep";
12
+
13
+ // =map-extend( $maps... )
14
+ // -----------------------------------------------------------------------------
15
+ /// Merges the given maps successively. Allows to merge more then two maps
16
+ /// together.
17
+
18
+ @function map-extend( $maps... )
19
+ {
20
+ @if length($maps) < 2 {
21
+ $e: throw-warning('map-extend():: trying to extend one map only. Returning the map as is.');
22
+ @return $nth($maps, 1);
23
+ }
24
+
25
+ $res: nth($maps, 1);
26
+ @each $map in sl-slice($maps, 2) {
27
+ $res: map-merge($res, $map);
28
+ }
29
+
30
+ @return $res;
31
+ }
32
+
33
+ // =map-extend-deep( $maps... )
34
+ // -----------------------------------------------------------------------------
35
+
36
+ @function map-extend-deep( $maps... )
37
+ {
38
+ @if length($maps) < 2 {
39
+ $e: throw-warning('map-extend-deep():: trying to extend one map only. Returning the map as is.');
40
+ @return $nth($maps, 1);
41
+ }
42
+
43
+ $res: nth($maps, 1);
44
+
45
+ @each $map in sl-slice($maps, 2) {
46
+ $res: map-merge-deep($res, $map);
47
+ }
48
+
49
+ @return $res;
50
+ }
@@ -0,0 +1,84 @@
1
+ // =============================================================================
2
+ // =ALEKSI - MAP-FILTER
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-maps
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "sassy-maps";
9
+ @import "aleksi/general/throw";
10
+ @import "aleksi/maps/is-map";
11
+
12
+ // =map-filter( $map, $test, $args... )
13
+ // -----------------------------------------------------------------------------
14
+ /// Removes items in a map with a value that doesn't pass a given test function.
15
+ /// **Note**: to pass the test, the test function must return a truethy value —
16
+ /// not per se the boolean `true`.
17
+ ///
18
+ /// @param {map} $map - The map with the item values to test.
19
+ /// @param {string} $test - The name of the test function to run on each item's value.
20
+ /// @param {arglist} $args... - Additional arguments for `$test`.
21
+ ///
22
+ /// @return {map} - `$map` without the items that didn't pass the `$test` function.
23
+ ///
24
+ /// @example scss
25
+ /// $foo: map-filter( ('foo': 10, 'bar': 5px, 'baz': 7, 'wiz' 3), 'unitless');
26
+ /// // => ('foo': 10, 'baz': 7, 'wiz': 3)
27
+ /// $bar: map-filter( ('foo': 10px, 'bar': 2%, 'baz': 4px, 'wiz': 8em), 'comparable', 1px);
28
+ /// // => ('foo': 10px, 'baz': 4px)
29
+ ///
30
+ /// @access public
31
+ /// @since 0.1.0
32
+
33
+ @function map-filter( $map, $test, $args... )
34
+ {
35
+ @if not is-map($map) {
36
+ @return throw-error('map-filter():: $map must be a map, was #{inspect($map)}.');
37
+ }
38
+
39
+ $res: ();
40
+
41
+ @each $key, $val in $map {
42
+ @if call($test, $val, $args...) {
43
+ $res: map-set($res, $key, $val);
44
+ }
45
+ }
46
+
47
+ @return $res;
48
+ }
49
+
50
+ // =map-filter-keys( $map, $test, $args... )
51
+ // -----------------------------------------------------------------------------
52
+ /// Removes items in a map with a key that doesn't pass a given test function.
53
+ /// **Note**: to pass the test, the test function must return a truethy value —
54
+ /// not per se the boolean `true`.
55
+ ///
56
+ /// @param {map} $map - The map with the item keys to test.
57
+ /// @param {string} $test - The name of the test function to run on each item's key.
58
+ /// @param {arglist} $args... - Additional arguments for `$test`.
59
+ ///
60
+ /// @return {map} - `$map` without the items that didn't pass the `$test` function.
61
+ ///
62
+ /// @example scss
63
+ /// $foo: map-filter( ('foo': 10, 'bar': 5px, 'baz': 7, 'wiz' 3), 'str-index', 'b');
64
+ /// // => ('bar': 5px, 'baz': 7)
65
+ ///
66
+ /// @access public
67
+ /// @since 0.1.0
68
+
69
+ @function map-filter-keys( $map, $test, $args... )
70
+ {
71
+ @if not is-map($map) {
72
+ @return throw-error('map-filter():: $map must be a map, was #{inspect($map)}.');
73
+ }
74
+
75
+ $res: ();
76
+
77
+ @each $key, $val in $map {
78
+ @if call($test, $key, $args...) {
79
+ $res: map-set($res, $key, $val);
80
+ }
81
+ }
82
+
83
+ @return $res;
84
+ }
@@ -0,0 +1,95 @@
1
+ // =============================================================================
2
+ // =ALEKSI - MAP-FIND
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-maps
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "aleksi/general/throw";
9
+ @import "aleksi/maps/is-map";
10
+
11
+ // =map-find-key( $map, $value )
12
+ // -----------------------------------------------------------------------------
13
+ /// Returns the key under which a given value is stored in a map. If the value
14
+ /// is found multiple times, the first key for it will be returned. Returns
15
+ /// `null` if the value wasn't found.
16
+ ///
17
+ /// @param {map} $map - The map to search in.
18
+ /// @param {any} $value - The value to search for.
19
+ ///
20
+ /// @return {string} - The first map's key under which `$value` is stored.
21
+ /// @throw Error if `$map` is not a map.
22
+ ///
23
+ /// @example scss
24
+ /// $foo: map-find('a': 10, 'b': 5, 'c': 3, 5);
25
+ /// // => 'b'
26
+ /// $bar: map-find('a': 10, 'b': 5, 'c': 3, 'd': 5, 5);
27
+ /// // => 'b'
28
+ ///
29
+ /// @access public
30
+ /// @since 0.1.0
31
+
32
+ @function map-find-key( $map, $value )
33
+ {
34
+ @if not is-map($map) {
35
+ @return throw-error('map-find-key():: $map must be a map, was #{inspect($map)}.');
36
+ }
37
+
38
+ @each $key, $val in $map {
39
+ @if $val == $value {
40
+ @return $key;
41
+ }
42
+ }
43
+
44
+ @return null;
45
+ }
46
+
47
+ // =map-find( $map, $value )
48
+ // -----------------------------------------------------------------------------
49
+ /// @alias map-find-key
50
+ ///
51
+ /// @access public
52
+ /// @since 0.1.0
53
+
54
+ @function map-find( $map, $value )
55
+ {
56
+ @return map-find-key($map, $value);
57
+ }
58
+
59
+ // =map-find-keys( $map, $value )
60
+ // -----------------------------------------------------------------------------
61
+ /// Returns a list with all the keys in a map that hold the given value.
62
+ ///
63
+ /// @param {map} $map - The map to search in.
64
+ /// @param {any} $value - The value to search for
65
+ ///
66
+ /// @return {list} - The list of keys that hold `$value` in `$map`.
67
+ /// @throw Error if `$map` is not a map.
68
+ ///
69
+ /// @example scss
70
+ /// $foo: map-find-keys( 'a': 'foo', 'b': 'bar', 'c': 'foo', 'd': 'baz', 'foo');
71
+ /// // => 'a' 'b'
72
+ /// $bar: map-find-keys( 'a': 'foo', 'b': 'bar', 'c': 'baz', 'foo');
73
+ /// // => 'a';
74
+ /// $bar-type: type-of($bar);
75
+ /// // => list
76
+ ///
77
+ /// @access public
78
+ /// @since 0.1.0
79
+
80
+ @function map-find-keys( $map, $value )
81
+ {
82
+ @if not is-map($map) {
83
+ @return throw-error('map-find-keys():: $map must be a map, was #{inspect($map)}.');
84
+ }
85
+
86
+ $keys: ();
87
+
88
+ @each $key, $val in $map {
89
+ @if $val == $value {
90
+ $keys: append($keys, $key);
91
+ }
92
+ }
93
+
94
+ @return $keys;
95
+ }
@@ -0,0 +1,33 @@
1
+ // =============================================================================
2
+ // =ALEKSI - MAP-GET-TUPLE
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-maps
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ // =map-get-tuple( $map, $key )
9
+ // -----------------------------------------------------------------------------
10
+ /// Retrieves a tuple (a key, value formatted as a map item) from a map. Returns
11
+ /// `null` if `$key` was not found in `$map`.
12
+ ///
13
+ /// @param {map} $map - The map in which to search for the tuple.
14
+ /// @param {string} $key - The key of the tuple to retreive.
15
+ ///
16
+ /// @return {map} - The `(key: value)` pair corresponding to `$key`.
17
+ /// @throw Error if `$map`is not a map.
18
+ ///
19
+ /// @example scss
20
+ /// $foo: map-get-tuple('a': 'foo', 'b': 'bar', 'a');
21
+ /// // => ('a': 'foo')
22
+ ///
23
+ /// @access public
24
+ /// @since 0.1.0
25
+
26
+ @function map-get-tuple( $map, $key )
27
+ {
28
+ @if not is-map($map) {
29
+ @return throw-error('map-get-tuple():: $map must be a map, was #{inspect($map)}.');
30
+ }
31
+
32
+ @return (#{$key}: map-get($map, $key));
33
+ }
@@ -0,0 +1,92 @@
1
+ // =============================================================================
2
+ // =ALEKSI - MAP-HAS-KEYS
3
+ // =============================================================================
4
+ ////
5
+ //// @group aleksi-maps
6
+ //// @author [Yoannis Jamar](http://yoannis.me)
7
+
8
+ @import "aleksi/general/throw";
9
+ @import "aleksi/maps/is-map";
10
+
11
+ // =map-has-keys( $map, $keys )
12
+ // -----------------------------------------------------------------------------
13
+ /// Tests if a map has all the given keys at first level.
14
+ /// @author [Hugo Giraudel](http://hugogiraudel.com)
15
+ ///
16
+ /// @param {map} $map - The map to search in for `$keys...`.
17
+ /// @param {list} $keys - The keys to search for.
18
+ ///
19
+ /// @return {bool} - Whether all keys were found in first level of `$map`.
20
+ /// @throw Error if `$map` is not a map.
21
+ ///
22
+ /// @example scss
23
+ /// $foo: map-has-keys( ('a': 'foo', 'b': 'bar', 'c': 'baz'), 'a', 'd');
24
+ /// // => false
25
+ /// $bar: map-has-keys( ('a': 'foo', 'b': 'bar', 'c': 'baz'), 'a', 'b');
26
+ /// // => true
27
+ ///
28
+ /// @access public
29
+ /// @since 0.1.0
30
+
31
+ @function map-has-keys($map, $keys)
32
+ {
33
+ @if not is-map($map) {
34
+ @return throw-error('map-has-keys():: $map must be a map, was #{inspect($map)}.');
35
+ }
36
+
37
+ @each $key in $keys {
38
+ @if not map-has-key($map, $key) {
39
+ @return false;
40
+ }
41
+ }
42
+
43
+ @return true;
44
+ }
45
+
46
+ // =map-has-deep-key($map, $keys...)
47
+ // -----------------------------------------------------------------------------
48
+ /// Tests if a map has all given keys nested within each other.
49
+ /// @author [Hugo Giraudel](http://hugogiraudel.com)
50
+ ///
51
+ /// @param {map} $map - The map to search in for `$keys...`.
52
+ /// @param {arglist} $keys - The keys to search for.
53
+ ///
54
+ /// @return {bool} - Whether `$map` has all `$keys` nested within each other.
55
+ /// @throw Error if `$map` is not a map.
56
+ ///
57
+ /// @example scss
58
+ /// $foo: map-has-deep-keys( ('a': 'foo', 'b': ('ba': 'bar', 'bb': 'baz')), 'a', 'b');
59
+ /// // => true
60
+ /// $bar: map-has-deep-keys( 'a': 'foo', 'b': 'bar', 'a', 'b')
61
+ ///
62
+ /// @access public
63
+ /// @since 0.1.0
64
+
65
+ @function map-has-deep-key($map, $keys...)
66
+ {
67
+ @if not is-map($map) {
68
+ @return throw-error('map-has-deep-key():: $map must be a map, was #{inspect($map)}.');
69
+ }
70
+
71
+ @each $key in $keys {
72
+ @if not map-has-key($map, $key) {
73
+ @return false;
74
+ }
75
+
76
+ $map: map-get($map, $key);
77
+ }
78
+
79
+ @return true;
80
+ }
81
+
82
+ // =map-has-nested-key( $map, $keys... )
83
+ // -----------------------------------------------------------------------------
84
+ /// @alias map-has-deep-key
85
+ ///
86
+ /// @access public
87
+ /// @since 0.1.0
88
+
89
+ @function map-has-nested-key( $map, $keys... )
90
+ {
91
+ @return map-has-deep-key($map, $keys...);
92
+ }