everscale_network/util/
network_builder.rs

1use anyhow::Result;
2use frunk_core::hlist::{HCons, HNil};
3
4/// Convenient network layer builder
5pub struct NetworkBuilder<T, I>(pub(crate) T, pub(crate) std::marker::PhantomData<I>);
6
7impl<T, I> NetworkBuilder<T, I>
8where
9    T: DeferredInitializationList,
10{
11    /// Initializes all layers into a tuple of components
12    pub fn build(self) -> Result<T::Output> {
13        self.0.initialize()
14    }
15}
16
17/// Lazy initialization when building layers with [`NetworkBuilder`]
18pub trait DeferredInitialization {
19    type Initialized;
20
21    fn initialize(self) -> Result<Self::Initialized>;
22}
23
24/// List of lazy initializers for [`NetworkBuilder`]
25pub trait DeferredInitializationList {
26    type Output;
27
28    fn initialize(self) -> Result<Self::Output>;
29}
30
31type BaseLayer<T> = HCons<T, HNil>;
32
33impl<T0> DeferredInitializationList for BaseLayer<T0>
34where
35    T0: DeferredInitialization,
36{
37    type Output = T0::Initialized;
38
39    fn initialize(self) -> Result<Self::Output> {
40        self.head.initialize()
41    }
42}
43
44impl<T0, T1> DeferredInitializationList for HCons<T1, BaseLayer<T0>>
45where
46    T0: DeferredInitialization,
47    T1: DeferredInitialization,
48{
49    type Output = (T0::Initialized, T1::Initialized);
50
51    fn initialize(self) -> Result<Self::Output> {
52        let t1 = self.head.initialize()?;
53        let t0 = self.tail.head.initialize()?;
54        Ok((t0, t1))
55    }
56}
57
58impl<T0, T1, T2> DeferredInitializationList for HCons<T2, HCons<T1, BaseLayer<T0>>>
59where
60    T0: DeferredInitialization,
61    T1: DeferredInitialization,
62    T2: DeferredInitialization,
63{
64    type Output = (T0::Initialized, T1::Initialized, T2::Initialized);
65
66    fn initialize(self) -> Result<Self::Output> {
67        let t2 = self.head.initialize()?;
68        let t1 = self.tail.head.initialize()?;
69        let t0 = self.tail.tail.head.initialize()?;
70        Ok((t0, t1, t2))
71    }
72}
73
74impl<T0, T1, T2, T3> DeferredInitializationList for HCons<T3, HCons<T2, HCons<T1, BaseLayer<T0>>>>
75where
76    T0: DeferredInitialization,
77    T1: DeferredInitialization,
78    T2: DeferredInitialization,
79    T3: DeferredInitialization,
80{
81    type Output = (
82        T0::Initialized,
83        T1::Initialized,
84        T2::Initialized,
85        T3::Initialized,
86    );
87
88    fn initialize(self) -> Result<Self::Output> {
89        let t3 = self.head.initialize()?;
90        let t2 = self.tail.head.initialize()?;
91        let t1 = self.tail.tail.head.initialize()?;
92        let t0 = self.tail.tail.tail.head.initialize()?;
93        Ok((t0, t1, t2, t3))
94    }
95}