linera_witty/util/
merge.rs

1// Copyright (c) Zefchain Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4//! Helper types and functions that aren't specific to WIT or WebAssembly.
5
6use either::Either;
7use frunk::{HCons, HNil};
8
9/// Merging of two heterogeneous lists, resulting in a new heterogenous list where every element is
10/// of type `Either<Left, Right>`, where `Left` is an element from the current list and `Right` is
11/// an element from the `Other` list.
12pub trait Merge<Other>: Sized {
13    /// The resulting heterogeneous list with elements of both input lists.
14    type Output;
15}
16
17impl Merge<HNil> for HNil {
18    type Output = HNil;
19}
20
21impl<Head, Tail> Merge<HNil> for HCons<Head, Tail>
22where
23    Tail: Merge<HNil>,
24{
25    type Output = HCons<Either<Head, ()>, <Tail as Merge<HNil>>::Output>;
26}
27
28impl<Head, Tail> Merge<HCons<Head, Tail>> for HNil
29where
30    HNil: Merge<Tail>,
31{
32    type Output = HCons<Either<(), Head>, <HNil as Merge<Tail>>::Output>;
33}
34
35impl<LeftHead, LeftTail, RightHead, RightTail> Merge<HCons<RightHead, RightTail>>
36    for HCons<LeftHead, LeftTail>
37where
38    LeftTail: Merge<RightTail>,
39{
40    type Output = HCons<Either<LeftHead, RightHead>, <LeftTail as Merge<RightTail>>::Output>;
41}