DEV Community

Toby Inkster
Toby Inkster

Posted on • Originally published at toby.ink

2 1

RFC: new API for Type::Params

Firstly, I'm not planning on breaking compatibility with Type::Params. The new API would live under a different namespace, such as Type::Params2.

The API for Type::Params is currently:

use feature 'state';
use Type::Params qw( compile compile_named_oo );
use Types::Standard -types;

sub function_with_positional_parameters {
  state $check = compile( ArrayRef, Int, Int );
  my ( $list, $start, $end ) = $check->( @_ );

  my @slice = @{$list}[ $start .. $end ];
  return \@slice;
}

sub function_with_named_parameters {
  state $check = compile_named_oo( list => ArrayRef, start => Int, end => Int );
  my ( $arg ) = $check->( @_ );

  my @slice = @{$arg->list}[ $arg->start .. $arg->end ];
  return \@slice;
}
Enter fullscreen mode Exit fullscreen mode

Alternatively, there's:

use Type::Params qw( wrap_subs compile_named_oo );
use Types::Standard -types;

wrap_subs function_with_positional_parameters => [ ArrayRef, Int, Int ];

sub function_with_positional_parameters {
  my ( $list, $start, $end ) = @_;

  my @slice = @{$list}[ $start .. $end ];
  return \@slice;
}

wrap_subs function_with_named_parameters =>
  compile_named_oo( list => ArrayRef, start => Int, end => Int );

sub function_with_named_parameters {
  my ( $arg ) = @_;

  my @slice = @{$arg->list}[ $arg->start .. $arg->end ];
  return \@slice;
}
Enter fullscreen mode Exit fullscreen mode

My suggested API is:

use feature 'state';
use Type::Params2;
use Types::Standard -types;

sub function_with_positional_parameters {
  state $check = signature(
    pos => [ ArrayRef, Int, Int ],
  );
  my ( $list, $start, $end ) = $check->( @_ );

  my @slice = @{$list}[ $start .. $end ];
  return \@slice;
}

sub function_with_named_parameters {
  state $check = signature(
    named => [ list => ArrayRef, start => Int, end => Int ],
  );
  my ( $arg ) = $check->( @_ );

  my @slice = @{$arg->list}[ $arg->start .. $arg->end ];
  return \@slice;
}
Enter fullscreen mode Exit fullscreen mode

It would also support the inside-out technique:

use Type::Params2;
use Types::Standard -types;

signature_for function_with_positional_parameters => (
  pos => [ ArrayRef, Int, Int ],
);

sub function_with_positional_parameters {
  my ( $list, $start, $end ) = @_;

  my @slice = @{$list}[ $start .. $end ];
  return \@slice;
}

signature_for function_with_named_parameters => (
  named => [ list => ArrayRef, start => Int, end => Int ],
);

sub function_with_named_parameters {
  my ( $arg ) = @_;

  my @slice = @{$arg->list}[ $arg->start .. $arg->end ];
  return \@slice;
}
Enter fullscreen mode Exit fullscreen mode

There would be a shortcut for methods:

signature_for method_with_named_parameters => (
  method => 1,
  named  => [ list => ArrayRef, start => Int, end => Int ],
);

sub method_with_named_parameters {
  my ( $self, $arg ) = @_;

  my @slice = @{$arg->list}[ $arg->start .. $arg->end ];
  return \@slice;
}
Enter fullscreen mode Exit fullscreen mode

Comments? Do people think this would be an improvement?

Heroku

This site is built on Heroku

Join the ranks of developers at Salesforce, Airbase, DEV, and more who deploy their mission critical applications on Heroku. Sign up today and launch your first app!

Get Started

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs