Last active
January 4, 2024 19:06
-
-
Save PsychedelicShayna/d68a9f06837fb9c2975da672944729c1 to your computer and use it in GitHub Desktop.
A versatile map! macro I came up with as an analogue to vec! but for HashMaps, with added powers for quality of life in Rust.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use std::collections::HashMap; | |
#[macro_export] | |
macro_rules! map ( | |
// ----------------------------------------------------------------------- | |
// Inferred types, no bindings. | |
{$($key:expr => $value:expr;)+} => { | |
vec![ | |
$( | |
($key, $value), | |
)+ | |
].into_iter().collect::<HashMap::<_, _>>() | |
}; | |
// Inferred types, no bindings. | |
// ----------------------------------------------------------------------- | |
// ----------------------------------------------------------------------- | |
// Right bound, left unbound. | |
(_, $vi:ident := $kt:ty, $vt:ty {$($key:expr => $value:expr;)+}) => { | |
{ | |
type $vi = $vt; | |
vec![ | |
$( | |
($key, $value), | |
)+ | |
].into_iter().collect::<HashMap<$kt, $vt>>() | |
} | |
}; | |
(_, $vi:ident := Into $kt:ty, $vt:ty {$($key:expr => $value:expr;)+}) => { | |
{ | |
type $vi = $vt; | |
vec![ | |
$( | |
($key.into(), $value), | |
)+ | |
].into_iter().collect::<HashMap<$kt, $vt>>() | |
} | |
}; | |
(_, $vi:ident := $kt:ty, Into $vt:ty {$($key:expr => $value:expr;)+}) => { | |
{ | |
type $vi = $vt; | |
vec![ | |
$( | |
($key, $value.into()), | |
)+ | |
].into_iter().collect::<HashMap<$kt, $vt>>() | |
} | |
}; | |
(_, $vi:ident := Into $kt:ty, Into $vt:ty {$($key:expr => $value:expr;)+}) => { | |
{ | |
type $vi = $vt; | |
vec![ | |
$( | |
($key.into() , $value.into()), | |
)+ | |
].into_iter().collect::<HashMap<$kt, $vt>>() | |
} | |
}; | |
// Right bound, left unbound. | |
// ----------------------------------------------------------------------- | |
// ----------------------------------------------------------------------- | |
// Left bound, right unbound. | |
($ki:ident, _ := $kt:ty, $vt:ty {$($key:expr => $value:expr;)+}) => { | |
{ | |
type $ki = $kt; | |
vec![ | |
$( | |
($key, $value), | |
)+ | |
].into_iter().collect::<HashMap<$kt, $vt>>() | |
} | |
}; | |
($ki:ident, _ := Into $kt:ty, $vt:ty {$($key:expr => $value:expr;)+}) => { | |
{ | |
type $ki = $kt; | |
vec![ | |
$( | |
($key.into(), $value), | |
)+ | |
].into_iter().collect::<HashMap<$kt, $vt>>() | |
} | |
}; | |
($ki:ident, _ := $kt:ty, Into $vt:ty {$($key:expr => $value:expr;)+}) => { | |
{ | |
type $ki = $kt; | |
vec![ | |
$( | |
($key, $value.into()), | |
)+ | |
].into_iter().collect::<HashMap<$kt, $vt>>() | |
} | |
}; | |
($ki:ident, _ := Into $kt:ty, Into $vt:ty {$($key:expr => $value:expr;)+}) => { | |
{ | |
type $ki = $kt; | |
vec![ | |
$( | |
($key.into() , $value.into()), | |
)+ | |
].into_iter().collect::<HashMap<$kt, $vt>>() | |
} | |
}; | |
// Left bound, right unbound. | |
// ----------------------------------------------------------------------- | |
// ----------------------------------------------------------------------- | |
// Both Bound | |
($ki:ident, $vi:ident := $kt:ty, $vt:ty {$($key:expr => $value:expr;)+}) => { | |
{ | |
type $ki = $kt; | |
type $vi = $vt; | |
vec![ | |
$( | |
($key, $value), | |
)+ | |
].into_iter().collect::<HashMap<$kt, $vt>>() | |
} | |
}; | |
($ki:ident, $vi:ident := Into $kt:ty, $vt:ty {$($key:expr => $value:expr;)+}) => { | |
{ | |
type $ki = $kt; | |
type $vi = $vt; | |
vec![ | |
$( | |
($key.into(), $value), | |
)+ | |
].into_iter().collect::<HashMap<$kt, $vt>>() | |
} | |
}; | |
($ki:ident, $vi:ident := $kt:ty, Into $vt:ty {$($key:expr => $value:expr;)+}) => { | |
{ | |
type $ki = $kt; | |
type $vi = $vt; | |
vec![ | |
$( | |
($key, $value.into()), | |
)+ | |
].into_iter().collect::<HashMap<$kt, $vt>>() | |
} | |
}; | |
($ki:ident, $vi:ident := Into $kt:ty, Into $vt:ty {$($key:expr => $value:expr;)+}) => { | |
{ | |
type $ki = $kt; | |
type $vi = $vt; | |
vec![ | |
$( | |
($key.into() , $value.into()), | |
)+ | |
].into_iter().collect::<HashMap<$kt, $vt>>() | |
} | |
}; | |
// Both Bound | |
// ----------------------------------------------------------------------- | |
// ----------------------------------------------------------------------- | |
// With types, but no bindings. | |
($kt:ty, $vt:ty {$($key:expr => $value:expr;)+}) => { | |
vec![ | |
$( | |
($key, $value), | |
)+ | |
].into_iter().collect::<HashMap<$kt, $vt>>() | |
}; | |
(Into $kt:ty, Into $vt:ty {$($key:expr => $value:expr;)+}) => { | |
vec![ | |
$( | |
($key.into(), $value.into()), | |
)+ | |
].into_iter().collect::<HashMap<$kt, $vt>>() | |
}; | |
(Into $kt:ty, $vt:ty {$($key:expr => $value:expr;)+}) => { | |
vec![ | |
$( | |
($key.into(), $value), | |
)+ | |
].into_iter().collect::<HashMap<$kt, $vt>>() | |
}; | |
($kt:ty, Into $vt:ty {$($key:expr => $value:expr;)+}) => { | |
vec![ | |
$( | |
($key, $value.into()), | |
)+ | |
].into_iter().collect::<HashMap<$kt, $vt>>() | |
}; | |
); | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment