import memoizeOne from 'memoize-one';
import { toDraggableList } from './dimension-structures';
import type {
  DraggableDimension,
  DroppableId,
  DraggableDimensionMap,
} from '../types';

export default memoizeOne(
  (
    // using droppableId to avoid cache busted when we
    // update the droppable (such as when it scrolls)
    droppableId: DroppableId,
    draggables: DraggableDimensionMap,
  ): DraggableDimension[] => {
    const result = toDraggableList(draggables)
      .filter(
        (draggable: DraggableDimension): boolean =>
          droppableId === draggable.descriptor.droppableId,
      )
      // Dimensions are not guarenteed to be ordered in the same order as keys
      // So we need to sort them so they are in the correct order
      .sort(
        (a: DraggableDimension, b: DraggableDimension): number =>
          a.descriptor.index - b.descriptor.index,
      );

    return result;
  },
);
