Paste: dir-tbl (treat a directory as an assoc)
Author: | dharmatech |
Mode: | factor |
Date: | Mon, 6 Oct 2008 01:46:23 |
Plain Text |
USING: kernel arrays sequences accessors assocs
prettyprint io.files io.encodings.utf8
eval locals ;
IN: dir-tbl
TUPLE: dir-tbl path ;
:: dir-tbl-at* ( KEY TBL -- val ? )
KEY TBL path>> directory keys member?
[
TBL path>> KEY append-path
utf8 file-contents
t
]
[ f f ]
if ;
: dir-tbl-size ( tbl -- n ) path>> directory length ;
:: dir-tbl>alist ( TBL -- assoc )
TBL path>> directory keys
[| KEY | KEY KEY TBL dir-tbl-at* drop 2array ]
map ;
:: dir-tbl-set-at ( VAL KEY TBL -- )
VAL
TBL path>> KEY append-path
utf8
set-file-contents ;
:: dir-tbl-delete-at ( KEY TBL -- ) TBL path>> KEY append-path delete-file ;
: dir-tbl-clear-assoc ( tbl -- ) path>> directory* keys [ delete-file ] each ;
INSTANCE: dir-tbl assoc
M: dir-tbl at* ( key dir-tbl -- val/f ? ) dir-tbl-at* ;
M: dir-tbl assoc-size ( dir-tbl -- n ) dir-tbl-size ;
M: dir-tbl >alist ( dir-tbl -- alist ) dir-tbl>alist ;
M: dir-tbl set-at ( val key tbl -- ) dir-tbl-set-at ;
M: dir-tbl delete-at ( key tbl -- ) dir-tbl-delete-at ;
M: dir-tbl clear-assoc ( tbl -- ) dir-tbl-clear-assoc ;
New Annotation