Skip to content

Instantly share code, notes, and snippets.

@bjorn3
Forked from rust-play/playground.rs
Created April 5, 2018 15:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bjorn3/88fb8a7177b35acd2d77f8dcabd725c7 to your computer and use it in GitHub Desktop.
Save bjorn3/88fb8a7177b35acd2d77f8dcabd725c7 to your computer and use it in GitHub Desktop.
Code shared from the Rust Playground
trait Kind<T> {
type Make;
}
enum OptionKind {}
impl<T> Kind<T> for OptionKind {
type Make = Option<T>;
}
trait FunctorKind<A, B>: Kind<A> + Kind<B> {
fn fmapk(<Self as Kind<A>>::Make, impl Fn(A) -> B) -> <Self as Kind<B>>::Make;
}
impl<A, B> FunctorKind<A, B> for OptionKind {
fn fmapk(me: Option<A>, f: impl Fn(A) -> B) -> Option<B> {
match me {
Some(m) => Some(f(m)),
None => None,
}
}
}
fn main() {
println!("{:?}", OptionKind::fmapk(Some(10), |a| a + 1));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment