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}