struct Point<T> {
    x: T,
    y: T,
}

    fn swap(&mut self) {
        std::mem::swap(&mut self.x, &mut self.y);
    }
}

fn takes_anything<T>(x: T) {
    // do something with x
}

fn takes_two_of_the_same_thing<T>(x: T, y: T) {
    // do something with x and y
}

fn takes_two_things<T, U>(x: T, y: U) {
    // do something with x and y
}

fn main() {
    let x: Option<i32> = Some(5); // okay
    // let y: Option<f64> = Some(4); // error
    let y: Option<f64> = Some(5.0f64);

    let init_origin = Point { x: 0, y: 0 };
    let float_origin = Point { x: 0.0, y: 0.0 };
}
impl<T> Point<T> {