Skip to content
This repository was archived by the owner on Jan 6, 2025. It is now read-only.

Commit 386e3d2

Browse files
committed
✨ Finish functionnal navs...
1 parent a333306 commit 386e3d2

File tree

4 files changed

+107
-67
lines changed

4 files changed

+107
-67
lines changed

packages/immutadot/src/nav2/indexNav.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -31,16 +31,16 @@ const get = (pIndex, next) => () => {
3131
const unset = (pIndex, next) => () => {
3232
const nextUnsetter = next()
3333
if (nextUnsetter) {
34-
return onCopy(newValue => {
35-
const index = resolveIndex(pIndex, newValue)
34+
return onCopy(value => {
35+
const index = resolveIndex(pIndex, value)
3636
if (index === undefined) return // TODO avoid useless copy ?
37-
newValue[index] = nextUnsetter(newValue[index])
37+
value[index] = nextUnsetter(value[index])
3838
})
3939
}
40-
return onCopy(newValue => {
41-
const index = resolveIndex(pIndex, newValue)
40+
return onCopy(value => {
41+
const index = resolveIndex(pIndex, value)
4242
if (index === undefined) return // TODO avoid useless copy ?
43-
delete newValue[index]
43+
delete value[index]
4444
})
4545
}
4646

packages/immutadot/src/nav2/propNav.js

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,17 @@ const get = (key, next) => () => {
1717
}
1818
}
1919

20-
const unset = (key, next) => () => {
20+
const unsetProp = (key, nextUnsetter) => () => onCopy(newValue => {
21+
newValue[key] = nextUnsetter(newValue[key])
22+
})
23+
24+
const deleteProp = key => () => onCopy(newValue => {
25+
delete newValue[key]
26+
})
27+
28+
const unset = (key, next) => {
2129
const nextUnsetter = next()
22-
if (nextUnsetter) {
23-
return onCopy(newValue => {
24-
newValue[key] = nextUnsetter(newValue[key])
25-
})
26-
}
27-
return onCopy(newValue => {
28-
delete newValue[key]
29-
})
30+
return nextUnsetter ? unsetProp(key, nextUnsetter) : deleteProp(key)
3031
}
3132

3233
export const propNav = makeNav({

packages/immutadot/src/nav2/propsNav.js

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,29 +23,27 @@ const get = (keys, next) => () => {
2323
return value => isNil(value) ? undefined : Object.keys(value).map(key => nextGetter(value[key]))
2424
}
2525

26-
const unset = (keys, next) => () => {
26+
const unsetKeys = (keys, nextUnsetter) => () => onCopy(value => {
27+
for (const key of keys) value[key] = nextUnsetter(value[key])
28+
})
29+
30+
const unsetAll = nextUnsetter => () => onCopy(value => {
31+
for (const key of Object.keys(value)) value[key] = nextUnsetter(value[key])
32+
})
33+
34+
const deleteKeys = keys => () => onCopy(value => {
35+
for (const key of keys) delete value[key]
36+
})
37+
38+
const deleteAll = () => onCopy(value => {
39+
for (const key of Object.keys(value)) delete value[key]
40+
})
41+
42+
const unset = (keys, next) => {
2743
const nextUnsetter = next()
28-
if (nextUnsetter) {
29-
if (keys) {
30-
return onCopy((newValue, value) => {
31-
if (isNil(value))
32-
for (const key of keys) newValue[key] = nextUnsetter(undefined)
33-
else
34-
for (const key of keys) newValue[key] = nextUnsetter(value[key])
35-
}, true)
36-
}
37-
return onCopy((newValue, value) => {
38-
for (const key of Object.keys(value)) newValue[key] = nextUnsetter(value[key])
39-
})
40-
}
41-
if (keys) {
42-
return onCopy(newValue => {
43-
for (const key of keys) delete newValue[key]
44-
})
45-
}
46-
return onCopy((newValue, value) => {
47-
for (const key of Object.keys(value)) delete newValue[key]
48-
})
44+
if (nextUnsetter)
45+
return keys ? unsetKeys(keys, nextUnsetter) : unsetAll(nextUnsetter)
46+
return keys ? deleteKeys(keys) : deleteAll
4947
}
5048

5149
export const propsNav = makeNav({

packages/immutadot/src/nav2/sliceNav.js

Lines changed: 71 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -16,53 +16,94 @@ const resolveEnd = (pEnd, length, step) => {
1616
return resolveIndex(pEnd, length)
1717
}
1818

19+
const getRange = (pStart, pEnd, pStep, value) => {
20+
const step = pStep === undefined ? 1 : pStep
21+
const length = getLength(value)
22+
const start = resolveStart(pStart, length, step)
23+
const end = resolveEnd(pEnd, length, step)
24+
if (step > 0) {
25+
if (end <= start) return null
26+
return {
27+
[Symbol.iterator]: () => {
28+
let i = start
29+
return {
30+
next: () => {
31+
if (i < end) {
32+
const res = {
33+
value: i,
34+
done: false,
35+
}
36+
i += step
37+
return res
38+
}
39+
return { done: true }
40+
},
41+
}
42+
},
43+
}
44+
}
45+
if (end >= start) return null
46+
return {
47+
[Symbol.iterator]: () => {
48+
let i = start
49+
return {
50+
next: () => {
51+
if (i > end) {
52+
const res = {
53+
value: i,
54+
done: false,
55+
}
56+
i += step
57+
return res
58+
}
59+
return { done: true }
60+
},
61+
}
62+
},
63+
}
64+
}
65+
1966
const update = ([pStart, pEnd, pStep], next) => updater => {
2067
const nextUpdater = next(updater)
21-
const step = pStep === undefined ? 1 : pStep
2268
return onCopy((newValue, value) => {
23-
const length = getLength(value)
24-
const start = resolveStart(pStart, length, step)
25-
const end = resolveEnd(pEnd, length, step)
26-
if (step > 0) {
27-
if (end <= start) return // TODO avoid useless copy
28-
if (isNil(value))
29-
for (let i = start; i < end; i += step) newValue[i] = nextUpdater(undefined)
30-
else
31-
for (let i = start; i < end; i += step) newValue[i] = nextUpdater(value[i])
32-
}
33-
if (end >= start) return // TODO avoid useless copy
69+
const range = getRange(pStart, pEnd, pStep, value)
70+
if (!range) return // TODO avoid useless copy
3471
if (isNil(value))
35-
for (let i = start; i > end; i += step) newValue[i] = nextUpdater(undefined)
72+
for (const i of range) newValue[i] = nextUpdater(undefined)
3673
else
37-
for (let i = start; i > end; i += step) newValue[i] = nextUpdater(value[i])
74+
for (const i of range) newValue[i] = nextUpdater(value[i])
3875
}, true)
3976
}
4077

4178
const get = ([pStart, pEnd, pStep], next) => () => {
4279
const nextGetter = next()
43-
const step = pStep === undefined ? 1 : pStep
4480
return value => {
45-
const length = getLength(value)
46-
const start = resolveStart(pStart, length, step)
47-
const end = resolveEnd(pEnd, length, step)
4881
if (isNil(value)) return []
49-
let range
50-
if (step > 0) {
51-
if (end <= start) return []
52-
range = (function* () {
53-
for (let i = start; i < end; i += step) yield i
54-
}())
55-
} else {
56-
if (end >= start) return []
57-
range = (function* () {
58-
for (let i = start; i > end; i += step) yield i
59-
}())
60-
}
82+
const range = getRange(pStart, pEnd, pStep, value)
83+
if (!range) return []
6184
return Array.from(range, i => nextGetter(value[i]))
6285
}
6386
}
6487

88+
const unsetSlice = (pStart, pEnd, pStep, nextUnsetter) => () => onCopy(value => {
89+
const range = getRange(pStart, pEnd, pStep, value)
90+
if (!range) return // TODO avoid useless copy
91+
for (const i of range) value[i] = nextUnsetter(value[i])
92+
})
93+
94+
const deleteSlice = (pStart, pEnd, pStep) => () => onCopy(value => {
95+
const range = getRange(pStart, pEnd, pStep, value)
96+
if (!range) return // TODO avoid useless copy
97+
for (const i of range) delete value[i]
98+
})
99+
100+
const unset = ([pStart, pEnd, pStep], next) => {
101+
const nextUnsetter = next()
102+
return nextUnsetter ? unsetSlice(pStart, pEnd, pStep, nextUnsetter) : deleteSlice(pStart, pEnd, pStep)
103+
}
104+
65105
export const sliceNav = makeNav({
66106
update,
67107
get,
108+
unset,
68109
})

0 commit comments

Comments
 (0)