|
|
|
|
// small database with nutrition facts, per 100 grams
|
|
|
|
|
// prettier-ignore
|
|
|
|
|
const nutritionDB = {
|
|
|
|
|
tomato: { calories: 18, protein: 0.9, carbs: 3.9, sugar: 2.6, fiber: 1.2, fat: 0.2 },
|
|
|
|
|
vinegar: { calories: 20, protein: 0.04, carbs: 0.6, sugar: 0.4, fiber: 0, fat: 0 },
|
|
|
|
|
oil: { calories: 48, protein: 0, carbs: 0, sugar: 123, fiber: 0, fat: 151 },
|
|
|
|
|
onion: { calories: 0, protein: 1, carbs: 9, sugar: 0, fiber: 0, fat: 0 },
|
|
|
|
|
garlic: { calories: 149, protein: 6.4, carbs: 33, sugar: 1, fiber: 2.1, fat: 0.5 },
|
|
|
|
|
paprika: { calories: 282, protein: 14.14, carbs: 53.99, sugar: 1, fiber: 0, fat: 12.89 },
|
|
|
|
|
sugar: { calories: 387, protein: 0, carbs: 100, sugar: 100, fiber: 0, fat: 0 },
|
|
|
|
|
orange: { calories: 49, protein: 0.9, carbs: 13, sugar: 12, fiber: 0.2, fat: 0.1 },
|
|
|
|
|
}
|
|
|
|
|
// /*/ // ⚡
|
|
|
|
|
export const tests = []
|
|
|
|
|
const t = (f) => tests.push(f)
|
|
|
|
|
|
|
|
|
|
// filter keys
|
|
|
|
|
t(({ eq, ctx }) =>
|
|
|
|
|
eq(
|
|
|
|
|
filterKeys(ctx.cart, (k) => k.length <= 6),
|
|
|
|
|
ctx.filtered,
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
t(({ eq, ctx }) =>
|
|
|
|
|
eq(
|
|
|
|
|
filterKeys(ctx.cart, (k) => /onion/.test(k)),
|
|
|
|
|
{ onion: 200 },
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// map keys
|
|
|
|
|
t(({ eq, ctx }) =>
|
|
|
|
|
eq(
|
|
|
|
|
mapKeys(ctx.cart, (k) => `✔️${k}`),
|
|
|
|
|
ctx.mapped,
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
t(({ eq, ctx }) =>
|
|
|
|
|
eq(
|
|
|
|
|
mapKeys(
|
|
|
|
|
filterKeys(ctx.cart, (k) => k === 'onion'),
|
|
|
|
|
(k) => (k = 'orange'),
|
|
|
|
|
),
|
|
|
|
|
{ orange: 200 },
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
t(({ eq, ctx }) =>
|
|
|
|
|
eq(
|
|
|
|
|
mapKeys(
|
|
|
|
|
filterKeys(nutritionDB, (k) => k === 'tomato'),
|
|
|
|
|
(k) => `${k}DB`,
|
|
|
|
|
),
|
|
|
|
|
ctx.combo,
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// reduce keys
|
|
|
|
|
t(({ eq, ctx }) =>
|
|
|
|
|
eq(
|
|
|
|
|
reduceKeys(ctx.cart, (acc, cr) => acc.concat(', ', cr)),
|
|
|
|
|
'vinegar, sugar, oil, onion, garlic, paprika',
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
t(({ eq, ctx }) =>
|
|
|
|
|
eq(
|
|
|
|
|
reduceKeys(ctx.cart, (acc, cr) => `${acc}${cr}:`, ':'),
|
|
|
|
|
':vinegar:sugar:oil:onion:garlic:paprika:',
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const join = (acc, cr) => (acc == null ? cr : `${acc}:${cr}`)
|
|
|
|
|
t(({ eq, ctx }) =>
|
|
|
|
|
eq(
|
|
|
|
|
reduceKeys(nutritionDB, join, null),
|
|
|
|
|
'tomato:vinegar:oil:onion:garlic:paprika:sugar:orange',
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
t(({ eq, ctx }) =>
|
|
|
|
|
eq(
|
|
|
|
|
reduceKeys(ctx.cart, join, undefined),
|
|
|
|
|
'vinegar:sugar:oil:onion:garlic:paprika',
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
t(({ eq, ctx }) =>
|
|
|
|
|
eq(
|
|
|
|
|
reduceKeys(ctx.cart, (acc, cr) => (acc += (cr.length <= 4) & 1), 0),
|
|
|
|
|
1,
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
Object.freeze(tests)
|
|
|
|
|
|
|
|
|
|
export const setup = () => ({
|
|
|
|
|
cart: {
|
|
|
|
|
vinegar: 80,
|
|
|
|
|
sugar: 100,
|
|
|
|
|
oil: 50,
|
|
|
|
|
onion: 200,
|
|
|
|
|
garlic: 22,
|
|
|
|
|
paprika: 4,
|
|
|
|
|
},
|
|
|
|
|
filtered: { sugar: 100, oil: 50, onion: 200, garlic: 22 },
|
|
|
|
|
mapped: {
|
|
|
|
|
'✔️vinegar': 80,
|
|
|
|
|
'✔️sugar': 100,
|
|
|
|
|
'✔️oil': 50,
|
|
|
|
|
'✔️onion': 200,
|
|
|
|
|
'✔️garlic': 22,
|
|
|
|
|
'✔️paprika': 4,
|
|
|
|
|
},
|
|
|
|
|
combo: {
|
|
|
|
|
tomatoDB: {
|
|
|
|
|
calories: 18,
|
|
|
|
|
protein: 0.9,
|
|
|
|
|
carbs: 3.9,
|
|
|
|
|
sugar: 2.6,
|
|
|
|
|
fiber: 1.2,
|
|
|
|
|
fat: 0.2,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|