public function visitArray($data, Type $type, Context $context)
 {
     if (!is_array($data)) {
         throw new RuntimeException(sprintf('Expected array, but got %s: %s', gettype($data), json_encode($data)));
     }
     // If no further parameters were given, keys/values are just passed as is.
     if (!$type->hasParam(0)) {
         $this->setData($data);
         return $data;
     }
     switch ($type->countParams()) {
         case 1:
             // Array is a list.
             $listType = $type->getParam(0);
             $result = [];
             foreach ($data as $v) {
                 $result[] = $context->accept($v, $listType);
             }
             $this->setData($result);
             return $result;
         case 2:
             // Array is a map.
             $keyType = $type->getParam(0);
             $entryType = $type->getParam(1);
             $result = [];
             foreach ($data as $k => $v) {
                 $result[$context->accept($k, $keyType)] = $context->accept($v, $entryType);
             }
             $this->setData($result);
             return $result;
         default:
             throw new RuntimeException(sprintf('Array type cannot have more than 2 parameters, but got %s.', json_encode($type->getParams())));
     }
 }
 protected function getElementType(Type $type)
 {
     if (0 === $type->countParams()) {
         return null;
     }
     $params = $type->getParams();
     if (isset($params[1]) && $params[1] instanceof Type) {
         return $params[1];
     }
     return $params[0];
 }