factor/extra/file-trees/file-trees.factor

48 lines
1.8 KiB
Factor
Raw Normal View History

2009-05-03 13:29:29 -04:00
USING: accessors arrays delegate delegate.protocols
io.pathnames kernel locals sequences
2009-05-26 15:40:57 -04:00
vectors make strings ui.frp.signals ui.frp.gadgets ;
2009-05-01 12:06:20 -04:00
IN: file-trees
TUPLE: walkable-vector vector father ;
CONSULT: sequence-protocol walkable-vector vector>> ;
M: walkable-vector set-nth [ vector>> set-nth ] 3keep nip
father>> swap children>> vector>> push ;
TUPLE: tree node comment children ;
2009-05-03 13:29:29 -04:00
CONSULT: sequence-protocol tree children>> ;
2009-05-01 12:06:20 -04:00
: file? ( tree -- ? ) children>> [ node>> ".." = not ] filter empty? ;
: <dir-tree> ( {start,comment} -- tree ) first2 walkable-vector new vector new >>vector
[ tree boa dup children>> ] [ ".." -rot tree boa ] 2bi swap (>>father) ;
2009-05-01 12:06:20 -04:00
DEFER: (tree-insert)
: tree-insert ( path tree -- ) [ unclip <dir-tree> ] [ children>> ] bi* (tree-insert) ;
2009-05-01 12:06:20 -04:00
:: (tree-insert) ( path-rest path-head tree-children -- )
tree-children [ node>> path-head node>> = ] find nip
[ path-rest swap tree-insert ]
[
path-head tree-children push
path-rest [ path-head tree-insert ] unless-empty
] if* ;
: add-paths ( pathseq -- {{name,path}} )
"" [ [ "/" glue dup ] keep swap 2array , ] [ reduce drop ] f make ;
2009-05-22 23:27:35 -04:00
: go-to-path ( path tree -- tree' ) over empty? [ nip ]
[ [ unclip ] [ children>> ] bi* swap [ swap node>> = ] curry find nip go-to-path ] if ;
: find-root ( pathseq -- root ) dup flip
[ [ dupd = [ ] [ drop f ] if ] reduce1 ] find-last drop
[ first ] dip head-slice >string path-components ;
: create-tree ( file-list -- tree ) [ find-root ]
[ [ path-components add-paths ] map { "/" "/" } <dir-tree> [ [ tree-insert ] curry each ] keep ] bi
go-to-path ;
2009-05-03 13:29:29 -04:00
: <dir-table> ( tree-model -- table )
<frp-list*> [ node>> 1array ] >>quot
2009-05-31 12:57:05 -04:00
[ selected-value>> [ file? not ] <filter> swap <switch> ]
[ swap >>model ] bi ;