#! /usr/bin/env perl

use 5.022;
use warnings;
use experimentals;
use Regexp::Optimizer;

my @builtins;
my $builtins_regex  = join '|', reverse sort @builtins;
   $builtins_regex  = qr{$builtins_regex};
my $optimized_regex = Regexp::Optimizer->new->optimize($builtins_regex);

say $optimized_regex;

#use Benchmark qw( cmpthese );
#
#say $];
#cmpthese 100000, {
#     std => sub { for (@builtins) { m/$builtins_regex/ or die } },
#     opt => sub { for (@builtins) { m/$optimized_regex/ or die } },
#};


BEGIN {
    @builtins = (
           'abs',
           'accept',
           'alarm',
           'atan2',
           'bind',
           'binmode',
           'bless',
           'break',
           'caller',
           'chdir',
           'chmod',
           'chomp',
           'chop',
           'chown',
           'chr',
           'chroot',
           'close',
           'closedir',
           'connect',
           'continue',
           'cos',
           'crypt',
           'dbmclose',
           'dbmopen',
#          'default',
           'defined',
           'delete',
           'die',
           'do',
           'dump',
           'each',
           'endgrent',
           'endhostent',
           'endnetent',
           'endprotoent',
           'endpwent',
           'endservent',
           'eof',
           'eval',
           'evalbytes',
           'exec',
           'exists',
           'exit',
           'exp',
           'fc',
           'fcntl',
           'fileno',
           'flock',
           'fork',
           'format',
           'formline',
           'getc',
           'getgrent',
           'getgrgid',
           'getgrnam',
           'gethostbyaddr',
           'gethostbyname',
           'gethostent',
           'getlogin',
           'getnetbyaddr',
           'getnetbyname',
           'getnetent',
           'getpeername',
           'getpgrp',
           'getppid',
           'getpriority',
           'getprotobyname',
           'getprotobynumber',
           'getprotoent',
           'getpwent',
           'getpwnam',
           'getpwuid',
           'getservbyname',
           'getservbyport',
           'getservent',
           'getsockname',
           'getsockopt',
#          'given',
           'glob',
           'gmtime',
           'goto',
           'grep',
           'hex',
           'import',
           'index',
           'int',
           'ioctl',
           'join',
           'keys',
           'kill',
           'last',
           'lc',
           'lcfirst',
           'length',
           'link',
           'listen',
           'local',
           'localtime',
           'lock',
           'log',
           'lstat',
           'map',
           'mkdir',
           'msgctl',
           'msgget',
           'msgrcv',
           'msgsnd',
#          'my',
           'next',
#          'no',
           'oct',
           'open',
           'opendir',
           'ord',
#          'our',
           'pack',
           'package',
           'pipe',
           'pop',
           'pos',
           'print',
           'printf',
           'prototype',
           'push',
           'quotemeta',
           'rand',
           'read',
           'readdir',
           'readline',
           'readlink',
           'readpipe',
           'recv',
           'redo',
           'ref',
           'rename',
           'require',
           'reset',
           'return',
           'reverse',
           'rewinddir',
           'rindex',
           'rmdir',
           'say',
           'scalar',
           'seek',
           'seekdir',
           'select',
           'semctl',
           'semget',
           'semop',
           'send',
           'setgrent',
           'sethostent',
           'setnetent',
           'setpgrp',
           'setpriority',
           'setprotoent',
           'setpwent',
           'setservent',
           'setsockopt',
           'shift',
           'shmctl',
           'shmget',
           'shmread',
           'shmwrite',
           'shutdown',
           'sin',
           'sleep',
           'socket',
           'socketpair',
           'sort',
           'splice',
           'split',
           'sprintf',
           'sqrt',
           'srand',
           'stat',
           'state',
           'study',
#          'sub',
           'substr',
           'symlink',
           'syscall',
           'sysopen',
           'sysread',
           'sysseek',
           'system',
           'syswrite',
           'tell',
           'telldir',
           'tie',
           'tied',
           'time',
           'times',
           'truncate',
           'uc',
           'ucfirst',
           'umask',
           'undef',
           'unlink',
           'unpack',
           'unshift',
           'untie',
#          'use',
           'utime',
           'values',
           'vec',
           'wait',
           'waitpid',
           'wantarray',
           'warn',
#          'when',
           'write',
           '-r',      # File is readable by effective uid/gid.
           '-w',      # File is writable by effective uid/gid.
           '-x',      # File is executable by effective uid/gid.
           '-o',      # File is owned by effective uid.
           '-R',      # File is readable by real uid/gid.
           '-W',      # File is writable by real uid/gid.
           '-X',      # File is executable by real uid/gid.
           '-O',      # File is owned by real uid.
           '-e',      # File exists.
           '-z',      # File has zero size (is empty).
           '-s',      # File has nonzero size (returns size in bytes).
           '-f',      # File is a plain file.
           '-d',      # File is a directory.
           '-l',      # File is a symbolic link.
           '-p',      # File is a named pipe (FIFO), or Filehandle is a pipe.
           '-S',      # File is a socket.
           '-b',      # File is a block special file.
           '-c',      # File is a character special file.
           '-t',      # Filehandle is opened to a tty.
           '-u',      # File has setuid bit set.
           '-g',      # File has setgid bit set.
           '-k',      # File has sticky bit set.
           '-T',      # File is an ASCII text file (heuristic guess).
           '-B',      # File is a "binary" file (opposite of ?T).
           '-M',      # Script start time minus file modification time, in days.
           '-A',      # Same for access time.
           '-C',      # Same for inode change time (Unix, may differ for other platforms)
    );
}
