Thanks to Gabriele and others, who re-lit my dim bulb to the fact that

    find block1 block2             select block1 block2

are looking for the first SUBSEQUENCE of the first argument equal to
the second argument, whereas

    find/only block1 block2        select/only block1 block2

are looking for the first ELEMENT of the first argument equal to the
second argument.

That loud "smack" you may have heard a few nights ago was my palm
smartly hitting my not-so-smart forehead as I uttered those immortal
words, "Silly me!"

Having gotten that far(with a little help from my friends), I did a
bit of testing and found that  find/only  and  select/only  seem
quite willing to work properly with non-block second arguments as
well!  With that discovery firmly in hand, I put together an updated
object-oriented associative data store, attached below.

Enjoy all, and (as always) comments/feedback are welcome!

-jn-
REBOL [
    Title: "Minimal Associative Data Store"
    File:  %assoco.r
    Date:  20-Sep-2000
    Author: "Joel Neely"
    Purpose: {
        Revised implementation of associative data store,
        using arbitrary data types for keys and values.
        Updated to use /only for key processing.
    }
]

assoco: make object! [
    _keys: copy []
    _vals: copy []
    clear: func [] [_keys: copy []  _vals: copy []]
    empty?: func [] [system/words/empty? _keys]
    length?: func [] [system/words/length? _keys]
    new: func [/local r] [r: make self []  r/clear  r]
    put: func [k [any-type!] v [any-type!] /local p] [
        either found? p: find/only _keys k [
            change/only at _vals index? p v
        ][
            append/only _keys k
            append/only _vals v
        ]
        v
    ]
    get: func [k [any-type!] /local p] [
        either none? p: find/only _keys k [
            none
        ][
            pick _vals index? p
        ]
    ]
    delete: func [k [any-type!] /local p v] [
        either none? p: find/only _keys k [
            none
        ][
            k: pick   _vals p: index? p
            remove at _keys p
            remove at _vals p
            k
        ]
    ]
    keys: func [] [copy _keys]
]

Reply via email to