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
use core::{
  future::Future,
  pin::Pin,
};

use super::{
  traits::*,
  types::*,
};
use crate::internal::functional::{
  nat::*,
  type_app::{
    TyCon,
    TypeApp,
  },
};

impl TyCon for ProviderEndpointF {}

impl TyCon for ClientEndpointF {}

impl<'a, A: Protocol> TypeApp<'a, A> for ProviderEndpointF
{
  type Applied = A::ProviderEndpoint;
}

impl<'a, A: Protocol> TypeApp<'a, A> for ClientEndpointF
{
  type Applied = A::ClientEndpoint;
}

impl SealedProtocol for Z {}

impl Protocol for Z
{
  type ClientEndpoint = ();
  type ProviderEndpoint = ();

  fn create_endpoints() -> (Self::ProviderEndpoint, Self::ClientEndpoint)
  {
    ((), ())
  }

  fn forward(
    _client_end: Self::ClientEndpoint,
    _provider_end: Self::ProviderEndpoint,
  ) -> Pin<Box<dyn Future<Output = ()> + Send + 'static>>
  {
    Box::pin(async {})
  }
}

impl<N> SealedProtocol for S<N> {}

impl<N> Protocol for S<N>
where
  N: Protocol,
{
  type ClientEndpoint = ();
  type ProviderEndpoint = ();

  fn create_endpoints() -> (Self::ProviderEndpoint, Self::ClientEndpoint)
  {
    ((), ())
  }

  fn forward(
    _client_end: Self::ClientEndpoint,
    _provider_end: Self::ProviderEndpoint,
  ) -> Pin<Box<dyn Future<Output = ()> + Send + 'static>>
  {
    Box::pin(async {})
  }
}