34 lines
1.1 KiB
Plaintext
34 lines
1.1 KiB
Plaintext
USING: accessors arrays delegate delegate.protocols
|
|
io.pathnames kernel locals namespaces prettyprint sequences
|
|
ui.frp vectors ;
|
|
IN: file-trees
|
|
|
|
! There should be optional extra information you can provide
|
|
TUPLE: tree node children ;
|
|
CONSULT: sequence-protocol tree children>> ;
|
|
|
|
: <dir-tree> ( start -- tree ) V{ } clone
|
|
[ tree boa dup children>> ] [ ".." swap tree boa ] bi swap push ;
|
|
|
|
DEFER: (tree-insert)
|
|
|
|
: tree-insert ( path tree -- ) [ unclip <dir-tree> ] [ children>> ] bi* (tree-insert) ;
|
|
:: (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* ;
|
|
|
|
: create-tree ( file-list -- tree ) [ path-components ] map
|
|
t <dir-tree> [ [ tree-insert ] curry each ] keep ;
|
|
|
|
: find-path ( tree -- string ) dup node>> tuck t =
|
|
[ 2drop f ] [ children>> first find-path "/" glue ] if ;
|
|
|
|
: <dir-table> ( tree-model -- table )
|
|
<frp-list*> [ node>> 1array ] >>quot
|
|
[ selected-value>> <switch> ]
|
|
[ swap >>model ] bi
|
|
[ find-path ] >>val-quot ; |