Macro tycell

Source
macro_rules! tycell {
    ( $on:ident<$($gen:ty),*> {
        static $store:ty: once_read;
        set $sbname:ident($($_0:tt),*);
        $(set $smname:ident($smmain:ty $(,$_1:tt)*): do$(.$smeth:ident($($smvar:ident:$smvarty:ty),* $(=$sconst:expr),*))*; )*
        $(set =$sfname:ident($($sfvar:ident:$sfvarty:ty),* $(,$_2:tt)*);)*
        $(get $gname:ident($($_3:tt),*) -> $gret:ty: static$(.$gmeth:ident($($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))*; )*
        $(get =$gfname:ident($($_4:tt),*) -> $gfret:ty;)*
    }) => { ... };
    ( $on:ident<$($gen:ty),*> {
        static $store:ty: once_write;
        set $sbname:ident($($_0:tt),*);
        $(set $smname:ident($smmain:ty $(,$_1:tt)*): do$(.$smeth:ident($($smvar:ident:$smvarty:ty),* $(=$sconst:expr),*))*; )*
        $(set =$sfname:ident($($sfvar:ident:$sfvarty:ty),* $(,$_2:tt)*);)*
        $(get $gname:ident($($_3:tt),*) -> $gret:ty: static$(.$gmeth:ident($($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))*; )*
        $(get =$gfname:ident($($_4:tt),*) -> $gfret:ty;)*
    }) => { ... };
    ( $on:ident<$($gen:ty),*> {
        static $store:ty: lazy_read;
        set $lazy:block
        get $gbname:ident($($_0:tt),*);
        $(get $gname:ident($($_1:tt),*) -> $gret:ty: static$(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))*; )*
        $(get =$gfname:ident($($_2:tt),*) -> $gfret:ty;)*
    }) => { ... };
    ( $on:ident<$($gen:ty),*> {
        static $store:ty: lazy_read;
        set $lazy:block
        get $gbname:ident($($_0:tt),*) -> $gbret:ty: static$(.$gbmeth:ident( $($gbvar:ident:$gbvarty:ty),* $(=$gbconst:expr),*))*;
        $(get $gname:ident($($_1:tt),*) -> $gret:ty: static$(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))*; )*
        $(get =$gfname:ident($($_2:tt),*) -> $gfret:ty;)*
    }) => { ... };
    ( $on:ident<$($gen:ty),*> {
        static $store:ty: lazy_write;
        set $lazy:block
        get $gbname:ident($($_0:tt),*);
        $(get $gname:ident($($_1:tt),*) -> $gret:ty: static$(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))*; )*
        $(get =$gfname:ident($($_2:tt),*) -> $gfret:ty;)*
    }) => { ... };
    ( $on:ident<$($gen:ty),*> {
        static $store:ty: lazy_write;
        set $lazy:block
        get $gbname:ident($($_0:tt),*) -> $gbret:ty: static$(.$gbmeth:ident( $($gbvar:ident:$gbvarty:ty),* $(=$gbconst:expr),*))*;
        $(get $gname:ident($($_1:tt),*) -> $gret:ty: static$(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))*; )*
        $(get =$gfname:ident($($_2:tt),*) -> $gfret:ty;)*
    }) => { ... };
    ( $on:ident<$($gen:ty),*> {
        const $store:ty = $lazy:expr;
        get $gbname:ident($($_0:tt),*);
        $(get $gname:ident($($_1:tt),*) -> $gret:ty: static$(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))*; )*
        $(get =$gfname:ident($($_2:tt),*) -> $gfret:ty;)*
    }) => { ... };
    ( $on:ident<$($gen:ty),*> {
        const $store:ty = $const:expr;
        get $gbname:ident($($_0:tt),*) -> $gbret:ty: static$(.$gbmeth:ident( $($gbvar:ident:$gbvarty:ty),* $(=$gbconst:expr),*))*;
        $(get $gname:ident($($_1:tt),*) -> $gret:ty: static$(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))*; )*
        $(get =$gfname:ident($($_2:tt),*) -> $gfret:ty;)*
    }) => { ... };
    ($on:ident{
        const $store:ty = $const:expr;
        get $gbname:ident($($tt:tt)* $(,$_0:tt)*) -> $gbret:ty: static$(.$gbmeth:ident( $($gbvar:ident:$gbvarty:ty),* $(=$gbconst:expr),*))*;
        $(get $gname:ident($($_1:tt),*) -> $gret:ty: static$(.$gmeth:ident($($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))*; )*
        $(get =$gfname:ident($($_2:tt),*) -> $gfret:ty;)*
    }) => { ... };
    ($on:ident{
        const $store:ty = $const:expr;
        get $gbname:ident($($_0:tt),*);
        $(get $gname:ident($($_1:tt),*) -> $gret:ty: static$(.$gmeth:ident($($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))*; )*
        $(get =$gfname:ident($($_2:tt),*) -> $gfret:ty;)*
    }) => { ... };
    ($on:ident{
        static $store:ty: $opt:ident;
        set $block:block
        get $gbname:ident($($tt:tt)* $(,$_0:tt)*) -> $gbret:ty: static$(.$gbmeth:ident( $($gbvar:ident:$gbvarty:ty),* $(=$gbconst:expr),*))*;
        $(get $gname:ident($($_1:tt),*) -> $gret:ty: static$(.$gmeth:ident($($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))*; )*
        $(get =$gfname:ident($($_2:tt),*) -> $gfret:ty;)*
    }) => { ... };
    ($on:ident{
        static $store:ty: $opt:ident;
        set $block:block
        get $gbname:ident($($_0:tt),*);
        $(get $gname:ident($($_1:tt),*) -> $gret:ty: static$(.$gmeth:ident($($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))*; )*
        $(get =$gfname:ident($($_2:tt),*) -> $gfret:ty;)*
    }) => { ... };
    ($on:ident{
        static $store:ty: $opt:ident;
        set $sbname:ident($($_0:tt),*);
        $(set $smname:ident($smmain:ty $(,$_1:tt)*): do$(.$smeth:ident($($smvar:ident:$smvarty:ty),* $(=$sconst:expr),*))*; )*
        $(set =$sfname:ident($($sfvar:ident:$sfvarty:ty),* $(,$_2:tt)*);)*
        $(get $gname:ident($($_3:tt),*) -> $gret:ty: static$(.$gmeth:ident($($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))*; )*
        $(get =$gfname:ident($($_4:tt),*) -> $gfret:ty;)*
    }) => { ... };
    ($on:ident{
        static $store:ty: $opt:ident;
        set $sbname:ident($($_0:tt),*);
        $(set $smname:ident($smmain:ty $(,$_1:tt)*): do$(.$smeth:ident($($smvar:ident:$smvarty:ty),* $(=$sconst:expr),*))*; )*
        $(set =$sfname:ident($($sfvar:ident:$sfvarty:ty),* $(,$_2:tt)*);)*
        get $gbname:ident($($_3:tt),*);
        $(get $gname:ident($($_4:tt),*) -> $gret:ty: static$(.$gmeth:ident($($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))*; )*
        $(get =$gfname:ident($($_5:tt),*) -> $gfret:ty;)*
    }) => { ... };
    ($on:ident<$($gen:ty),*> {
        static $store:ty: once_read;
        set $sbname:ident($($_0:tt),*);
        $(set $smname:ident($smmain:ty $(,$_1:tt)*): do$(.$smeth:ident($($smvar:ident:$smvarty:ty),* $(=$sconst:expr),*))*; )*
        $(set =$sfname:ident($($sfvar:ident:$sfvarty:ty),* $(,$_2:tt)*);)*
        get $gbname:ident($($_3:tt),*);
        $(get $gname:ident($($_4:tt),*) -> $gret:ty: static$(.$gmeth:ident($($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))*; )*
        $(get =$gfname:ident($($_5:tt),*) -> $gfret:ty;)*
    }) => { ... };
    ($on:ident<$($gen:ty),*> {
        static $store:ty: once_write;
        set $sbname:ident($($_0:tt),*);
        $(set $smname:ident($smmain:ty $(,$_1:tt)*): do$(.$smeth:ident($($smvar:ident:$smvarty:ty),* $(=$sconst:expr),*))*; )*
        $(set =$sfname:ident($($sfvar:ident:$sfvarty:ty),* $(,$_2:tt)*);)*
        get $gbname:ident($($_3:tt),*);
        $(get $gname:ident($($_4:tt),*) -> $gret:ty: static$(.$gmeth:ident($($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))*; )*
        $(get =$gfname:ident($($_5:tt),*) -> $gfret:ty;)*
    }) => { ... };
    (=$on:ty>$ty:ty: $name:ident $lazy:block) => { ... };
    (=$on:ty>$ty:ty: $name:ident $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ -> $gret:ty $lazy:block) => { ... };
    (=$on:ty>$ty:ty: $name:ident $lazy:block $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ -> $gret:ty) => { ... };
    (=$on:ty>$ty:ty: $name:ident $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ $lazy:block) => { ... };
    (=$on:ty>$ty:ty: $name:ident $lazy:block $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident $lazy:block) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ -> $gret:ty $lazy:block) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident $lazy:block $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ -> $gret:ty) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ $lazy:block) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident $lazy:block $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+) => { ... };
    (=$on:ty>$ty:ty: $name:ident) => { ... };
    (=$on:ty>$ty:ty: $name:ident $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ -> $gret:ty) => { ... };
    (=$on:ty>$ty:ty: $name:ident $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))* -> $gret:ty) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))*) => { ... };
    (=$on:ty>$ty:ty: $name:ident = $val:expr) => { ... };
    (=$on:ty>$ty:ty: $name:ident <$key:ty> $lazy:block) => { ... };
    (=$on:ty>$ty:ty: $name:ident <$key:ty> $lazy:block $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ -> $gret:ty) => { ... };
    (=$on:ty>$ty:ty: $name:ident <$key:ty> $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ -> $gret:ty $lazy:block) => { ... };
    (=$on:ty>$ty:ty: $name:ident <$key:ty> $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ $lazy:block) => { ... };
    (=$on:ty>$ty:ty: $name:ident <$key:ty> $lazy:block $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident <$key:ty> $lazy:block) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident <$key:ty> $lazy:block $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ -> $gret:ty) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident <$key:ty> $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ -> $gret:ty $lazy:block) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident <$key:ty> $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ $lazy:block) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident <$key:ty> $lazy:block $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+) => { ... };
    (=$on:ty>$ty:ty: $name:ident <$key:ty>) => { ... };
    (=$on:ty>$ty:ty: $name:ident <$key:ty> $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ -> $gret:ty) => { ... };
    (=$on:ty>$ty:ty: $name:ident <$key:ty> $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident <$key:ty>) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident <$key:ty> $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ -> $gret:ty) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident <$key:ty> $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+) => { ... };
    (=$on:ty>$ty:ty: $name:ident <> $lazy:block) => { ... };
    (=$on:ty>$ty:ty: $name:ident <> $lazy:block $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ -> $gret:ty) => { ... };
    (=$on:ty>$ty:ty: $name:ident <> $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ -> $gret:ty $lazy:block) => { ... };
    (=$on:ty>$ty:ty: $name:ident <> $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ $lazy:block) => { ... };
    (=$on:ty>$ty:ty: $name:ident <> $lazy:block $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident <> $lazy:block) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident <> $lazy:block $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ -> $gret:ty) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident <> $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ -> $gret:ty $lazy:block) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident <> $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ $lazy:block) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident <> $lazy:block $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+) => { ... };
    (=$on:ty>$ty:ty: $name:ident <>) => { ... };
    (=$on:ty>$ty:ty: $name:ident <> $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ -> $gret:ty) => { ... };
    (=$on:ty>$ty:ty: $name:ident <> $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident <>) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident <> $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+ -> $gret:ty) => { ... };
    (=$on:ty>$ty:ty: mut $name:ident <> $(.$gmeth:ident( $($gvar:ident:$gvarty:ty),* $(=$gconst:expr),*))+) => { ... };
    (=$on:ty:$($full:tt)*) => { ... };
    ($($on:ty > $ty:ty: $([$($name:tt)*])*;)*) => { ... };
    ($($on:ty: $([$($name:tt)*])*;)*) => { ... };
    ($(!$wrap:ident<$on:ty>: $([$($name:tt)*])*;)*) => { ... };
    ($(!!$w0:ident<$w1:ident<$on:ty>>: $([$($name:tt)*])*;)*) => { ... };
    ($(!!!$w0:ident<$w1:ident<$w2:ident<$on:ty>>>: $([$($name:tt)*])*;)*) => { ... };
    ($(!!!!$w0:ident<$w1:ident<$w2:ident<$w3:ident<$on:ty>>>>: $([$($name:tt)*])*;)*) => { ... };
    ($( {$($on:tt)*} $([$($name:tt)*])* )*) => { ... };
    ($( {$($on:tt)*}: $([$($name:tt)*])*; )*) => { ... };
}