/**
 * Tests for intersections of function types.
 *
 * Note: Flow abuses intersection types to model
 * function overloading, which precludes using a
 * correct intersection of return types in the result.
 *
 * Here we test the special case where return types
 * are equal. Tests of the overloading behavior can
 * be found in tests/overload
 *
 * Definitions lin lib/lib.js
 *
 * @flow
 */

// intersection of function types satisfies union of param types

type F = (_: ObjA) => void;
type G = (_: ObjB) => void;
type FG = (_: ObjA | ObjB) => void;

declare var fun1: F & G;

fun1 as FG;

var fun2: FG = fun1;

// simpler variation
declare var f: ((_: number) => void) & ((_: string) => void);
var g: (_: number | string) => void = f;
