UNPKG

3.29 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, '__esModule', { value: true });
4
5var actions = require('./actions.js');
6var Actor = require('./Actor.js');
7var utils = require('./utils.js');
8
9/**
10 * Returns an actor behavior from a reducer and its initial state.
11 *
12 * @param transition The pure reducer that returns the next state given the current state and event.
13 * @param initialState The initial state of the reducer.
14 * @returns An actor behavior
15 */
16
17function fromReducer(transition, initialState) {
18 return {
19 transition: transition,
20 initialState: initialState
21 };
22}
23function fromPromise(promiseFn) {
24 var initialState = {
25 error: undefined,
26 data: undefined,
27 status: 'pending'
28 };
29 return {
30 transition: function (state, event, _a) {
31 var parent = _a.parent,
32 id = _a.id,
33 observers = _a.observers;
34
35 switch (event.type) {
36 case 'fulfill':
37 parent === null || parent === void 0 ? void 0 : parent.send(actions.doneInvoke(id, event.data));
38 return {
39 error: undefined,
40 data: event.data,
41 status: 'fulfilled'
42 };
43
44 case 'reject':
45 parent === null || parent === void 0 ? void 0 : parent.send(actions.error(id, event.error));
46 observers.forEach(function (observer) {
47 observer.error(event.error);
48 });
49 return {
50 error: event.error,
51 data: undefined,
52 status: 'rejected'
53 };
54
55 default:
56 return state;
57 }
58 },
59 initialState: initialState,
60 start: function (_a) {
61 var self = _a.self;
62 promiseFn().then(function (data) {
63 self.send({
64 type: 'fulfill',
65 data: data
66 });
67 }, function (reason) {
68 self.send({
69 type: 'reject',
70 error: reason
71 });
72 });
73 return initialState;
74 }
75 };
76}
77function spawnBehavior(behavior, options) {
78 if (options === void 0) {
79 options = {};
80 }
81
82 var state = behavior.initialState;
83 var observers = new Set();
84 var mailbox = [];
85 var flushing = false;
86
87 var flush = function () {
88 if (flushing) {
89 return;
90 }
91
92 flushing = true;
93
94 while (mailbox.length > 0) {
95 var event_1 = mailbox.shift();
96 state = behavior.transition(state, event_1, actorCtx);
97 observers.forEach(function (observer) {
98 return observer.next(state);
99 });
100 }
101
102 flushing = false;
103 };
104
105 var actor = Actor.toActorRef({
106 id: options.id,
107 send: function (event) {
108 mailbox.push(event);
109 flush();
110 },
111 getSnapshot: function () {
112 return state;
113 },
114 subscribe: function (next, handleError, complete) {
115 var observer = utils.toObserver(next, handleError, complete);
116 observers.add(observer);
117 observer.next(state);
118 return {
119 unsubscribe: function () {
120 observers.delete(observer);
121 }
122 };
123 }
124 });
125 var actorCtx = {
126 parent: options.parent,
127 self: actor,
128 id: options.id || 'anonymous',
129 observers: observers
130 };
131 state = behavior.start ? behavior.start(actorCtx) : state;
132 return actor;
133}
134
135exports.fromPromise = fromPromise;
136exports.fromReducer = fromReducer;
137exports.spawnBehavior = spawnBehavior;