Created
December 28, 2014 23:01
-
-
Save davidkpiano/c59c2af98b1987064249 to your computer and use it in GitHub Desktop.
Generated by SassMeister.com.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ---- | |
// 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__); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
.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