/* @flow */
type $Function1 = (arg: A) => B;
type _Function1Value> = B; // eslint-disable-line
type $Function1Value, A> = _Function1Value;
var toString = (value) => String(value)
var toNumber = (value) => parseFloat(value) || 0
type NumberXString = ((value: number) => string) & ((value: string) => number)
// var numberXString: NumberXString = (value: number | string) => {
// if (typeof value === 'string') {
// return 1
// }
// return String(value)
// }
type ToStringRetVal = $Function1Value
type ToNumberRetVal = $Function1Value
;(toString: (val: any) => ToStringRetVal)
declare var x: ToStringRetVal
declare var y: ToNumberRetVal
;(x: string)
// $ExpectError
;(x: boolean)
// $ExpectError
;(x: number)
;(y: number)
// $ExpectError
;(y: string)
function fnValueReturner> (fn: F, v: V): $Function1Value {
return fn(v)
}
;(fnValueReturner(toString, 1234): string)
// $ExpectError
;(fnValueReturner(toString, 1234): number)
type ShouldBeNumber = $Function1Value
declare var num: ShouldBeNumber
;(num: number)
// $ExpectError
;(num: string)