fluxion_core/
ordered.rs

1// Copyright 2025 Umberto Gotti <umberto.gotti@umbertogotti.dev>
2// Licensed under the Apache License, Version 2.0
3// http://www.apache.org/licenses/LICENSE-2.0
4
5/// A trait for types that have an intrinsic ordering for stream merging.
6///
7/// This trait allows stream operators like `combine_latest` and `ordered_merge`
8/// to work with any type that can provide an ordering value and wraps an inner value.
9///
10/// # Type Parameters
11/// * `Inner` - The type of the value wrapped by this ordered type
12///
13/// # Examples
14///
15/// ```
16/// use fluxion_core::Ordered;
17///
18/// #[derive(Clone, Debug)]
19/// struct Timestamped<T> {
20///     value: T,
21///     timestamp: u64,
22/// }
23///
24/// impl<T: Clone> Ordered for Timestamped<T> {
25///     type Inner = T;
26///
27///     fn order(&self) -> u64 {
28///         self.timestamp
29///     }
30///
31///     fn get(&self) -> &T {
32///         &self.value
33///     }
34///
35///     fn with_order(value: T, order: u64) -> Self {
36///         Timestamped { value, timestamp: order }
37///     }
38/// }
39/// ```
40pub trait Ordered: Clone {
41    /// The type of the inner value wrapped by this ordered type
42    type Inner: Clone;
43
44    /// Returns the ordering value for this item.
45    /// Stream operators use this to determine the order of items.
46    fn order(&self) -> u64;
47
48    /// Gets a reference to the inner value.
49    fn get(&self) -> &Self::Inner;
50
51    /// Creates a new instance wrapping the given value with the specified order.
52    fn with_order(value: Self::Inner, order: u64) -> Self;
53
54    /// Gets the inner value, consuming the wrapper.
55    fn into_inner(self) -> Self::Inner {
56        // Default implementation using clone, can be overridden for efficiency
57        self.get().clone()
58    }
59
60    /// Creates a new instance with a different inner type.
61    /// This is used by operators like `combine_latest` that transform the inner value.
62    fn map_inner<F, U>(self, f: F, order: u64) -> impl Ordered<Inner = U>
63    where
64        F: FnOnce(Self::Inner) -> U,
65        U: Clone,
66        Self: Sized,
67    {
68        OrderedWrapper {
69            value: f(self.into_inner()),
70            order,
71        }
72    }
73}
74
75/// A simple wrapper type for Ordered values with transformed inner types
76#[derive(Clone, Debug, PartialEq, Eq)]
77pub struct OrderedWrapper<T> {
78    value: T,
79    order: u64,
80}
81
82impl<T: Clone> Ordered for OrderedWrapper<T> {
83    type Inner = T;
84
85    fn order(&self) -> u64 {
86        self.order
87    }
88
89    fn get(&self) -> &T {
90        &self.value
91    }
92
93    fn with_order(value: T, order: u64) -> Self {
94        Self { value, order }
95    }
96
97    fn into_inner(self) -> T {
98        self.value
99    }
100}
101
102impl<T: Clone + PartialOrd> PartialOrd for OrderedWrapper<T> {
103    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
104        self.order.partial_cmp(&other.order)
105    }
106}
107
108impl<T: Clone + Ord> Ord for OrderedWrapper<T> {
109    fn cmp(&self, other: &Self) -> std::cmp::Ordering {
110        self.order.cmp(&other.order)
111    }
112}