PreviousUpNext

15.4.1157  src/lib/std/src/rw-float64-vector.pkg

## rw-float64-vector.pkg

# Compiled by:
#     src/lib/std/src/standard-core.sublib

###                      "It has been said that man is a rational animal.
###
###                       All my life I have been searching for evidence
###                       which could support this."
###
###                                              -- Bertrand Russell



package rw_float64_vector: (weak)  Typelocked_Rw_Vector {               # Typelocked_Rw_Vector  is from   src/lib/std/src/typelocked-rw-vector.api

    # Fast add/subtract avoiding
    # the overflow test:
    #
    infix val --- +++;
    #
    fun x --- y
        =
        inline_t::tu::copyt_tagged_int (inline_t::tu::copyf_tagged_int x -
                                             inline_t::tu::copyf_tagged_int y);

    fun x +++ y
        =
        inline_t::tu::copyt_tagged_int (inline_t::tu::copyf_tagged_int x +
                                             inline_t::tu::copyf_tagged_int y);


    # Unchecked access operations 

    unsafe_set =  inline_t::rw_float64_vector::set;
    unsafe_get =  inline_t::rw_float64_vector::get;

#   ro_unsafe_set =  inline_t::float64_vector::update     # not yet *

    ro_unsafe_get =  inline_t::float64_vector::get;
    ro_length =  inline_t::float64_vector::length;

    Rw_Vector =  runtime::asm::Float64_Rw_Vector;
    Element   =  float64::Float;
    Vector    =  float64_vector::Vector;

    max_len =  core::max_length;


    fun make_rw_vector (0, _)
            =>
            inline_t::rw_float64_vector::new_array0();

        make_rw_vector (len, v)
            =>
            if (inline_t::default_int::ltu (max_len, len))
                #
                raise exception exceptions::SIZE;
            else
                result =  runtime::asm::make_float64_rw_vector  len;

                for (i = 0;  i < len;  ++i) {
                    #
                    unsafe_set (result, i, v);
                };      

                result;
            fi;
        end;


    fun tabulate (0, _)
            =>
            inline_t::rw_float64_vector::new_array0();

        tabulate (len, f)
            =>
            if (inline_t::default_int::ltu (max_len, len))
                #               
                raise exception exceptions::SIZE;
            else
                arr =  runtime::asm::make_float64_rw_vector len;

                fun init i
                    =
                    if (i < len)
                        #
                        unsafe_set (arr,  i,  f i);
                        #
                        init (i+1);
                    fi;

                init 0;

                arr;
            fi;
    end;


    fun from_list []
            =>
            inline_t::rw_float64_vector::new_array0();

        from_list l
            =>
            arr
            where
                fun length ([],     n) =>  n;
                    length (_ ! r,  n) =>  length (r, n+1);
                end;

                len = length (l, 0);

                if (max_len < len)
                    #
                    raise exception  exceptions::SIZE;
                fi;

                arr =  runtime::asm::make_float64_rw_vector len;

                fun init ([],      _)
                        =>
                        ();

                    init (c ! r, i)
                        =>
                        {   unsafe_set (arr, i, c);
                            init (r, i+1);
                        };
                end;

                init (l, 0); 
            end;
    end;

    length  = inline_t::rw_float64_vector::length;

    # Note:  The (_[])   enables   'vec[index]'           notation;
    #        The (_[]:=) enables   'vec[index] := value'  notation;

    get     = inline_t::rw_float64_vector::check_sub;
    (_[])   = inline_t::rw_float64_vector::check_sub;

    set     = inline_t::rw_float64_vector::check_set;
    (_[]:=) = inline_t::rw_float64_vector::check_set;

    fun to_vector a
        =
        float64_vector::tabulate
            ( length a,
               fn i = unsafe_get (a, i)
            );

    fun copy { from, to, di }
        =
        {   sl = length from;
            de = sl + di;

            fun copy_dn (s, d)
                =
                if (s >= 0)
                    #                    
                    unsafe_set (to, d, unsafe_get (from, s));
                    copy_dn (s --- 1, d --- 1);
                fi;

            if (di < 0 or de > length to)
                #
                raise exception SUBSCRIPT;
            else
                copy_dn (sl --- 1, de --- 1);
            fi;
        };

    fun copy_vec { from, to, di }
        =
        {   sl = ro_length from;
            de = sl + di;

            fun copy_dn (s, d)
                =
                if (s >= 0)
                    #
                    unsafe_set (to, d, ro_unsafe_get (from, s));
                    copy_dn (s --- 1, d --- 1);
                fi;

            if (di < 0 or de > length to)
                #
                raise exception  SUBSCRIPT;
            else
                copy_dn (sl --- 1, de --- 1);
            fi;
        };

    fun keyed_apply f arr
        =
        apply 0
        where
            len = length arr;

            fun apply i
                =
                if (i < len) 
                    #
                    f (i, unsafe_get (arr, i));
                    apply (i +++ 1);
                fi;
        end;

    fun apply f arr
        =
        apply 0
        where
            len = length arr;

            fun apply i
                =
                if (i < len)
                    #
                    f (unsafe_get (arr, i));
                    apply (i +++ 1);
                fi;
        end;

    fun modifyi f arr
        =
        mdf 0
        where
            len = length arr;

            fun mdf i
                =
                if (i < len)
                    #
                    unsafe_set (arr, i, f (i, unsafe_get (arr, i)));
                    mdf (i +++ 1);
                fi;
        end;

    fun modify f arr
        =
        mdf 0
        where
            len = length arr;

            fun mdf i
                =
                if (i < len)
                    #
                    unsafe_set (arr, i, f (unsafe_get (arr, i)));
                    mdf (i +++ 1);
                fi;
        end;

    fun keyed_fold_left f init arr
        =
        fold (0, init)
        where
            len = length arr;

            fun fold (i, a)
                =
                if (i >= len)   a;
                else            fold (i +++ 1, f (i, unsafe_get (arr, i), a));
                fi;
        end;

    fun fold_left f init arr
        =
        fold (0, init)
        where
            len = length arr;

            fun fold (i, a)
                =
                if (i >= len)   a;
                else            fold (i +++ 1, f (unsafe_get (arr, i), a));
                fi;
        end;

    fun keyed_fold_right f init arr
        =
        fold (length arr --- 1, init)
        where
            fun fold (i, a)
                =
                if (i < 0)   a;
                else         fold (i --- 1, f (i, unsafe_get (arr, i), a));
                fi;
        end;

    fun fold_right f init arr
        =
        fold (length arr --- 1, init)
        where
            fun fold (i, a)
                =
                if (i < 0)    a;
                else          fold (i --- 1, f (unsafe_get (arr, i), a));
                fi;
        end;

    fun findi p arr
        =
        fnd 0
        where
            len = length arr;

            fun fnd i
                =
                if (i >= len)
                    #
                    NULL;
                else
                    x = unsafe_get (arr, i);
                    #
                    if (p (i, x))  THE (i, x);
                    else           fnd (i +++ 1);
                    fi;
                fi;
        end;

    fun find p arr
        =
        fnd 0
        where
            len = length arr;

            fun fnd i
                =
                if (i >= len)
                    #
                    NULL;
                else
                    x = unsafe_get (arr, i);

                    if (p x)  THE x;
                    else      fnd (i +++ 1);
                    fi;
                fi;
        end;

    fun exists p arr
        =
        ex 0
        where
            len = length arr;

            fun ex i
                =
                i < len
                and
                (p (unsafe_get (arr, i)) or ex (i +++ 1));
        end;

    fun all p arr
        =
        al 0
        where
            len = length arr;

            fun al i
                =
                i >= len
                or
                (p (unsafe_get (arr, i)) and al (i +++ 1));
        end;

    fun collate c (a1, a2)
        =
        col 0
        where
            l1  = length a1;
            l2  = length a2;
            l12 = inline_t::ti::min (l1, l2);

            fun col i
                =
                if (i >= l12)
                    #                    
                    int_guts::compare (l1, l2);
                else
                    case (c (unsafe_get (a1, i), unsafe_get (a2, i)))
                        #
                        EQUAL   =>  col (i +++ 1);
                        unequal =>  unequal;
                    esac;
                fi;
        end;
};                                                      # package rw_float64_vector




Comments and suggestions to: bugs@mythryl.org

PreviousUpNext