The enum type is much more complex in Raku than in some other languages, and the details are found in its type description.

This short document will give a simple example of its use as is the usual practice in C-like languages.

Say we have a program that needs to write to various directories; we want a function that, given a directory name, tests it for (1) its existence and (2) whether it can be written to by the user of the program; this implies that there are three possible states from the user perspective: either you can write (CanWrite), or there is no directory (NoDir) or the directory exists, but you cannot write (NoWrite). The results of the test will determine what actions the program takes next.

enum DirStat <CanWrite NoDir NoWrite>;
sub check-dir-status($dir --> DirStat{
    if $dir.IO.d {
        # dir exists, can the program user write to it? 
        my $f = "$dir/.tmp";
        spurt $f"some text";
        CATCH {
            # unable to write for some reason 
            return NoWrite;
        # if we get here we must have successfully written to the dir 
        unlink $f;
        return CanWrite;
    # if we get here the dir must not exist 
    return NoDir;
# test each of three directories by a non-root user 
my @dirs = (
    '/tmp',  # normally writable by any user 
    '/',     # writable only by root 
    '~/tmp'  # a non-existent dir in the user's home dir 
for @dirs -> $dir {
    my $stat = check-dir-status $dir;
    say "status of dir '$dir': $stat";
    if $stat ~~ CanWrite {
        say "  user can write to dir: $dir";
# output 
#   status of dir '/tmp': CanWrite 
#     user can write to dir: /tmp 
#   status of dir '/': NoWrite 
#   status of dir '~/tmp': NoDir