# Plan The purpose of this file is to provide a little space to plan the development of Canary. It may not be completely readable, but its purpose should be to provide a guide towards building the library. channels are unified types that can receive and send objects. they offer the following methods: - `.send(object).await?` - `.receive().await?` - `.split()` - `.to_unformatted()` the public api will ensure: - all of these can be encrypted or raw. - the user should not have to worry about whether a channel is encrypted or not. ------ unified bidirectional - `Channel` implemented with `RefChannel` - `RefChannel` implemented with `RefUnformattedChannel` - `UnformattedChannel` implemented with `RefUnformattedChannel` - `RefUnformattedChannel` implemented from scratch ------ bipartite bidirectional - - `Channel` implemented with `RefChannel` - `RefChannel` implemented with `RefUnformattedChannel` - `UnformattedChannel` implemented with `RefUnformattedChannel` - `RefUnformattedChannel` implemented from scratch send - `SendChannel` implemented with `RefSendChannel` - `RefSendChannel` implemented with `RefUnformattedSendChannel` - `UnformattedSendChannel` implemented with `RefUnformattedSendChannel` - `RefUnformattedSendChannel` implemented from scratch receive - `ReceiveChannel` implemented with `RefReceiveChannel` - `RefReceiveChannel` implemented with `RefUnformattedReceiveChannel` - `UnformattedReceiveChannel` implemented with `RefUnformattedReceiveChannel` - `RefUnformattedReceiveChannel` implemented from scratch Changes to be made: - use `Bytes` and `BytesMut` instead of `Vec` since it has much better performance