1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
pub use rumpsteak_macros::{Role, Roles};

use crate::channel;
use std::marker::PhantomData;

pub trait Role {
    type Message;
}

pub trait Pair<P: Pair<Self> + Role<Message = Self::Message>>: Role + Sized {
    fn pair() -> (Self, P);
}

pub trait Route<R: Route<Self> + Role<Message = Self::Message>>: Role + Sized {
    type Route: Pair<R::Route> + Role<Message = Self::Message>;

    fn route(&mut self) -> &mut Self::Route;
}

pub trait Sender<R: Role<Message = Self::Message>>: Role {
    fn sender(&mut self) -> &mut channel::Sender<Self::Message>;
}

pub trait Receiver<R: Role<Message = Self::Message>>: Role {
    fn receiver(&mut self) -> &mut channel::Receiver<Self::Message>;
}

pub struct Nil<R: Role>(PhantomData<R>);

impl<R: Role> Role for Nil<R> {
    type Message = R::Message;
}

impl<Q: Role, R: Role<Message = Q::Message>> Pair<Nil<R>> for Nil<Q> {
    #[inline]
    fn pair() -> (Nil<Q>, Nil<R>) {
        (Nil(PhantomData), Nil(PhantomData))
    }
}

pub struct To<R: Role>(channel::Sender<R::Message>);

impl<R: Role> Role for To<R> {
    type Message = R::Message;
}

impl<Q: Role, R: Role<Message = Q::Message>> Pair<From<R>> for To<Q> {
    #[inline]
    fn pair() -> (To<Q>, From<R>) {
        let (to, from) = channel::channel();
        (To(to), From(from))
    }
}

impl<R: Role> Sender<R> for To<R> {
    #[inline]
    fn sender(&mut self) -> &mut channel::Sender<R::Message> {
        &mut self.0
    }
}

pub struct From<R: Role>(channel::Receiver<R::Message>);

impl<R: Role> Role for From<R> {
    type Message = R::Message;
}

impl<Q: Role, R: Role<Message = Q::Message>> Pair<To<R>> for From<Q> {
    #[inline]
    fn pair() -> (From<Q>, To<R>) {
        let (to, from) = channel::channel();
        (From(from), To(to))
    }
}

impl<R: Role> Receiver<R> for From<R> {
    #[inline]
    fn receiver(&mut self) -> &mut channel::Receiver<R::Message> {
        &mut self.0
    }
}

pub struct ToFrom<R: Role>(To<R>, From<R>);

impl<R: Role> Role for ToFrom<R> {
    type Message = R::Message;
}

impl<Q: Role, R: Role<Message = Q::Message>> Pair<ToFrom<R>> for ToFrom<Q> {
    #[inline]
    fn pair() -> (ToFrom<Q>, ToFrom<R>) {
        let (left_to, left_from) = Pair::pair();
        let (right_to, right_from) = Pair::pair();
        (ToFrom(left_to, right_from), ToFrom(right_to, left_from))
    }
}

impl<R: Role> Sender<R> for ToFrom<R> {
    #[inline]
    fn sender(&mut self) -> &mut channel::Sender<R::Message> {
        self.0.sender()
    }
}

impl<R: Role> Receiver<R> for ToFrom<R> {
    #[inline]
    fn receiver(&mut self) -> &mut channel::Receiver<R::Message> {
        self.1.receiver()
    }
}