Shapes: Examples

Fields of Arbitrary Type

A shape type can have zero or more fields of arbitrary type.

<?hh

namespace Hack\UserDocumentation\Shapes\Examples\Examples\Arbitrary;

type Complex = shape('real' => float, 'imag' => float);
type Hits = shape('id' => string, 'url' => string, 'count' => int);
type Math = shape('n1' => array<num>,
                  'n2' => (function (array<num>): float));
type APoint<T> = shape('x' => T, 'y' => T);

function take_complex(Complex $c): void {
  echo $c['real'] . ' + ' . $c['imag'] . 'i' . PHP_EOL;
}

function get_hits(Hits $h): void {
  echo 'User with id: ' . $h['id'] . ' has hit ' . $h['url'] . ' ' .
       $h['count'] . ' times.' . PHP_EOL;
}

function do_math(Math $m): void {
  var_dump($m['n2']($m['n1']));
}

function create_point<T>(APoint<T> $p): void {
  var_dump($p);
}

function run(): void {
  take_complex(shape('real' => 4.0, 'imag' => 2.0));
  get_hits(shape('id' => 'Rex', 'url' => 'http://example.com', 'count' => 10));
  do_math(shape('n1' => array(2, 4.0, 2, 999, 1000.23),
    'n2' => function (array<num> $nums): float {
      return array_sum(array_filter($nums, $x ==> is_float($x)));
     }
  ));
  create_point(shape('x' => true, 'y' => false));
}

run();
Output
4 + 2i
User with id: Rex has hit http://example.com 10 times.
float(1004.23)
array(2) {
  ["x"]=>
  bool(true)
  ["y"]=>
  bool(false)
}