Created
August 29, 2023 04:33
-
-
Save kfly8/20e422c144ead129fc57fb172d9df204 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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; | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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