NAME
    UV::Util - Some utility functions from libUV.

WARNING
    UV::Util is being released as a learning process that will hopefully be
    folded into a more complete set of modules allowing use of libUV with
    Perl later. In other words, this will be more useful later. If it
    happens to be useful now, that's awesome. If not, hopefully it will be
    soon. Until then, please let me know of any errors during installation
    or of anything I can do to make this better.

SYNOPSIS
      #!/usr/bin/env perl
      use strict;
      use warnings;
      use feature ':5.14';

      use Data::Dumper::Concise qw(Dumper);
      use UV::Util;
      use Syntax::Keyword::Try;

      my $res;
      try {
        $res = UV::Util::cpu_info();
      }
      catch {
        die "Aw, man. $@";
      }

DESCRIPTION
    This module provides access to a few of the functions in the
    miscellaneous libUV <http://docs.libuv.org/en/v1.x/misc.html> utilities.
    While it's extremely unlikely, all functions here can throw an exception
    on error unless specifically stated otherwise in the function's
    description.

CONSTANTS
    UV::Util makes the following constants available that represent
    different handle types
    <http://docs.libuv.org/en/latest/handle.html#c.uv_handle_type>.

  UV_UNKNOWN_HANDLE
  UV_ASYNC
  UV_CHECK
  UV_FS_EVENT
  UV_FS_POLL
  UV_HANDLE
  UV_IDLE
  UV_NAMED_PIPE
  UV_POLL
  UV_PREPARE
  UV_PROCESS
  UV_STREAM
  UV_TCP
  UV_TIMER
  UV_TTY
  UV_UDP
  UV_SIGNAL
  UV_FILE
  UV_HANDLE_TYPE_MAX
FUNCTIONS
    All functions provided here provide a Perl interface to their libUV
    <http://docs.libuv.org/en/latest/misc.html> equivalents.

  cpu_info
        use Data::Dumper;
        use UV::Util;
        use Syntax::Keyword::Try;

        my $res;
        try { $res = UV::Util::cpu_info(); }
        catch { die "Aw, man. $@"; }
        say Dumper $res;
        # [
        #   {
        #     cpu_times => {
        #       idle => "1157161200",
        #       irq => 19912800,
        #       nice => 242400,
        #       sys => 8498700,
        #       user => 39428000
        #     },
        #     model => "Intel(R) Core(TM) i7-7700HQ CPU \@ 2.80GHz",
        #     speed => 1048
        #   },
        #   {
        #     cpu_times => {
        #       idle => 16922900,
        #       irq => 846300,
        #       nice => 371800,
        #       sys => 6491400,
        #       user => 34690000
        #     },
        #     model => "Intel(R) Core(TM) i7-7700HQ CPU \@ 2.80GHz",
        #     speed => 899
        #   }
        # ]

    This function <http://docs.libuv.org/en/v1.x/misc.html#c.uv_cpu_info>
    returns an array reference full of hashrefs. Each hashref represents an
    available CPU on your system. "cpu_times", "model", and "speed" will be
    supplied for each.

  get_free_memory
        use UV::Util;
        use Syntax::Keyword::Try;

        my $res;
        try { $res = UV::Util::get_free_memory(); }
        catch { die "Aw, man. $@"; }
        say $res; # 23052402688

    This function returns an unsigned integer representing the number of
    bytes of free memory available.

  get_total_memory
        use UV::Util;
        use Syntax::Keyword::Try;

        my $res;
        try { $res = UV::Util::get_total_memory(); }
        catch { die "Aw, man. $@"; }
        say $res; # 33452101632

    This function returns an unsigned integer representing the number of
    bytes of total memory in the system.

  getrusage
        use Data::Dumper;
        use UV::Util;
        use Syntax::Keyword::Try;

        my $res;
        try { $res = UV::Util::getrusage(); }
        catch { die "Aw, man. $@"; }
        say Dumper $res;
        # {
        #   ru_idrss => 0,
        #   ru_inblock => 0,
        #   ru_isrss => 0,
        #   ru_ixrss => 0,
        #   ru_majflt => 0,
        #   ru_maxrss => 10132,
        #   ru_minflt => 1624,
        #   ru_msgrcv => 0,
        #   ru_msgsnd => 0,
        #   ru_nivcsw => 1,
        #   ru_nsignals => 0,
        #   ru_nswap => 0,
        #   ru_nvcsw => 1,
        #   ru_oublock => 0,
        #   ru_stime => "0.005963",
        #   ru_utime => "0.02801"
        # }

    This function <http://docs.libuv.org/en/v1.x/misc.html#c.uv_getrusage>
    returns a hash reference of resource metrics for the current process.

  guess_handle_type
        use UV::Util;
        use Syntax::Keyword::Try;

        my $res;
        try { $res = UV::Util::guess_handle_type(\*STDIN); }
        catch { die "Aw, man. $@"; }
        say "yay!" if ($res == UV::Util::UV_TTY);

    This function
    <http://docs.libuv.org/en/latest/misc.html#c.uv_guess_handle> takes in a
    reference to a handle (e.g. "\*STDIN") and returns an integer that
    represents one of the CONSTANTS above.

  hrtime
        use UV::Util;

        # does not throw exceptions
        my $time = UV::Util::hrtime();

    This function <http://docs.libuv.org/en/latest/misc.html#c.uv_hrtime>
    returns the current high-resolution real time. This is expressed in
    nanoseconds. It is relative to an arbitrary time in the past. It is not
    related to the time of day and therefore not subject to clock drift. The
    primary use is for measuring performance between intervals.

    Not every platform can support nanosecond resolution; however, this
    value will always be in nanoseconds.

  interface_addresses
        use Data::Dumper qw(Dumper);
        use UV::Util;
        use Syntax::Keyword::Try;

        my $res;
        try { $res = UV::Util::interface_addresses(); }
        catch { die "Aw, man. $@"; }
        say Dumper $res;
        # [
        #   {
        #     address => "127.0.0.1",
        #     is_internal => 1,
        #     mac => "00:00:00:00:00:00",
        #     name => "lo",
        #     netmask => "255.0.0.0"
        #   },
        # ]

    This function
    <http://docs.libuv.org/en/latest/misc.html#c.uv_interface_addresses>
    returns an array reference containing hash references representing each
    of your available interfaces.

  loadavg
        use Data::Dumper qw(Dumper);
        use UV::Util;

        # does not throw exceptions
        my $res = UV::Util::loadavg();
        say Dumper $res;
        # [
        #   "0.43212890625",
        #   "0.39599609375",
        #   "0.27880859375"
        # ]

    This function <http://docs.libuv.org/en/latest/misc.html#c.uv_loadavg>
    returns an array reference containing the load average
    <http://en.wikipedia.org/wiki/Load_(computing)>.

    On Windows, this will always return "[0,0,0]" as it's not implemented.

  resident_set_memory
        use Data::Dumper qw(Dumper);
        use UV::Util;
        use Syntax::Keyword::Try;

        my $res;
        try { $res = UV::Util::resident_set_memory(); }
        catch { die "Aw, man. $@"; }
        say Dumper $res; # 10473472

    This function
    <http://docs.libuv.org/en/latest/misc.html#c.uv_resident_set_memory>
    returns an unsigned integer representing the resident set size (RSS) for
    the current process.

  uptime
        use Data::Dumper qw(Dumper);
        use UV::Util;
        use Syntax::Keyword::Try;

        my $res;
        try { $res = UV::Util::uptime(); }
        catch { die "Aw, man. $@"; }
        say Dumper $res; # 603468

    This function <http://docs.libuv.org/en/latest/misc.html#c.uv_uptime>
    returns a float representing the current system uptime.

  version
        use UV::Util;

        say UV::Util::version();
        # 1.9.1

    This function <http://docs.libuv.org/en/v1.x/version.html> returns the
    libUV version number as a string. Does not throw errors.

COPYRIGHT AND LICENSE
    Copyright 2017, Chase Whitener.

    This library is free software; you can redistribute it and/or modify it
    under the same terms as Perl itself.