funkjon 1.0.2

One of the worst macros this world has ever been (dis)graced with.
Documentation
#[macro_export]
macro_rules! funkjon {
    (
        $ident:ident ::$(<
            $($generic:ident $(: $first_partial:ident
                $(:: $($first_residual:ident $(::)?)*)?
                $( $( +
                    $partial:ident
                    $(:: $($residual:ident $(::)?)*)?
                )+ )?
            )? ),*
        > ::)? $($param:ident),* $block:block
        as ( $($ty:ty),* ) -> Unit
        $(where $($clause_ident:ident :
            $first_clause_partial:ident
            $(:: $($first_clause_residual:ident $(::)?)*)?
            $( $(+
                $clause_partial:ident
                $(:: $($clause_residual:ident $(::)?)*)?
            )+ )?
        ),* $(,)?)?
    ) => {
        fn $ident
        $(< $($generic $(: $first_partial $($(:: $first_residual)*)? $($(+ $partial $($(:: $residual)*)?)*)?)?),* >)?
        ( $($param : $ty),* ) -> ()
            $(where $($clause_ident: $first_clause_partial $($(:: $first_clause_residual)*)? $($(+ $clause_partial $($($clause_residual)*)?)*)?),*)?
        $block
    };
    (
        $ident:ident ::$(<
            $($generic:ident $(: $first_partial:ident
                $(:: $($first_residual:ident $(::)?)*)?
                $( $( +
                    $partial:ident
                    $(:: $($residual:ident $(::)?)*)?
                )+ )?
            )? ),*
        > ::)? $($param:ident),* $block:block
        as ( $($ty:ty),* ) -> $output:ty
        $(where $($clause_ident:ident :
            $first_clause_partial:ident
            $(:: $($first_clause_residual:ident $(::)?)*)?
            $( $(+
                $clause_partial:ident
                $(:: $($clause_residual:ident $(::)?)*)?
            )+ )?
        ),* $(,)?)?
    ) => {
        fn $ident
        $(< $($generic $(: $first_partial $($(:: $first_residual)*)? $($(+ $partial $($(:: $residual)*)?)*)?)?),* >)?
        ( $($param : $ty),* ) -> $output
            $(where $($clause_ident: $first_clause_partial $($(:: $first_clause_residual)*)? $($(+ $clause_partial $($($clause_residual)*)?)*)?),*)?
        $block
    };
}