haar_lib/macros/
rec.rs

1//! `rec!`
2
3/// immutableかつ引数を一つのみとる再帰クロージャ
4///
5/// # References
6/// - [https://qiita.com/vain0x/items/90c9580aa34926160ac1](https://qiita.com/vain0x/items/90c9580aa34926160ac1)
7#[macro_export]
8macro_rules! rec {
9    ( |$self:ident, $arg_name:tt: $arg_ty:ty| -> $ret:ty $body:block ) => {{
10        fn recurse<X, Y>(f: &dyn Fn(&dyn Fn(X) -> Y, X) -> Y, x: X) -> Y {
11            f(&|x: X| recurse(&f, x), x)
12        }
13
14        |x| recurse(&|$self, $arg_name: $arg_ty| -> $ret { $body }, x)
15    }};
16}