-
-
Save lunelson/7367645 to your computer and use it in GitHub Desktop.
// ---- | |
// Sass (v3.3.0.rc.1) | |
// Compass (v0.13.alpha.10) | |
// ---- | |
/* | |
Using the unique-id() function to store temporary data in a global map | |
as a means to pass information to sub-routine mixins and back again | |
*/ | |
// utility function for nested map-getting | |
@function get-n($map, $keys...) { | |
@each $key in $keys { @if $map == null { @return null; } @else { $map: map-get($map, $key); } } | |
@return $map; } | |
// a global map/hash/object to store temporary data | |
$global: (); | |
// a sub-mixin which processes input data and pushes it to global under key 'id' | |
@mixin sub-mix($id, $data) { | |
$alpha: get-n($data, $id, alpha); | |
$beta: get-n($data, $id, beta); | |
$data: map-merge($data, (#{$id}: ( | |
alpha: $alpha * 2, | |
beta: $beta * 2, | |
gamma: 20 | |
))); | |
$global: map-merge($global, $data); | |
} | |
// a mixin which sends data to submixin then retrieves result via id from global | |
@mixin main-mix($alpha, $beta) { | |
$id: unique-id(); | |
$data: (#{$id}: ( | |
// create whatever here | |
alpha: $alpha, | |
beta: $beta | |
)); | |
@include sub-mix($id, $data); | |
$data: get-n($global, $id); | |
debug: inspect($data); | |
} | |
.debug { | |
@include main-mix(2,3); | |
} |
/* | |
Using the unique-id() function to store temporary data in a global map | |
as a means to pass information to sub-routine mixins and back again | |
*/ | |
.debug { | |
debug: (alpha: 4, beta: 6, gamma: 20); | |
} |
Actually iterative get()
function, to be more precise ;)
SM live view here http://sassmeister.com/gist/7367645
Interesting. What's the advantage of this approach over passing the map to a function, and returning the altered map?
Also, I like your get-n
. I built something similar I was calling sub-get
. I'd be really interested in a sub-merge
or merge-n
, allowing you to easily alter nested maps. Have any ideas on that one? :)
@ericam to follow up on this, I built a set of functions that do nested merging and setting in such a way that they can also transparently replace the native ones (argument parsing handles regular or nested cases). I built them as a recreation of map functionality for libsass using lists, but will also do a ruby sass native-maps version.
A basic example of using a global map to pass data from a sub-mixin back to a parent mixin. What it lacks is a good function packing individual variables back up in to a map again, which I think they tried to do but failed (see issue: sass/sass#1000). Also it would benefit from recursive
merge()
function which I tried to write but haven't managed yet. Included at the top however is a recursiveget()
function