UNPKG

862 BJavaScriptView Raw
1import assocPath from 'ramda/src/assocPath'
2import path from 'ramda/src/path'
3
4import clone from './utils/clone'
5
6class 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
53export default State