From 3c8c92c9ca257a73cd6ea0db11b84c518a803165 Mon Sep 17 00:00:00 2001 From: mg901 Date: Wed, 8 Nov 2023 20:49:53 +0300 Subject: [PATCH] fix: optimize 'only' method for O(1) performance (#1657) --- .size-limit.js | 8 ++++---- breakpoints/create-breakpoints-api.prod.js | 19 +++++++++++++++---- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/.size-limit.js b/.size-limit.js index 102e6c2c..2b253ed7 100644 --- a/.size-limit.js +++ b/.size-limit.js @@ -3,19 +3,19 @@ module.exports = [ name: 'breakpoints', path: './breakpoints/create-breakpoints-api.prod.js', import: '{ createBreakpointsApi }', - limit: '254 B', + limit: '295 B', }, { name: 'breakpoints.dev', path: './breakpoints/create-breakpoints-api.dev.js', import: '{ createBreakpointsApi }', - limit: '804 B', + limit: '840 B', }, { name: 'styled-breakpoints', path: './styled-breakpoints/create-styled-breakpoints-theme/index.js', import: '{ createStyledBreakpointsTheme }', - limit: '725 B', + limit: '770 B', }, { name: 'styled-breakpoints + useMediaQuery', @@ -29,6 +29,6 @@ module.exports = [ './styled-breakpoints/index.js': '{ createStyledBreakpointsTheme }', './use-media-query/index.js': '{ useMediaQuery }', }, - limit: '985 B', + limit: '1.1 kB', }, ]; diff --git a/breakpoints/create-breakpoints-api.prod.js b/breakpoints/create-breakpoints-api.prod.js index f1863e67..fefd78a1 100644 --- a/breakpoints/create-breakpoints-api.prod.js +++ b/breakpoints/create-breakpoints-api.prod.js @@ -1,20 +1,31 @@ const { calcMaxWidth } = require('./calc-max-width'); -exports.createBreakpointsApi = ({ breakpoints }) => { - const keys = Object.keys(Object(breakpoints)); +exports.createBreakpointsApi = ({ breakpoints = {} }) => { + const indexMap = {}; + const keys = Object.keys(breakpoints); - const getNextKey = (key) => keys[keys.indexOf(key) + 1]; + keys.forEach((key, index) => { + indexMap[key] = index; + }); const up = (min) => breakpoints[min]; const down = (max) => calcMaxWidth(breakpoints[max]); + const getNextKey = (key) => { + const currentIndex = indexMap[key]; + const nextIndex = currentIndex + 1; + const isNotLastIndex = currentIndex < keys.length - 1; + + return isNotLastIndex ? keys[nextIndex] : undefined; + }; + const between = (min, max) => ({ min: up(min), max: down(max), }); const only = (key) => - key === keys.at(-1) ? up(key) : between(key, getNextKey(key)); + key !== keys.at(-1) ? between(key, getNextKey(key)) : up(key); return { keys,