import { StylusState } from './stylus';
export interface StrokeProtocol<TConfig = unknown, TState = unknown, TResult = unknown> {
    resume(config: TConfig, prevState: TState): StrokeDrawingContext<TConfig, TState, TResult>;
    down(config: TConfig, stylusState: StylusState): StrokeDrawingContext<TConfig, TState, TResult>;
}
export interface StrokeDrawingContext<TConfig = unknown, TState = unknown, TResult = unknown> {
    getConfig(): TConfig;
    getConfig<TStroke extends StrokeProtocol>(target: TStroke): ConfigOfStrokeProtocol<TStroke>;
    getState(): TState;
    getState<TStroke extends StrokeProtocol>(target: TStroke): StateOfStrokeProtocol<TStroke>;
    move(stylusState: StylusState): void;
    up(stylusState: StylusState): TResult;
}
export declare type StrokeDrawingContextFromProtocol<T> = T extends StrokeProtocol<infer TConfig, infer TState, infer TResult> ? StrokeDrawingContext<TConfig, TState, TResult> : StrokeDrawingContext<unknown, unknown, unknown>;
export declare type ConfigOfStrokeProtocol<T> = T extends StrokeProtocol<infer TConfig, unknown, unknown> ? TConfig : unknown;
export declare type StateOfStrokeProtocol<T> = T extends StrokeProtocol<unknown, infer TState, unknown> ? TState : unknown;
export declare type ResultOfStrokeProtocol<T> = T extends StrokeProtocol<unknown, unknown, infer TResult> ? TResult : unknown;
