import { Disposable } from '@typed/disposable' import { Effects } from '@typed/effects' import { Either } from '@typed/either' export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'OPTIONS' | 'PATCH' | 'HEAD' export type HttpHeaders = Readonly> export type HttpOptions = { readonly method?: HttpMethod readonly headers?: HttpHeaders readonly body?: string } // @ts-ignore - Allow phantom type export type HttpResponse = { readonly responseText: string readonly status: number readonly statusText: string readonly headers: HttpHeaders } export interface HttpRequest extends Effects>> {} export type HttpCallbacks = { readonly success: (response: HttpResponse) => Disposable readonly failure: (error: Error) => Disposable } export interface HttpEnv { readonly http: (url: string, options: HttpOptions, callbacks: HttpCallbacks) => Disposable } export interface TestHttpEnv extends HttpEnv { readonly getResponses: () => ReadonlyArray> } export type HttpRequestValue = A extends HttpRequest ? R : never