@synapsecloud/lib-react
Version:
Helper library for web applications built on React Js
63 lines • 1.91 kB
JavaScript
import { useReducer } from 'react';
function createReducer() {
return function (state, action) {
switch (action.type) {
case 'push': {
state.stack.push(...action.values);
break;
}
case 'pop': {
state.stack.pop();
break;
}
case 'clear': {
return { stack: [] };
}
case 'reset': {
return { stack: action.values || [] };
}
default:
break;
}
return {
stack: state.stack,
};
};
}
export function useStack(arr = []) {
const [state, dispatch] = useReducer(createReducer(), {
stack: arr,
});
return {
push: (...values) => {
dispatch({ type: 'push', values });
return values;
},
pop: () => {
const item = state.stack[state.stack.length - 1] || null;
dispatch({ type: 'pop' });
return item;
},
clear: () => dispatch({ type: 'clear' }),
reset: (values = []) => {
dispatch({ type: 'reset', values });
},
forEach: (callback) => state.stack.reverse().forEach(callback),
map: function (callback) {
return state.stack.reverse().map(callback);
},
includes: (value) => state.stack.includes(value),
peek: () => state.stack[state.stack.length - 1] || null,
entries: () => state.stack.entries(),
values: () => state.stack.values(),
keys: () => state.stack.keys(),
size: state.stack.length,
*[Symbol.iterator]() {
const iterator1 = state.stack[Symbol.iterator]();
for (const item of iterator1) {
yield item;
}
},
};
}
//# sourceMappingURL=useStack.js.map