type Reserve = {
(from: Date, to: Date, destination: string): Ticket;
(from: Date, destination: string): Ticket
};
const reserve: Reserve = (from: Date, ...args: [toOrDest: Date, destination: string] | [destination: string]): Ticket => {
const isOne = args.length === 1;
return {
type: isOne ? "one-way" : "two-way",
from,
destination: isOne ? args[0] : args[1],
...(isOne ? {} : {to: args[0]})
};
};
Reserve
. Но тогда при наведении мыши на reserve
будет не совсем понятная подсказка (хотя автокомплит вполне корректный).setItems((prev) => {
const i = prev.findIndex(item => item.id === id);
if (i < 0 || prev[i].isClicked) {
return prev;
}
const newArr = [...prev];
newArr[i] = {...prev[i], isClicked: true};
return newArr;
});
function createQueue(onMatch) {
const queue = [];
const checkItem = (item, range, i) => {
if (item[0] <= range[0] && range[1] <= item[1]) {
queue.splice(i, 1);
onMatch(range, item);
return true;
}
return false;
};
const add = (range) => {
for (let i = 0; i < queue.length; ++i) {
if (checkItem(queue[i], range, i) || checkItem(range, queue[i], i)) {
return;
}
}
queue.push(range);
};
return {queue, add};
}
// пример использования
const q = createQueue((a, b) => console.log(a, b));
q.add([2, 4]);
q.add([3, 5]);
q.add([4, 4]); // log ([4, 4], [2, 4])
<>
{
rename ? (
<div><Counter title='Щелкунчик' /></div>
) : (
<div><Counter title='Counter' /></div>
)
}
<button onClick={() => setRename(!rename)}>Переименовать</button>
</>
<>
{ rename && <div><Counter title='Щелкунчик' /></div> }
{ !rename && <div><Counter title='Counter' /></div> }
<button onClick={() => setRename(!rename)}>Переименовать</button>
</>
const useHint = (hintTime?: number): VoidFunction => {
const dispatch = useAppDispatch();
return () => {
dispatch({ type: setHintState.type, payload: { state: true } })
setTimeout(() => {
dispatch({ type: setHintState.type, payload: { state: false } })
}, hintTime && 300);
};
};
...
const Item: FC = () => {
const runHint = useHint(500);
return (
<>
<CopyButton
className='contacts-group-item-field__btn'
onClick={() => {
runHint(500);
navigator.clipboard.writeText('test')
}}
/>
</>
)
}
const result = JSON.parse(
'(1 (20 (400 5 60 (700) 108 (90)) 3))'
.replaceAll('(', '[')
.replaceAll(')', ']')
.replace(/(\d|\])(?=\s+\d|\s*\[)/g, '$&,'));
function getTree(str) {
const tokens = str.match(/\d+|[()]/g);
const stack = [];
let currentArr = null;
for(let i = 0; i < tokens.length; ++i) {
const token = tokens[i];
if (token === ')') {
if (!stack.length) {
return currentArr;
}
currentArr = stack.pop();
} else if (token === '(') {
const newArr = [];
if (currentArr) {
currentArr.push(newArr);
stack.push(currentArr);
}
currentArr = newArr;
} else {
if (currentArr) {
currentArr.push(parseInt(token));
}
}
}
return currentArr;
}
const result = getTree('(1 (20 (400 5 60 (700) 108 (90)) 3))');