export declare type instanceKey = keyof S; export declare type S = typeof Semigroup; export declare type SemigroupInstance = keyof typeof Semigroup; export declare type SemigroupInstanceType = typeof Semigroup[SemigroupInstance]['_T']; export interface Semigroup { _T: A; concat(a: any, b: any): A; } export declare class NumberSemigroup implements Semigroup { _T: number; concat(a: any, b: any): number; } export declare class ObjectSemigroup implements Semigroup { _T: object; concat(a: any, b: any): object; } export declare class PromiseSemigroup implements Semigroup> { _T: Promise; concat(a: any, b: any): Promise; } export declare class StringSemigroup implements Semigroup { _T: string; concat(a: any, b: any): string; } export declare class ArraySemigroup implements Semigroup> { _T: Array; concat(a: Array, b: Array): Array; } export declare namespace Semigroup { let Number: NumberSemigroup; let String: StringSemigroup; let Array: ArraySemigroup; let Object: ObjectSemigroup; let Promise: PromiseSemigroup; } export declare function concat(a: A, b: A): A;