PreviousUpNext

15.3.412  src/lib/src/map.api

## map.api
#
# Abstract api for applicative-style finite maps
# (dictionaries) over ordered typelocked keys.

# Compiled by:
#     src/lib/std/standard.lib

# Compare to:
#     src/lib/src/set.api
#     src/lib/src/numbered-list.api
#     src/lib/src/tagged-numbered-list.api
#     src/lib/src/map-with-implicit-keys.api

# This api is implemented in:
#     src/lib/src/binary-map-g.pkg
#     src/lib/src/int-binary-map.pkg
#     src/lib/src/int-list-map.pkg
#     src/lib/src/int-red-black-map.pkg
#     src/lib/src/list-map-g.pkg
#     src/lib/src/red-black-map-g.pkg
#     src/lib/src/unt-red-black-map.pkg





api Map {
    #
    package key:  Key;                                          # Key   is from   src/lib/src/key.api

    Map(X);

    empty:  Map(X);                                             # The empty map 

    is_empty:  Map(X) -> Bool;                                  # Return TRUE if and only if the map is empty 

    singleton:  (key::Key, X) -> Map(X);                        # Return the specified singleton map 

    from_list:  List((key::Key, X)) -> Map(X);                  # Construct a map containing given key-val pairs.

    set:   (Map(X), key::Key, X) -> Map(X);
    set' : ((key::Key, X), Map(X)) -> Map(X);
    ($):   (Map(X), (key::Key, X)) -> Map(X);
        #  Insert an item. 

    get:   (Map(X), key::Key)                                   # Look for an item, return NULL if the item doesn't exist 
            ->
            Null_Or(X);

    get_or_raise_exception_not_found:                           # Fetch an item, raise Raise lib_base::NOT_FOUND if key is not found.
           (Map(X), key::Key)                                   # This is intended to be used in cases where it is algorithmically
            ->                                                  # certain that the key must be present in the map.
            X;

    contains_key                                                # Return TRUE, iff the key is in the domain of the map 
        :
        (Map(X), key::Key)
        ->
        Bool;

    preceding_key: (Map(X), key::Key) -> Null_Or(key::Key);
    following_key: (Map(X), key::Key) -> Null_Or(key::Key);

    get_and_drop
        :
        (Map(X), key::Key)                                      # Remove an item, returning new map and THE value removed (or NULL if key was not found).
        ->
        (Map(X), Null_Or(X));

    drop:  (Map(X), key::Key)                                   # Remove an item, returning new map. This is a no-op if key is not found.
            ->
            Map(X);

    first_val_else_null:     Map(X) -> Null_Or(X);
    first_keyval_else_null:  Map(X) -> Null_Or( (key::Key, X) );
        #
        # Return the first item in the map (or NULL if it is empty).

    last_val_else_null:     Map(X) -> Null_Or(X);
    last_keyval_else_null:  Map(X) -> Null_Or( (key::Key, X) );
        #
        # Return the last item in the map (or NULL if it is empty).

    vals_count:  Map(X) ->  Int;
        #
        # Return the number of items in the map.

    vals_list:   Map(X) -> List(X);
    keyvals_list:  Map(X) -> List( (key::Key, X) );
        #
        # Return an ordered list of the items (and their keys) in the map.

    keys_list:  Map(X) -> List(key::Key);
        #
        # Return an ordered list of the keys in the map.

    compare_sequences                                           # Given an ordering on the map's elements,
        :                                                       # return an ordering on the map.
        ((X, X) -> Order)
        ->
        (Map(X), Map(X))
        ->
        Order;


    difference_with:                              (Map(X), Map(X)) -> Map(X);
        #
        # Return a map whose domain contains all keys in first map except
        # those present in second map.

    union_with:        (          (X, X) -> X) -> (Map(X), Map(X)) -> Map(X);
    keyed_union_with:  ((key::Key, X, X) -> X) -> (Map(X), Map(X)) -> Map(X);
        #
        # Return a map whose domain is the union of the domains of the two input
        # maps, using the supplied function to define the map on elements that
        # are in both domains.

    intersect_with:        (          (X, Y) -> Z) -> (Map(X), Map(Y)) -> Map(Z);
    keyed_intersect_with:  ((key::Key, X, Y) -> Z) -> (Map(X), Map(Y)) -> Map(Z);
        #
        # Return a map whose domain is the intersection of the domains of the
        # two input maps, using the supplied function to define the range.

    merge_with:        (          (Null_Or(X), Null_Or(Y)) -> Null_Or(Z)) -> (Map(X), Map(Y)) -> Map(Z);
    keyed_merge_with:  ((key::Key, Null_Or(X), Null_Or(Y)) -> Null_Or(Z)) -> (Map(X), Map(Y)) -> Map(Z);
        #
        # Merge two maps using the given function to control the merge.
        # For each key k in the union of the two maps domains, the function
        # is applied to the image of the key under the map.  If the function
        # returns THE y, then (k, y) is added to the resulting map.

    apply:                    (X -> Void) -> Map(X) -> Void;
    keyed_apply:  ((key::Key, X) -> Void) -> Map(X) -> Void;
        #
        # Apply a function to the entries of the map in map order. 

    map:                   (X  -> Y) -> Map(X) -> Map(Y);
    keyed_map:  ((key::Key, X) -> Y) -> Map(X) -> Map(Y);
        #
        # Create a new map by applying a map function to the
        # name/value pairs in the map.

    fold_forward:        (          (X, Y) -> Y) -> Y -> Map(X) -> Y;
    keyed_fold_forward:  ((key::Key, X, Y) -> Y) -> Y -> Map(X) -> Y;
        #
        # Apply a folding function to the entries of the map
        # in increasing map order.

    fold_backward:        (          (X, Y) -> Y) -> Y -> Map(X) -> Y;
    keyed_fold_backward:  ((key::Key, X, Y) -> Y) -> Y -> Map(X) -> Y;
        #
        # Apply a folding function to the entries of the map
        # in decreasing map order.

    filter:        (           X  -> Bool) -> Map(X) -> Map(X);
    keyed_filter:  ((key::Key, X) -> Bool) -> Map(X) -> Map(X);
        #
        # Filter out those elements of the map that do not satisfy the
        # predicate.  The filtering is done in increasing map order.

    map':        (           X  -> Null_Or(Y)) -> Map(X) -> Map(Y);
    keyed_map':  ((key::Key, X) -> Null_Or(Y)) -> Map(X) -> Map(Y);
        #
        # Map a partial function over the elements of a map
        # in increasing map order.


    all_invariants_hold: Map(X) -> Bool;

    debug_print
        :
        ( Map(X),                       # Print tree structure of this map.
          key::Key -> Void,             # Here's how to print out the keys.
          X                -> Void      # Here's how to print out the vals.
        )
        ->
        Int;
 
    

};                                      # api Map 


## COPYRIGHT (c) 1996 by AT&T Research.  See SMLNJ-COPYRIGHT file for details.
## Subsequent changes by Jeff Prothero Copyright (c) 2010-2015,
## released per terms of SMLNJ-COPYRIGHT.


Comments and suggestions to: bugs@mythryl.org

PreviousUpNext