-
Notifications
You must be signed in to change notification settings - Fork 1
/
FrameCloneNode.ts
40 lines (35 loc) · 1.24 KB
/
FrameCloneNode.ts
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
34
35
36
37
38
39
40
import { DataFrame } from '../../data';
import { PushOptions } from '../../graph/options';
import { Node, NodeOptions } from '../../Node';
/**
* @category Flow shape
*/
export class FrameCloneNode<InOut extends DataFrame> extends Node<InOut, InOut> {
protected options: FrameCloneOptions;
constructor(options?: FrameCloneOptions) {
super(options);
this.on('push', this._onPush.bind(this));
}
private _onPush(frame: InOut, options?: PushOptions): Promise<void> {
return new Promise<void>((resolve) => {
const newFrame: InOut = this.options.repack ? this._repack(frame) : frame.clone();
this.outlets.forEach((outlet) => outlet.push(newFrame, options));
resolve();
});
}
private _repack(frame: InOut): InOut {
const newFrame = new DataFrame();
newFrame.createdTimestamp = frame.createdTimestamp;
frame.getObjects().forEach((object) => {
newFrame.addObject(object.clone());
});
return newFrame as InOut;
}
}
export interface FrameCloneOptions extends NodeOptions {
/**
* Create a new data frame with the added objects
* any data other than data objects is not cloned.
*/
repack?: boolean;
}