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/d94049a3d516e31a8dad to your computer and use it in GitHub Desktop.

Select an option

Save KittyGiraudel/d94049a3d516e31a8dad to your computer and use it in GitHub Desktop.
Generated by SassMeister.com.
// ----
// 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));
}
.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