From b68d3c94a7196035350bbcd7a269276525885327 Mon Sep 17 00:00:00 2001 From: James Cash Date: Sat, 8 Nov 2008 01:44:53 -0500 Subject: [PATCH] Adding linked-assocs --- basis/linked-assocs/authors.txt | 2 + basis/linked-assocs/linked-assocs-docs.factor | 3 ++ .../linked-assocs/linked-assocs-tests.factor | 26 +++++++++++++ basis/linked-assocs/linked-assocs.factor | 38 +++++++++++++++++++ basis/linked-assocs/summary.txt | 1 + basis/linked-assocs/tags.txt | 1 + 6 files changed, 71 insertions(+) create mode 100644 basis/linked-assocs/authors.txt create mode 100644 basis/linked-assocs/linked-assocs-docs.factor create mode 100644 basis/linked-assocs/linked-assocs-tests.factor create mode 100644 basis/linked-assocs/linked-assocs.factor create mode 100644 basis/linked-assocs/summary.txt create mode 100644 basis/linked-assocs/tags.txt diff --git a/basis/linked-assocs/authors.txt b/basis/linked-assocs/authors.txt new file mode 100644 index 0000000000..35a4db1737 --- /dev/null +++ b/basis/linked-assocs/authors.txt @@ -0,0 +1,2 @@ +Slava Pestov +James Cash diff --git a/basis/linked-assocs/linked-assocs-docs.factor b/basis/linked-assocs/linked-assocs-docs.factor new file mode 100644 index 0000000000..74a5fb52ff --- /dev/null +++ b/basis/linked-assocs/linked-assocs-docs.factor @@ -0,0 +1,3 @@ +IN: linked-assocs +USING: help.markup help.syntax ; + diff --git a/basis/linked-assocs/linked-assocs-tests.factor b/basis/linked-assocs/linked-assocs-tests.factor new file mode 100644 index 0000000000..3ac590041b --- /dev/null +++ b/basis/linked-assocs/linked-assocs-tests.factor @@ -0,0 +1,26 @@ +! Copyright (C) 2008 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: kernel sequences assocs tools.test linked-assocs ; +IN: linked-assocs.test + +{ { 1 2 3 } } [ + 1 "b" pick set-at + 2 "c" pick set-at + 3 "a" pick set-at + values +] unit-test + +{ 2 t } [ + 1 "b" pick set-at + 2 "c" pick set-at + 3 "a" pick set-at + "c" swap at* +] unit-test + +{ { 2 3 4 } { "c" "a" "d" } } [ + 1 "a" pick set-at + 2 "c" pick set-at + 3 "a" pick set-at + 4 "d" pick set-at + [ values ] [ keys ] bi +] unit-test \ No newline at end of file diff --git a/basis/linked-assocs/linked-assocs.factor b/basis/linked-assocs/linked-assocs.factor new file mode 100644 index 0000000000..f9849324df --- /dev/null +++ b/basis/linked-assocs/linked-assocs.factor @@ -0,0 +1,38 @@ +! Copyright (C) 2008 Slava Pestov, James Cash. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors assocs arrays kernel deques dlists sequences hashtables fry ; +IN: linked-assocs + +TUPLE: linked-assoc assoc dlist ; + +: ( -- assoc ) + 0 linked-assoc boa ; + +M: linked-assoc assoc-size assoc>> assoc-size ; + +M: linked-assoc at* assoc>> at* tuck [ obj>> ] when swap ; + +> push-back* ; + +: remove-from-dlist ( key dlist -- ) + swap '[ _ = ] delete-node-if ; +PRIVATE> + +M: linked-assoc set-at + [ add-to-dlist ] 2keep + assoc>> set-at ; + +M: linked-assoc delete-at + [ [ assoc>> ] [ dlist>> ] bi [ at ] dip '[ _ delete-node ] when* ] + [ assoc>> delete-at ] + 2bi ; + +: dlist>seq ( dlist -- seq ) + [ ] pusher [ dlist-each ] dip ; + +M: linked-assoc >alist + dlist>> dlist>seq ; + +INSTANCE: linked-assoc assoc diff --git a/basis/linked-assocs/summary.txt b/basis/linked-assocs/summary.txt new file mode 100644 index 0000000000..54b0d14d4c --- /dev/null +++ b/basis/linked-assocs/summary.txt @@ -0,0 +1 @@ +Assocs that yield items in insertion order diff --git a/basis/linked-assocs/tags.txt b/basis/linked-assocs/tags.txt new file mode 100644 index 0000000000..031765c41b --- /dev/null +++ b/basis/linked-assocs/tags.txt @@ -0,0 +1 @@ +assocs