4 import System.Directory
10 import qualified Control.Monad as CM
11 import Control.Applicative
12 import Control.Monad.Identity
13 import Control.Monad.State
16 derive class iTask RTree, FileInfo, Tm
18 Start w = startEngine (selectFile "select a file" "/opt/clean") w
20 selectFile :: !d !FilePath -> Task FilePath | toPrompt d
21 selectFile d root = accWorld (createDirectoryTree root (Just 1)) >>= \tree->
22 withShared tree \stree->let numberedtree = mapRead numberTree stree in
24 editSharedSelectionWithShared d False selOpt numberedtree ssel
25 -|| whileUnchanged (ssel >*< numberedtree) (\(sel, tree)->case sel of
26 [i] = case find ((==)i o fst) (leafs tree) of
27 Just (i, (fp, Ok {directory=True}))
28 = accWorld (createDirectoryTree fp (Just 1))
29 @ flip (mergeIn i) tree
30 >>= \newtree->set ([], newtree) (ssel >*< stree) @? const NoValue
34 -|| viewSharedInformation "tree" [] (mapRead (drawRTree o fmap toSingleLineText) numberedtree)
38 mergeIn j newtree = foldTree \(i, t) cs->if (i == j) newtree (RNode t cs)
40 unstable a = treturn a @? \(Value a _)->Value a False
42 selOpt :: SelectOption (RTree (Int, (FilePath, MaybeOSError FileInfo))) (Int, (FilePath, MaybeOSError FileInfo))
44 (\tree->[{foldTree fp2cn tree & label=root}])
45 (\tree sel->[t\\t=:(i, _)<-leafs tree | isMember i sel])
47 fp2cn (i, (fp, mfi)) cs =
49 , label=dropDirectory fp
55 numberTree :: ((RTree a) -> RTree (Int, a))
56 numberTree = flip evalState zero o foldTree \a cs->
57 (\lvs i->RNode (i, a) lvs) <$> 'CM'.sequence cs <*> getState <* modify inc