gpui_base/motion/
stagger.rs1use std::time::Duration;
2
3#[derive(Clone, Copy, Debug, Eq, PartialEq)]
4pub enum StaggerOrigin {
5 First,
6 Last,
7 Center,
8 Index(usize),
9}
10
11#[derive(Clone, Copy, Debug, Eq, PartialEq)]
12pub struct Stagger {
13 interval: Duration,
14 origin: StaggerOrigin,
15}
16
17impl Stagger {
18 pub const fn new(interval: Duration, origin: StaggerOrigin) -> Self {
19 Self { interval, origin }
20 }
21
22 #[inline]
23 pub fn delay(&self, index: usize, count: usize) -> Duration {
24 if count == 0 {
25 return Duration::ZERO;
26 }
27 let index = index.min(count - 1);
28 let origin = match self.origin {
29 StaggerOrigin::First => 0,
30 StaggerOrigin::Last => count - 1,
31 StaggerOrigin::Center => (count - 1) / 2,
32 StaggerOrigin::Index(origin) => origin.min(count - 1),
33 };
34 self.interval
35 .saturating_mul(index.abs_diff(origin).min(u32::MAX as usize) as u32)
36 }
37}