3 from iTasks.UI.Editor.Controls import :: ChoiceNode{..}
12 import Control.Applicative
14 import Control.Monad.State
15 import Control.Monad.Identity
16 import System.FilePath
18 import System.Directory
21 import iTasks => qualified >>=, >>|, forever, sequence, return
23 derive class iTask RTree, ChoiceNode, FileInfo, Tm
25 Start w = startEngine (selectFile "/opt/clean/lib/StdLib" () False) w
27 selectFile :: FilePath d Bool -> Task [FilePath] | toPrompt d
28 selectFile root p m = tbind
29 (accWorldOSError (appFst (fmap numberTree) o recurseDirectory root ""))
30 \tree->editSelection p m (SelectInTree (pure o toChoiceNode fp2cn) fromTree) tree []
32 numberTree :: ((RTree a) -> RTree (Int, a))
33 numberTree = flip evalState zero o foldTree \a cs->
34 (\lvs i->RNode (i, a) lvs) <$> sequence cs <*> getState <* modify ((+)one)
36 toChoiceNode :: (Int a -> ChoiceNode) -> ((RTree (Int, a)) -> ChoiceNode)
37 toChoiceNode tfun = foldTree \a cs->{ChoiceNode | uncurry tfun a & children=cs}
39 fp2cn :: Int (FilePath, FileInfo) -> ChoiceNode
40 fp2cn i (fp, fi) = {id =if fi.directory (~i) i,label=dropDirectory fp,icon=Nothing,expanded=False,children=[]}
42 fromTree :: (RTree (Int, (FilePath, a))) [Int] -> [FilePath]
43 fromTree tree sel = [f\\(i, (f, _))<-leafs tree | isMember i sel]
45 recurseDirectory :: !FilePath !FilePath !*World -> *(MaybeOSError (RTree (FilePath, FileInfo)), !*World)
46 recurseDirectory acc fp w
48 # (mfi, w) = getFileInfo fp w
49 | isError mfi = (liftError mfi, w)
51 | not fi.directory = (Ok $ RNode (fp, fi) [], w)
52 # (mcs, w) = readDirectory fp w
53 | isError mfi = (liftError mcs, w)
54 # (cs, w) = appFst sequence $ mapSt (recurseDirectory fp) (filter (\c->not (elem c [".", ".."])) (fromOk mcs)) w
55 = (RNode (fp, fi) <$> cs, w)