As a follow-up to the previous post, I also put together a function
library equivalent to the OO version.  (I know this is reinventing
the wheel, but I wanted total equivalence for reasons that will be
made clear in the following post.)

-jn-
REBOL [
    Title: "Minimal Associative Data Store - Function Version"
    File:  %assocf.r
    Date:  20-Sep-2000
    Author: "Joel Neely"
    Purpose: {
        Function-based implementation of associative data store,
        using object for data only, with arbitrary data types
        for keys and values.
    }
]

assoc.object: make object! [
    _keys: copy []
    _vals: copy []
]

assoc.clear: func [ads [object!]] [
    ads/_keys: copy []
    ads/_vals: copy []
    ads
]

assoc.empty?: func [ads [object!]] [system/words/empty? ads/_keys]

assoc.length?: func [ads [object!]] [system/words/length? ads/_keys]

assoc.new: func [/local r] [r: make assoc.object []  assoc.clear r]

assoc.put: func [ads [object!] k [any-type!] v [any-type!] /local p] [
    either found? p: find/only ads/_keys k [
            change/only at ads/_vals index? p v
    ][
        append/only ads/_keys k
        append/only ads/_vals v
    ]
    v
]

assoc.get: func [ads [object!] k [any-type!] /local p] [
    either none? p: find/only ads/_keys k [
        none
    ][
        pick ads/_vals index? p
    ]
]

assoc.delete: func [ads [object!] k [any-type!] /local p v] [
    either none? p: find/only ads/_keys k [
        none
    ][
        k: pick   ads/_vals p: index? p
        remove at ads/_keys p
        remove at ads/_vals p
        k
    ]
]

assoc.keys: func [ads [object!]] [copy ads/_keys]

Reply via email to