47 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { InputElement } from "./InputElement"
 | 
						|
import { UIEventSource } from "../../Logic/UIEventSource"
 | 
						|
import Combine from "../Base/Combine"
 | 
						|
import BaseUIElement from "../BaseUIElement"
 | 
						|
 | 
						|
export default class CombinedInputElement<T, J, X> extends InputElement<X> {
 | 
						|
    private readonly _a: InputElement<T>
 | 
						|
    private readonly _b: InputElement<J>
 | 
						|
    private readonly _combined: BaseUIElement
 | 
						|
    private readonly _value: UIEventSource<X>
 | 
						|
    private readonly _split: (x: X) => [T, J]
 | 
						|
 | 
						|
    constructor(
 | 
						|
        a: InputElement<T>,
 | 
						|
        b: InputElement<J>,
 | 
						|
        combine: (t: T, j: J) => X,
 | 
						|
        split: (x: X) => [T, J]
 | 
						|
    ) {
 | 
						|
        super()
 | 
						|
        this._a = a
 | 
						|
        this._b = b
 | 
						|
        this._split = split
 | 
						|
        this._combined = new Combine([this._a, this._b])
 | 
						|
        this._value = this._a.GetValue().sync(
 | 
						|
            (t) => combine(t, this._b?.GetValue()?.data),
 | 
						|
            [this._b.GetValue()],
 | 
						|
            (x) => {
 | 
						|
                const [t, j] = split(x)
 | 
						|
                this._b.GetValue()?.setData(j)
 | 
						|
                return t
 | 
						|
            }
 | 
						|
        )
 | 
						|
    }
 | 
						|
 | 
						|
    GetValue(): UIEventSource<X> {
 | 
						|
        return this._value
 | 
						|
    }
 | 
						|
 | 
						|
    IsValid(x: X): boolean {
 | 
						|
        const [t, j] = this._split(x)
 | 
						|
        return this._a.IsValid(t) && this._b.IsValid(j)
 | 
						|
    }
 | 
						|
 | 
						|
    protected InnerConstructElement(): HTMLElement {
 | 
						|
        return this._combined.ConstructElement()
 | 
						|
    }
 | 
						|
}
 |