Skip to content

Instantly share code, notes, and snippets.

@KittyGiraudel
Last active August 29, 2015 14:12
Show Gist options
  • Select an option

  • Save KittyGiraudel/a23f71cf785bf555c6ed to your computer and use it in GitHub Desktop.

Select an option

Save KittyGiraudel/a23f71cf785bf555c6ed to your computer and use it in GitHub Desktop.
Generated by SassMeister.com.
// ----
// Sass (v3.4.9)
// Compass (v1.0.1)
// ----
/// Map of existing generators
/// @access private
$__generators__: () !global;
/// Current generator stored in `generator`
/// @access private
$__current__: null !global;
/// Initialize a new generator
/// @access public
/// @param {String} $name - generator's name
/// @content - `yield` directives
/// @require $__generators__
/// @require $__current__
@mixin generator($name) {
$__current__: $name !global;
$__generators__: map-merge($__generators__, ($__current__: (
'values': (),
'position': 0
))) !global;
@content;
$__current__: null !global;
}
/// Yield a new value for the generator
/// @param {*} $value
/// @require $__generators__
/// @require $__current__
@mixin yield($value) {
@if $__current__ == null {
@error "You cannot yield outside of a generator.";
}
$current: map-get($__generators__, $__current__);
$current: map-merge($current, ('values': append(map-get($current, 'values'), $value)));
$__generators__: map-merge($__generators__, ($__current__: $current)) !global;
}
/// Return next value for generator
/// @param {String} $name
/// @require $__generators__
/// @throw Unknown $generator `#{$generator}`.
@function generator-next($name) {
$generator: map-get($__generators__, $name);
@if $generator == null {
@error "Unknown $generator `#{$generator}`.";
}
$position: map-get($generator, 'position') + 1;
$values: map-get($generator, 'values');
$done: $position > length($values);
$__generators__: map-merge($__generators__, ($name: map-merge($generator, ('position': $position)))) !global;
@return (
'done': $done,
'value': if($done, null, nth($values, $position))
);
}
/// Check whether an generator is still valid
/// @param {String} $name
/// @require $__generators__
/// @throw Unknown $generator `#{$generator}`.
@function generator-valid($name) {
$generator: map-get($__generators__, $name);
@if $generator == null {
@error "Unknown $generator `#{$generator}`.";
}
@return map-get($generator, 'position') < length(map-get($generator, 'values'));
}
/// Reset an generator
/// @param {String} $name
/// @require $__generators__
/// @throw Unknown $generator `#{$generator}`.
@mixin generator-rewind($name) {
$generator: map-get($__generators__, $name);
@if $generator == null {
@error "Unknown $generator `#{$generator}`.";
}
$__generators__: map-merge($__generators__, ($name: map-merge($generator, ('position': 0)))) !global;
}
// Test
@include generator('foo') {
@each $item in 1 2 3 4 5 {
@include yield($item * $item);
}
}
.test {
@while generator-valid('foo') {
content: inspect(generator-next('foo'));
}
content: inspect(generator-next('foo')); // Done
}
@include generator-rewind('foo');
.test {
@while generator-valid('foo') {
content: inspect(generator-next('foo'));
}
content: inspect(generator-next('foo')); // Done
}
.test {
content: ("done": false, "value": 1);
content: ("done": false, "value": 4);
content: ("done": false, "value": 9);
content: ("done": false, "value": 16);
content: ("done": false, "value": 25);
content: ("done": true, "value": null);
}
.test {
content: ("done": false, "value": 1);
content: ("done": false, "value": 4);
content: ("done": false, "value": 9);
content: ("done": false, "value": 16);
content: ("done": false, "value": 25);
content: ("done": true, "value": null);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment