import { Subscription } from '../Subscription'; 
 | 
  
 | 
interface AnimationFrameProvider { 
 | 
  schedule(callback: FrameRequestCallback): Subscription; 
 | 
  requestAnimationFrame: typeof requestAnimationFrame; 
 | 
  cancelAnimationFrame: typeof cancelAnimationFrame; 
 | 
  delegate: 
 | 
    | { 
 | 
        requestAnimationFrame: typeof requestAnimationFrame; 
 | 
        cancelAnimationFrame: typeof cancelAnimationFrame; 
 | 
      } 
 | 
    | undefined; 
 | 
} 
 | 
  
 | 
export const animationFrameProvider: AnimationFrameProvider = { 
 | 
  // When accessing the delegate, use the variable rather than `this` so that 
 | 
  // the functions can be called without being bound to the provider. 
 | 
  schedule(callback) { 
 | 
    let request = requestAnimationFrame; 
 | 
    let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame; 
 | 
    const { delegate } = animationFrameProvider; 
 | 
    if (delegate) { 
 | 
      request = delegate.requestAnimationFrame; 
 | 
      cancel = delegate.cancelAnimationFrame; 
 | 
    } 
 | 
    const handle = request((timestamp) => { 
 | 
      // Clear the cancel function. The request has been fulfilled, so 
 | 
      // attempting to cancel the request upon unsubscription would be 
 | 
      // pointless. 
 | 
      cancel = undefined; 
 | 
      callback(timestamp); 
 | 
    }); 
 | 
    return new Subscription(() => cancel?.(handle)); 
 | 
  }, 
 | 
  requestAnimationFrame(...args) { 
 | 
    const { delegate } = animationFrameProvider; 
 | 
    return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args); 
 | 
  }, 
 | 
  cancelAnimationFrame(...args) { 
 | 
    const { delegate } = animationFrameProvider; 
 | 
    return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args); 
 | 
  }, 
 | 
  delegate: undefined, 
 | 
}; 
 |