// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

//! General utilities for converting types.

/// Provides functions for converting infallibly between types.
///
/// This trait can be implemented on types that allow converting between two
/// related types. It has two blanket implementations: `()` for identity
/// conversions, i.e. `Input=Output`, and [`UninstantiableConverter`] as an
/// uninstantiable type that implements the trait for any input and output.
pub(crate) trait BidirectionalConverter<Input, Output> {
    /// Converts an instance of `Input` into an instance of `Output`.
    fn convert(&self, a: Input) -> Output;

    /// Converts an instance of `Output` into an instance of `Input`.
    fn convert_back(&self, b: Output) -> Input;
}

impl<I> BidirectionalConverter<I, I> for () {
    fn convert_back(&self, value: I) -> I {
        value
    }
    fn convert(&self, value: I) -> I {
        value
    }
}

/// A marker trait for [`BidirectionalConverter`] of owned or reference types.
pub trait OwnedOrRefsBidirectionalConverter<Input, Output>:
    BidirectionalConverter<Input, Output>
    + for<'a> BidirectionalConverter<&'a Input, &'a Output>
    + for<'a> BidirectionalConverter<&'a mut Input, &'a mut Output>
{
}

impl<I, O, B> OwnedOrRefsBidirectionalConverter<I, O> for B where
    B: BidirectionalConverter<I, O>
        + for<'a> BidirectionalConverter<&'a I, &'a O>
        + for<'a> BidirectionalConverter<&'a mut I, &'a mut O>
{
}

#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn bidirectional_converter_identity() {
        let a = ();
        assert_eq!(a.convert(123), 123);
        assert_eq!(a.convert_back(123), 123);
    }
}
