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
use super::{
  structs::*,
  traits::*,
};

impl<'a, F, X, T> serde::Serialize for App<'a, F, X>
where
  T: Send,
  F: TypeApp<'a, X, Applied = T>,
  T: serde::Serialize + for<'de> serde::Deserialize<'de>,
{
  fn serialize<S>(
    &self,
    serializer: S,
  ) -> Result<S::Ok, S::Error>
  where
    S: serde::Serializer,
  {
    self
      .applied
      .as_ref()
      .get_applied_borrow()
      .serialize(serializer)
  }
}

impl<'a, F, X, T: 'a> serde::Deserialize<'a> for App<'a, F, X>
where
  F: TypeApp<'a, X, Applied = T>,
  T: serde::Serialize + for<'de> serde::Deserialize<'de>,
{
  fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
  where
    D: serde::Deserializer<'a>,
  {
    let applied = T::deserialize(deserializer)?;

    Ok(App::new(applied))
  }
}

impl<'a, T, F, A> HasTypeApp<'a, F, A> for T
where
  T: Send,
  F: TypeApp<'a, A, Applied = T>,
{
  fn get_applied(self: Box<T>) -> Box<T>
  {
    self
  }

  fn get_applied_borrow(&self) -> &F::Applied
  where
    F: TypeApp<'a, A>,
  {
    self
  }
}

impl TyCon for () {}

impl<'a, A> TypeApp<'a, A> for ()
{
  type Applied = ();
}