NAME

    immutable - Immutable Data Structures for Perl

SYNOPSIS

        use immutable::0 ':all';
    
        $hash1 = imap(k1 => 123, k2 => 456);
        $k1 = $hash->{k1};                      # 123
    
        $hash1->{k3} = 789;                     # Error
        $hash2 = $hash1->set(k3 => 789);        # Correct
        $hash2->get('k3');                      # 789
    
        delete $hash2->{k3};                    # Error
        $hash3 = $hash2->del('k3');             # Correct
    
        $string = "$hash3";                     # <immutable::map 2 94394857332096>
        $id = $hash3->id;                       # 94394857332096
        $num = $hash3->size;                    # 2
        $hash3->is_empty;                       # false

DESCRIPTION

    The immutable module provides immutable versions of native Perl data
    structures.

    Immutable data makes programs easier to reason about, and is
    foundational for functional programming and concurrency.

    Immutable objects support both a tied interface (for use with Perl
    object access syntax) and an OO interface.

    Mutating operation like $h-{x} = 1> and delete $h-{x}> will throw
    errors. You need to use the OO methods like $h-set(x => 1)> and
    $h-del('x')> which will return a new immutable::map immutable hash
    object. By throwing errors on these operations, it will make things
    obvious when you pass them to existing code that tries to do a mutating
    operation.

EXPORTS

    The immutable module exports a number of sugar functions for creating
    new immutable objects.

      * iobj

      Create an immutable object from a plain scalar object.

      $i_hash = iobj $hash;

      * imap

      Create an immutable hash (immutable::map) object. Takes an even
      number (0 to n) of key and value arguments.

	* $i_hash = imap; # Empty hash

	* $i_hash = imap x = 1, y => 2;>

      * iseq

      Create an immutable array (immutable::seq) object. Takes 0 or more
      scalar values to initialize the array.

	* $i_array = iseq; # Empty array

	* $i_array = iseq 1, 2, 3;

      * iset

      Immutable set object. Not implemented yet.

      * ilist

      Immutable lazy list. Not implemented yet.

      * istr

      Immutable string. Not implemented yet.

      * inum

      Immutable number. Not implemented yet.

      * ibool

      Immutable boolean. Not implemented yet.

OBJECT OPERATIONS AND METHODS

    Each types of immutable object has a class with various methods. The
    immutable objects are also tied so they respond to Perl syntax and
    keyword functions appropriately.

 IMMUTABLE::MAP

      * new

      Takes a list of zero or more key/value scalars. Returns a new
      immutable::map hashref object that is also tied.

      * $imap-{key}>

      Get the hash/map value associated with the key.

      * $imap-get('key')>

      Same as above using method call.

      * $imap-{key} = $val>

      Not allowed. Throws an error.

      * $imap-set(key => $value, ...)>

      Clones the map and adds the key value pairs to it.

      Calling this with no args creates an equivalent clone of the caller.

      * delete $imap-{key}>

      Not allowed. Throws an error.

      * $imap-del('key')>

      Clones the map and deletes the key pair from it.

      * $imap-id>

      Returns an integer id number for the map.

      * $imap-size>

      Returns the number of key value pairs in the map.

      * $imap-is_empty>

      Returns true if the map is empty.

 IMMUTABLE::SEQ

      * new

      Takes a list of zero or more scalars. Returns a new immutable::seq
      arrayref object that is also tied.

      * $iseq-[$i]>

      Get the array/seq value associated with the index.

      * $iseq-get($i)>

      Same as above using method call.

      * $iseq-[$i] = $val>

      Not allowed. Throws an error.

      * $iseq-set($i => $value)>

      Returns a clone of the seq with the value at the index position.

      * $iseq-push($val, ...)>

      Returns a clone of the seq with the values appended.

      * $iseq-pop>

      In scalar context, returns a clone of the seq with the last value
      removed. In list context, returns the clone and the value removed.

      * $iseq-shift>

      In scalar context, returns a clone of the seq with the first value
      removed. In list context, returns the clone and the value removed.

      * $iseq-unshift($val, ...)>

      Returns a clone of the seq with the values appended.

      * $iseq-id>

      Returns an integer id number for the seq.

      * $iseq-size>

      Returns the number of values in the seq.

      * $iseq-is_empty>

      Returns true if the seq is empty.

STATUS

    This module is new and too incomplete, buggy and slow to use for any
    real code.

    It is being developed for use in Lingy, a Perl implementation of
    Clojure, which needs immutable data types.

    Only immutable maps are support in this early version.

    Very little effort is currently placed on performance and memory usage.
    The intent is to use performant and memory efficient XS based
    algorithms once the API stabilizes.

COPYRIGHT AND LICENSE

    Copyright 2023 by Ingy döt Net

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

    See http://www.perl.com/perl/misc/Artistic.html

