forked from goatslacker/alt
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatomic.js
33 lines (28 loc) · 815 Bytes
/
atomic.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import makeFinalStore from './makeFinalStore'
import { isFunction } from './functions'
function makeAtomicClass(alt, StoreModel) {
class AtomicClass extends StoreModel {
constructor() {
super()
this.on('error', () => alt.rollback())
}
}
AtomicClass.displayName = StoreModel.displayName || StoreModel.name
return AtomicClass
}
function makeAtomicObject(alt, StoreModel) {
StoreModel.lifecycle = StoreModel.lifecycle || {}
StoreModel.lifecycle.error = () => {
alt.rollback()
}
return StoreModel
}
export default function atomic(alt) {
const finalStore = makeFinalStore(alt)
finalStore.listen(() => alt.takeSnapshot())
return (StoreModel) => {
return isFunction(StoreModel)
? makeAtomicClass(alt, StoreModel)
: makeAtomicObject(alt, StoreModel)
}
}