Skip to content

Instantly share code, notes, and snippets.

@kfly8
Created August 29, 2023 04:33
Show Gist options
  • Select an option

  • Save kfly8/20e422c144ead129fc57fb172d9df204 to your computer and use it in GitHub Desktop.

Select an option

Save kfly8/20e422c144ead129fc57fb172d9df204 to your computer and use it in GitHub Desktop.
use v5.38;
package User {
sub is_admin($user) {
$user->{role} eq 'admin'
}
sub is_editor($user) {
$user->{role} eq 'editor'
}
sub is_reader($user) {
$user->{role} eq 'reader'
}
sub is_alive($user) {
$user->{status} eq 'alive'
}
sub is_dead($user) {
$user->{status} ne 'alive'
}
}
use Test2::V0;
my $user = {
name => 'John',
role => 'admin',
status => 'alive',
};
ok User::is_admin($user);
ok User::is_alive($user);
sub hello($user) {
if (User::is_dead($user)) {
return "You're already dead $user->{name}";
}
elsif (User::is_admin($user)) {
return "Hi, Admin $user->{name}";
}
else {
return "Hello, $user->{name}";
}
}
is hello($user), 'Hi, Admin John';
done_testing;
use v5.38;
package User {
sub new {
my ($class, %args) = @_;
bless {
name => $args{name},
role => $args{role},
status => $args{status},
}, $class;
}
sub is_admin($self) {
$self->{role} eq 'admin'
}
sub is_editor($self) {
$self->{role} eq 'editor'
}
sub is_reader($self) {
$self->{role} eq 'reader'
}
sub is_alive($self) {
$self->{status} eq 'alive'
}
sub is_dead($self) {
$self->{status} ne 'alive'
}
sub hello($self) {
if ($self->is_dead) {
return "You're already dead $self->{name}";
}
elsif ($self->is_admin) {
return "Hi, Admin $self->{name}";
}
else {
return "Hello, $self->{name}";
}
}
}
use Test2::V0;
my $user = User->new(
name => 'John',
role => 'admin',
status => 'alive',
);
ok $user->is_admin;
ok $user->is_alive;
is $user->hello, 'Hi, Admin John';
done_testing;
use v5.38;
package User {
use Types::Standard -types;
use Type::Alias -alias => [
'AdminRole',
'EditorRole',
'ReaderRole',
'Role',
'AliveStatus',
'DeadStatus',
'Status',
'User',
'AdminUser',
'DeadUser',
'AliveUser',
];
type AdminRole => 'admin';
type EditorRole => 'editor';
type ReaderRole => 'reader';
type Role => AdminRole | EditorRole | ReaderRole;
type AliveStatus => 'alive';
type DeadStatus => ~AliveStatus;
type Status => AliveStatus | DeadStatus;
my $User = {
name => Str,
role => Role,
status => Status,
};
type User => $User;
type AdminUser => {
%$User,
role => AdminRole,
};
type DeadUser => {
%$User,
status => DeadStatus,
};
type AliveUser => {
%$User,
status => AliveStatus,
};
}
use Test2::V0;
use Type::Utils qw( compile_match_on_type );
my $user = {
name => 'John',
role => 'admin',
status => 'alive',
};
ok User::AdminUser->check($user);
ok User::AliveUser->check($user);
sub hello($user){
state $hello = compile_match_on_type(
User::DeadUser, sub { "You're already dead $user->{name}" },
User::AdminUser, sub { "Hi, Admin $user->{name}!" },
User::User, sub { "Hello, $user->{name}!" },
);
$hello->($user);
}
is hello($user), 'Hi, Admin John!';
done_testing;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment