generated from eigerco/beerus
-
Notifications
You must be signed in to change notification settings - Fork 104
/
Copy pathdiff.cairo
24 lines (22 loc) · 827 Bytes
/
diff.cairo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
use core::num::traits::Zero;
//! The discrete difference of the elements.
/// Compute the discrete difference of a sorted sequence.
/// # Arguments
/// * `sequence` - The sorted sequence to operate.
/// # Returns
/// * `Array<T>` - The discrete difference of sorted sequence.
pub fn diff<T, +PartialOrd<T>, +Sub<T>, +Copy<T>, +Drop<T>, +Zero<T>>(
mut sequence: Span<T>,
) -> Array<T> {
// [Check] Inputs
assert(sequence.len() >= 1, 'Array must have at least 1 elt');
// [Compute] Interpolation
let mut prev_value = *sequence.pop_front().unwrap();
let mut array = array![Zero::zero()];
for current_value in sequence {
assert(*current_value >= prev_value, 'Sequence must be sorted');
array.append(*current_value - prev_value);
prev_value = *current_value;
};
array
}