1 | import assocPath from 'ramda/src/assocPath'
|
2 | import path from 'ramda/src/path'
|
3 |
|
4 | import clone from './utils/clone'
|
5 |
|
6 | class State {
|
7 | constructor (obj) {
|
8 | if (typeof obj !== 'object') {
|
9 | throw new TypeError(obj, 'is not an object')
|
10 | }
|
11 |
|
12 | this.obj = clone(obj)
|
13 | this['@@Plait/State'] = 1
|
14 | }
|
15 |
|
16 | clone () {
|
17 | return new State(this.toObject())
|
18 | }
|
19 |
|
20 | toObject () {
|
21 | return clone(this.obj)
|
22 | }
|
23 |
|
24 | set (prop, val) {
|
25 | const obj = this.toObject()
|
26 |
|
27 | obj[prop] = val
|
28 |
|
29 | return new State(obj)
|
30 | }
|
31 |
|
32 | get (prop) {
|
33 | const obj = this.toObject()
|
34 |
|
35 | return obj[prop]
|
36 | }
|
37 |
|
38 | update (prop, updater) {
|
39 | return this.set(prop, updater(this.get(prop)))
|
40 | }
|
41 |
|
42 | setIn(propPath, val) {
|
43 | const obj = assocPath(propPath, val, this.obj)
|
44 |
|
45 | return new State(obj)
|
46 | }
|
47 |
|
48 | getIn(propPath) {
|
49 | return path(propPath, this.obj)
|
50 | }
|
51 | }
|
52 |
|
53 | export default State
|