( timer + lerping ) : clamp0 ( range val -- i ) 2dup <= if drop else dup 0 <= if drop drop 0 else swap drop then then ; : >ratio ( range value -- f ) over swap clamp0 swap />ratio ; : range ( start end -- start range ) over - ; : >range r< >range r< ratio lerpr ; : lerp ( start end duration start -- i ) ticks udelta ( start end duration delta ) >ratio lerpr ; : triggered ( duration timer -- b ) dup r> @ ticks udelta ( duration delta ) 2dup <= if drop r< +! 1 else drop drop rdrop 0 then ; : now! ( timer -- ) ticks swap ! ; : advance! ( timer -- delta ) dup @ ticks udelta ( timer delta ) dup @ >rot ticks ( from to duration start ) begin 4dup lerp r@ ! rot suspend repeat rdrop drop drop drop drop ; : sleep ( count -- ) ticks swap begin over ticks udelta over u< while suspend repeat drop drop ;