Last active
August 29, 2015 14:12
-
-
Save KittyGiraudel/d94049a3d516e31a8dad 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) | |
| // ---- | |
| //// | |
| // Iterators in Sass, just for the heck of it. | |
| // @access public | |
| // @see https://github.com/HugoGiraudel/SassyIterators | |
| // @see http://sassmeister.com/gist/d94049a3d516e31a8dad Demo | |
| //// | |
| /// Iterator initialization | |
| /// @param {List | Map | String} $collection | |
| /// @param {String | Null} $mapping | |
| /// @param {Arglist} $mapping-args - Extra arguments for `$mapping` | |
| /// @return {Iterator} | |
| @function iterator($collection, $mapping: null, $mapping-args...) { | |
| @return ( | |
| 'collection': $collection, | |
| 'position': 0, | |
| 'mapping': $mapping, | |
| 'mapping-args': $mapping-args, | |
| 'value': null, | |
| 'done': false | |
| ); | |
| } | |
| /// Iterator reset | |
| /// @param {Iterator} $iterator | |
| /// @return {Iterator} | |
| /// @require iterator | |
| @function iterator-rewind($iterator) { | |
| @return iterator(map-get($iterator, 'collection')); | |
| } | |
| /// Iterator validity checker | |
| /// @param {Iterator} $iterator | |
| /// @return {Boolean} | |
| @function iterator-valid($iterator) { | |
| @return map-get($iterator, 'done') == false; | |
| } | |
| /// Iterator next | |
| /// @param {Iterator} $iterator | |
| /// @return {Iterator} | |
| @function iterator-next($iterator) { | |
| $collection: map-get($iterator, 'collection'); | |
| $position: map-get($iterator, 'position') + 1; | |
| $value: map-get($iterator, 'value'); | |
| $mapping: map-get($iterator, 'mapping'); | |
| $done: map-get($iterator, 'done'); | |
| $mapping-args: map-get($iterator, 'mapping-args'); | |
| @if type-of($collection) == 'string' { | |
| $done: $position > str-length($collection); | |
| $value: if($done, null, str-slice($collection, $position, $position)); | |
| } @else if type-of($collection) == 'list' { | |
| $done: $position > length($collection); | |
| $value: if($done, null, nth($collection, $position)); | |
| } @else if type-of($collection) == 'map' { | |
| $done: $position > length($collection); | |
| $value: if($done, null, nth(map-keys($collection), $position) map-get($collection, nth(map-keys($collection), $position))); | |
| } @else { | |
| @warn "Unsupported collection type: #{type-of($collection)}."; | |
| } | |
| @return map-merge($iterator, ( | |
| 'done': $done, | |
| 'value': if($done == false and $mapping, call($mapping, $value, $mapping-args...), $value), | |
| 'position': $position | |
| )); | |
| } | |
| /// Iterator API cleaner | |
| /// @param {Iterator} $iterator | |
| /// @return {Simple Iterator} | |
| @function iterator-api($iterator) { | |
| @return ( | |
| 'done': map-get($iterator, 'done'), | |
| 'value': map-get($iterator, 'value') | |
| ); | |
| } | |
| // Iterator tester | |
| @mixin iterator-test($collection, $mapping: null, $mapping-args...) { | |
| // Initialize a new iterator | |
| $iterator: iterator($collection, $mapping, $mapping-args...); | |
| // Iterate over it, while it's not done | |
| @while iterator-valid($iterator) { | |
| // Inspect the (cleaned) iterator | |
| content: inspect(iterator-api($iterator)); | |
| // Get next value from iterator | |
| $iterator: iterator-next($iterator); | |
| } | |
| // Inspect it one last time to see it finished | |
| content: inspect(iterator-api($iterator)); | |
| } | |
| .test-string { | |
| @include iterator-test("Hello!"); | |
| } | |
| .test-list { | |
| @include iterator-test('a' 'b' 'c' 'd', 'to-upper-case'); | |
| } | |
| .test-map { | |
| @include iterator-test(('a': 1, 'b': 2)); | |
| } | |
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
| .test-string { | |
| content: ("done": false, "value": null); | |
| content: ("done": false, "value": "H"); | |
| content: ("done": false, "value": "e"); | |
| content: ("done": false, "value": "l"); | |
| content: ("done": false, "value": "l"); | |
| content: ("done": false, "value": "o"); | |
| content: ("done": false, "value": "!"); | |
| content: ("done": true, "value": null); | |
| } | |
| .test-list { | |
| content: ("done": false, "value": null); | |
| content: ("done": false, "value": "A"); | |
| content: ("done": false, "value": "B"); | |
| content: ("done": false, "value": "C"); | |
| content: ("done": false, "value": "D"); | |
| content: ("done": true, "value": null); | |
| } | |
| .test-map { | |
| content: ("done": false, "value": null); | |
| content: ("done": false, "value": "a" 1); | |
| content: ("done": false, "value": "b" 2); | |
| content: ("done": true, "value": null); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment