/// For parsing item definitions,
/// passing the generic parameters unchanged to a callback macro.
///
/// # Examples
///
/// ### Basic
///
/// Basic example of using this macro, and what it passes to a callback macro.
///
/// For a more realistic example you can look [at the one below](#realistic-example)
///
/// ```rust
/// use core_extensions::split_generics_and_where;
///
/// # fn main() {
/// assert_eq!(hello(), "world");
/// # }
///
/// // `split_generics_and_where` calls `crate::foo` here
/// split_generics_and_where! {
/// crate::foo!{
/// // The first tokens passed to the `crate::foo` macro
/// hello "world" foo bar
/// }
///
/// (
/// // The parsed tokens
/// <'a, T: Foo, const N: usize> (param: Type) -> u32
/// where
/// T: Bar,
/// { println }
/// )
/// }
///
/// #[macro_export]
/// macro_rules! foo {
/// (
/// $fn_name:ident $string:literal foo bar
/// ('a, T: Foo, const N: usize) // the generic parameters
/// ((param: Type) -> u32 ) // before the where clause
/// (T: Bar,) // inside the where clause
/// ( { println } ) // after the where clause
/// ) => {
/// fn $fn_name() -> &'static str {
/// $string
/// }
/// };
/// }
/// ```
///
///
///
/// ### Parsing a function
///
/// This demonstrates how you can parse a function.
///
/// ```rust
/// use std::ops::Mul;
///
/// crate::inject_increment! {
/// pub fn square(x: u32) -> u32 {
/// x * x
/// }
/// }
/// crate::inject_increment! {
/// pub(crate) unsafe fn cube(x: T) -> T
/// where
/// T: Mul