satyacode
Background
JavaScript
1/**
2 * 🍃 Paan Shop Menu - Object Transform
3 *
4 * Khalil Bhai ki paan shop hai jo purani Delhi mein famous hai.
5 * Menu system banana hai jisme objects ko merge karna, freeze karna,
6 * aur transform karna hai. Object transform ka tour!
7 *
8 * Methods to explore: Object.assign(), Object.freeze(),
9 *   spread operator {...}, Object.entries(), Object.fromEntries()
10 *
11 * Functions:
12 *
13 *   1. createPaanOrder(basePaan, customizations)
14 *      - Object.assign({}, basePaan, customizations) se NEW order object banao
15 *      - Original basePaan ko mutate MAT karo!
16 *      - Agar basePaan object nahi hai ya null hai, return {}
17 *      - Agar customizations object nahi hai, sirf basePaan ki copy return karo
18 *      - Example: createPaanOrder({type:"meetha",price:30}, {extra:"gulkand",price:50})
19 *                 => {type:"meetha", price:50, extra:"gulkand"}
20 *
21 *   2. freezeMenu(menu)
22 *      - Object.freeze() se menu ko immutable banao
23 *      - Return: frozen object
24 *      - Agar menu object nahi hai ya null hai, return {}
25 *      - Frozen ke baad koi modification kaam nahi karegi!
26 *      - Example: const frozen = freezeMenu({meetha:30}); frozen.meetha = 100; // still 30
27 *
28 *   3. updatePrices(menu, increase)
29 *      - Object.entries() se [key, value] pairs lo
30 *      - Har price mein increase add karo
31 *      - Object.fromEntries() se wapas object banao
32 *      - Return: NEW object (original mat badlo!)
33 *      - Agar menu object nahi hai ya increase number nahi hai, return {}
34 *      - Example: updatePrices({meetha:30, saada:20}, 10) => {meetha:40, saada:30}
35 *
36 *   4. mergeDailySpecials(regularMenu, specialsMenu)
37 *      - Spread operator {...regularMenu, ...specialsMenu} se merge karo
38 *      - specialsMenu ki values override karengi agar same key ho
39 *      - Return: NEW merged object
40 *      - Agar koi bhi object nahi hai, usse empty {} maan lo
41 *      - Example: mergeDailySpecials({meetha:30}, {chocolate:60, meetha:40})
42 *                 => {meetha:40, chocolate:60}
43 *
44 * @example
45 *   createPaanOrder({type:"meetha"}, {extra:"gulkand"}) // => {type:"meetha",extra:"gulkand"}
46 *   updatePrices({meetha:30, saada:20}, 10)              // => {meetha:40, saada:30}
47 */
48export function createPaanOrder(basePaan, customizations) {
49  if(typeof basePaan !== "object" || basePaan == null){
50    return {}
51  }
52  if(typeof customizations !== "object" || customizations == null){
53    return  Object.assign({}, basePaan)
54  }
55  
56  return Object.assign({}, basePaan, customizations)
57
58}
59
60export function freezeMenu(menu) {
61  if(typeof menu !== "object" || menu == null){
62    return {}
63  }
64  return Object.freeze(menu)
65}
66
67export function updatePrices(menu, increase) {
68  
69  if(typeof menu !== "object" || typeof increase !== "number" || menu == null){
70    return {}
71  }
72  
73  let keyValuePair =  Object.entries(menu)
74
75  let IncreasePrice = keyValuePair.map(([key, value])=>{
76    return [key, value + increase]
77  })
78
79  return Object.fromEntries(IncreasePrice)
80
81}
82
83export function mergeDailySpecials(regularMenu, specialsMenu) {
84  if(typeof regularMenu !== "object"){
85    regularMenu = {}
86  }
87  if(typeof specialsMenu !== "object"){
88    specialsMenu = {}
89  }
90
91  return {...regularMenu, ...specialsMenu}
92}
93