1. /**
    
  2.  * Copyright (c) Meta Platforms, Inc. and affiliates.
    
  3.  *
    
  4.  * This source code is licensed under the MIT license found in the
    
  5.  * LICENSE file in the root directory of this source tree.
    
  6.  *
    
  7.  * @flow
    
  8.  */
    
  9. 
    
  10. import type {Lane, Lanes} from './ReactFiberLane';
    
  11. 
    
  12. import {
    
  13.   NoLane,
    
  14.   SyncLane,
    
  15.   InputContinuousLane,
    
  16.   DefaultLane,
    
  17.   IdleLane,
    
  18.   getHighestPriorityLane,
    
  19.   includesNonIdleWork,
    
  20. } from './ReactFiberLane';
    
  21. 
    
  22. export opaque type EventPriority = Lane;
    
  23. 
    
  24. export const DiscreteEventPriority: EventPriority = SyncLane;
    
  25. export const ContinuousEventPriority: EventPriority = InputContinuousLane;
    
  26. export const DefaultEventPriority: EventPriority = DefaultLane;
    
  27. export const IdleEventPriority: EventPriority = IdleLane;
    
  28. 
    
  29. let currentUpdatePriority: EventPriority = NoLane;
    
  30. 
    
  31. export function getCurrentUpdatePriority(): EventPriority {
    
  32.   return currentUpdatePriority;
    
  33. }
    
  34. 
    
  35. export function setCurrentUpdatePriority(newPriority: EventPriority) {
    
  36.   currentUpdatePriority = newPriority;
    
  37. }
    
  38. 
    
  39. export function runWithPriority<T>(priority: EventPriority, fn: () => T): T {
    
  40.   const previousPriority = currentUpdatePriority;
    
  41.   try {
    
  42.     currentUpdatePriority = priority;
    
  43.     return fn();
    
  44.   } finally {
    
  45.     currentUpdatePriority = previousPriority;
    
  46.   }
    
  47. }
    
  48. 
    
  49. export function higherEventPriority(
    
  50.   a: EventPriority,
    
  51.   b: EventPriority,
    
  52. ): EventPriority {
    
  53.   return a !== 0 && a < b ? a : b;
    
  54. }
    
  55. 
    
  56. export function lowerEventPriority(
    
  57.   a: EventPriority,
    
  58.   b: EventPriority,
    
  59. ): EventPriority {
    
  60.   return a === 0 || a > b ? a : b;
    
  61. }
    
  62. 
    
  63. export function isHigherEventPriority(
    
  64.   a: EventPriority,
    
  65.   b: EventPriority,
    
  66. ): boolean {
    
  67.   return a !== 0 && a < b;
    
  68. }
    
  69. 
    
  70. export function lanesToEventPriority(lanes: Lanes): EventPriority {
    
  71.   const lane = getHighestPriorityLane(lanes);
    
  72.   if (!isHigherEventPriority(DiscreteEventPriority, lane)) {
    
  73.     return DiscreteEventPriority;
    
  74.   }
    
  75.   if (!isHigherEventPriority(ContinuousEventPriority, lane)) {
    
  76.     return ContinuousEventPriority;
    
  77.   }
    
  78.   if (includesNonIdleWork(lane)) {
    
  79.     return DefaultEventPriority;
    
  80.   }
    
  81.   return IdleEventPriority;
    
  82. }