/** @module combinators.ts */
/* tslint:disable */
export const I = ( x: A ): A => x
export const K = ( x: A ) => ( y: any ): A => x
export const A = ( f: ( x: A ) => B ) => ( x: A ): B => f( x )
export const T = ( x: A ) => ( f: ( a: A ) => B ): B => f( x )
export const W = ( f: ( a: A ) => ( b: A ) => B ) => ( x: A ): B => f( x )( x )
export const C = ( f: ( x: A ) => ( y: B ) => C ) => ( y: B ) => ( x: A ): C => f( x )( y )
export const B = ( f: ( b: B ) => C ) => ( g: ( a: A ) => B ) => ( a: A ): C => f( g( a ) )
export const S = ( f: ( a: A ) => ( b: B ) => C ) => ( g: ( a: A ) => B ) => ( a: A ): C => f( a )( g( a ) )
export const P = ( f: ( a: A ) => ( b: A ) => B ) => ( g: ( a: X|Y ) => A ) => ( x: X ) => ( y: Y ): B => f( g( x ) )( g( y ) )
export const Y = ( f: ( fn: Function ) => A ): A => ( ( g ) => g( g ) )( ( g ) => f( ( x ) => g( g )( x ) ) )