Skip to content

Instantly share code, notes, and snippets.

@davidkpiano
Created December 28, 2014 23:01
Show Gist options
  • Save davidkpiano/c59c2af98b1987064249 to your computer and use it in GitHub Desktop.
Save davidkpiano/c59c2af98b1987064249 to your computer and use it in GitHub Desktop.
Generated by SassMeister.com.
// ----
// Sass (v3.4.9)
// Compass (v1.0.1)
// SassyLists (v2.2.1)
// ----
// function fibonacci(){
// var fn1 = 1;
// var fn2 = 1;
// while (1){
// var current = fn2;
// fn2 = fn1;
// fn1 = fn1 + current;
// var reset = yield current;
// if (reset){
// fn1 = 1;
// fn2 = 1;
// }
// }
// }
@import "SassyLists";
$__static__: ();
$__generators__: ();
$__current__: false;
// These are just helpers.
@function pop($list) {
@return sl-remove-nth($list, 1);
}
@function get($map, $properties) {
$map: map-get($map, nth($properties, 1));
$properties: pop($properties);
@if not $map {
@return null;
}
@if length($properties) == 0 {
@return $map;
}
@return get($map, $properties);
}
@function set($map, $properties, $value) {
$property: nth($properties, 1);
$properties: pop($properties);
$child-map: map-get($map, $property);
@if not $child-map {
$child-map: ();
}
@if length($properties) == 0 {
@return map-merge($map, ($property: $value));
}
@return map-merge($map, ($property: set($child-map, $properties, $value)));
}
@function static($key, $value, $set: false) {
// Define static variables only if the variable doesn't exist
// OR if $set is true (as an override)
@if not map-has-key($__static__, $key) or $set {
$__static__: set($__static__, $key, $value) !global;
}
@return get($__static__, $key);
}
@function get-static($key) {
@return get($__static__, $key);
}
@function set-static($key, $value) {
@return static($key, $value, true);
}
@function gen-while($condition) {
$generator: get-generator();
$__generators__: set($__generators__, $__current__ loop-condition, $condition) !global;
@if $condition and get($generator, traversal) == get($generator, state) {
$__generators__: set($__generators__, $__current__ loop, get($generator, state)) !global;
@return true;
} @else {
$__generators__: set($__generators__, $__current__ loop, false) !global;
@return false;
}
}
@function gen-endwhile() {
$generator: get-generator();
$condition: get($generator, loop-condition);
@if $condition and get($generator, traversal) == get($generator, state) {
$__generators__: set($__generators__, $__current__ state, get($generator, loop)) !global;
}
@return true;
}
@function set-generator($name) {
$generator: (
state: 0,
traversal: 0,
loop: false,
done: false
);
@if not map-has-key($__generators__, $name) {
$__generators__: set($__generators__, $name, $generator) !global;
}
$__generators__: set($__generators__, $name traversal, 0) !global;
$__current__: $name !global;
@return $generator;
}
@function get-generator($name: $__current__) {
@return get($__generators__, $name);
}
@function yield($value) {
$generator: get-generator();
// Do not yield specified value until traversal and state are equal
$yield-value: get($generator, value);
@if get($generator, traversal) == get($generator, state) {
$__generators__: set($__generators__, $__current__ value, $value) !global;
$yield-value: $value;
}
$__generators__: set(
$__generators__,
$__current__ traversal,
get($generator, traversal) + 1) !global;
@return $yield-value;
}
@function generate-next($name: $__current__) {
$iterate-generator: call($name);
$generator: get-generator($name);
$yield-value: get($generator, value);
@if not get($generator, loop) {
$__generators__: set(
$__generators__,
$__current__ state,
get($generator, state) + 1) !global;
}
@return $yield-value;
}
// =================================
// Here's the (almost) desired code:
// =================================
@function fibonacci() {
$generator: set-generator('fibonacci');
$yield: yield('Ready...');
$yield: yield('Set...');
$yield: yield('Go!');
$fib1: static('fib1', 1);
$fib2: static('fib2', 1);
// Pretend that this looks normal.
$while: gen-while(true);
$current: get-static('fib2');
$fib2: set-static('fib2', get-static('fib1'));
$fib1: set-static('fib1', get-static('fib1') + $current);
$yield: yield($current);
$while: gen-endwhile();
@return $yield;
}
.fibonacci {
content: generate-next(fibonacci);
content: inspect($__generators__);
content: generate-next(fibonacci);
content: inspect($__generators__);
content: generate-next(fibonacci);
content: inspect($__generators__);
content: generate-next(fibonacci);
content: inspect($__generators__);
content: generate-next(fibonacci);
content: inspect($__generators__);
content: generate-next(fibonacci);
content: inspect($__generators__);
content: generate-next(fibonacci);
content: inspect($__generators__);
content: generate-next(fibonacci);
content: inspect($__generators__);
content: generate-next(fibonacci);
content: inspect($__generators__);
content: generate-next(fibonacci);
content: inspect($__generators__);
content: generate-next(fibonacci);
content: inspect($__generators__);
content: generate-next(fibonacci);
content: inspect($__generators__);
}
.fibonacci {
content: "Ready...";
content: ("fibonacci": ((state: 1, traversal: 4, loop: false, done: false, value: "Ready...", loop-condition: true)));
content: "Set...";
content: ("fibonacci": ((state: 2, traversal: 4, loop: false, done: false, value: "Set...", loop-condition: true)));
content: "Go!";
content: ("fibonacci": ((state: 3, traversal: 4, loop: false, done: false, value: "Go!", loop-condition: true)));
content: 3;
content: ("fibonacci": ((state: 3, traversal: 4, loop: 3, done: false, value: 3, loop-condition: true)));
content: 5;
content: ("fibonacci": ((state: 3, traversal: 4, loop: 3, done: false, value: 5, loop-condition: true)));
content: 8;
content: ("fibonacci": ((state: 3, traversal: 4, loop: 3, done: false, value: 8, loop-condition: true)));
content: 13;
content: ("fibonacci": ((state: 3, traversal: 4, loop: 3, done: false, value: 13, loop-condition: true)));
content: 21;
content: ("fibonacci": ((state: 3, traversal: 4, loop: 3, done: false, value: 21, loop-condition: true)));
content: 34;
content: ("fibonacci": ((state: 3, traversal: 4, loop: 3, done: false, value: 34, loop-condition: true)));
content: 55;
content: ("fibonacci": ((state: 3, traversal: 4, loop: 3, done: false, value: 55, loop-condition: true)));
content: 89;
content: ("fibonacci": ((state: 3, traversal: 4, loop: 3, done: false, value: 89, loop-condition: true)));
content: 144;
content: ("fibonacci": ((state: 3, traversal: 4, loop: 3, done: false, value: 144, loop-condition: true)));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment