Skip to content

Instantly share code, notes, and snippets.

@kl0tl
Last active August 29, 2015 14:03
Show Gist options
  • Save kl0tl/536eb9ae9511ce17a0dd to your computer and use it in GitHub Desktop.
Save kl0tl/536eb9ae9511ce17a0dd to your computer and use it in GitHub Desktop.
Inline `Array#filter`
macro inline_filter {
rule { ($list:expr, function ($value:ident, $index:ident, $ref:ident) {
$return:expr
}, $context:expr) } => {
(function ($ref) {
var length = $ref.length, res = [];
for (var $index = 0; $index < length; $index += 1) {
var $value = $ref[$index];
if ($return) res.push($value);
}
return res;
}.call($context, $list))
}
}
let filter = macro {
rule infix { $list:expr . | (() => $return:expr) } => {
inline_filter($list, function (value, index, ref) { $return }, this)
}
rule infix { $list:expr . | (() => $return:expr, $context:expr) } => {
inline_filter($list, function (value, index, ref) { $return }, this)
}
rule infix { $list:expr . | ($value:ident => $return:expr) } => {
inline_filter($list, function ($value, index, ref) { $return }, this)
}
rule infix { $list:expr . | ($value:ident => $return:expr, $context:expr) } => {
inline_filter($list, function ($value, index, ref) { $return }, this)
}
rule infix { $list:expr . | (($value:ident) => $return:expr) } => {
inline_filter($list, function ($value, index, ref) { $return }, this)
}
rule infix { $list:expr . | (($value:ident) => $return:expr, $context:expr) } => {
inline_filter($list, function ($value, index, ref) { $return }, this)
}
rule infix { $list:expr . | (($value:ident, $index:ident) => $return:expr) } => {
inline_filter($list, function ($value, $index, ref) { $return }, this)
}
rule infix { $list:expr . | (($value:ident, $index:ident) => $return:expr, $context:expr) } => {
inline_filter($list, function ($value, $index, ref) { $return }, this)
}
rule infix { $list:expr . | (($value:ident, $index:ident, $ref:ident) => $return:expr) } => {
inline_filter($list, function ($value, $index, $ref) { $return }, this)
}
rule infix { $list:expr . | (($value:ident, $index:ident, $ref:ident) => $return:expr, $context:expr) } => {
inline_filter($list, function ($value, $index, $ref) { $return }, this)
}
rule { $rest ... } => { some $rest ... }
}
export filter;
let filter = macro {
rule infix { $list:expr . | (() => $return:expr) } => {
inline_filter($list, function (value, index, ref) { $return }, this)
}
rule infix { $list:expr . | ($value:ident => $return:expr) } => {
inline_filter($list, function ($value, index, ref) { $return }, this)
}
rule infix { $list:expr . | (($value:ident) => $return:expr) } => {
inline_filter($list, function ($value, index, ref) { $return }, this)
}
rule infix { $list:expr . | (($value:ident, $index:ident) => $return:expr) } => {
inline_filter($list, function ($value, $index, ref) { $return }, this)
}
rule infix { $list:expr . | (($value:ident, $index:ident, $ref:ident) => $return:expr) } => {
inline_filter($list, function ($value, $index, $ref) { $return }, this)
}
rule { $rest ... } => { filter $rest ... }
}
export filter;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment