forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			58 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { InputElement } from "./InputElement"
 | 
						|
import { Store, UIEventSource } from "../../Logic/UIEventSource"
 | 
						|
 | 
						|
export default class InputElementMap<T, X> extends InputElement<X> {
 | 
						|
    private readonly _inputElement: InputElement<T>
 | 
						|
    private isSame: (x0: X, x1: X) => boolean
 | 
						|
    private readonly fromX: (x: X) => T
 | 
						|
    private readonly toX: (t: T) => X
 | 
						|
    private readonly _value: UIEventSource<X>
 | 
						|
 | 
						|
    constructor(
 | 
						|
        inputElement: InputElement<T>,
 | 
						|
        isSame: (x0: X, x1: X) => boolean,
 | 
						|
        toX: (t: T) => X,
 | 
						|
        fromX: (x: X) => T,
 | 
						|
        extraSources: Store<any>[] = []
 | 
						|
    ) {
 | 
						|
        super()
 | 
						|
        this.isSame = isSame
 | 
						|
        this.fromX = fromX
 | 
						|
        this.toX = toX
 | 
						|
        this._inputElement = inputElement
 | 
						|
        const self = this
 | 
						|
        this._value = inputElement.GetValue().sync(
 | 
						|
            (t) => {
 | 
						|
                const newX = toX(t)
 | 
						|
                const currentX = self.GetValue()?.data
 | 
						|
                if (isSame(currentX, newX)) {
 | 
						|
                    return currentX
 | 
						|
                }
 | 
						|
                return newX
 | 
						|
            },
 | 
						|
            extraSources,
 | 
						|
            (x) => {
 | 
						|
                return fromX(x)
 | 
						|
            }
 | 
						|
        )
 | 
						|
    }
 | 
						|
 | 
						|
    GetValue(): UIEventSource<X> {
 | 
						|
        return this._value
 | 
						|
    }
 | 
						|
 | 
						|
    IsValid(x: X): boolean {
 | 
						|
        if (x === undefined) {
 | 
						|
            return false
 | 
						|
        }
 | 
						|
        const t = this.fromX(x)
 | 
						|
        if (t === undefined) {
 | 
						|
            return false
 | 
						|
        }
 | 
						|
        return this._inputElement.IsValid(t)
 | 
						|
    }
 | 
						|
 | 
						|
    protected InnerConstructElement(): HTMLElement {
 | 
						|
        return this._inputElement.ConstructElement()
 | 
						|
    }
 | 
						|
}
 |