module Tree where
import Core_datatype
import Vtslib
import Edlib
import Type_defs
import X_interface
data TREE a b c
= Tree a
[TREE a b c]
( Option b )
( c -> TREE a b c -> TREE a b c )
( Option ( TREE a b c ))
data Tree_state a b c
= TreeSt ( TREE a b c )
[( Int , TREE a b c )]
c
{-
(******************************************************************************)
(* All tree editor functions are of type *)
(* X.xinterface -> ('a,'b,'c) tree_state -> ('a,'b'c) tree_state *)
(******************************************************************************)
-}
{-
(******************************************************************************)
(* Take a function of type ('a tree -> 'a) tree and turn it into a tree *)
(* editor function *)
(******************************************************************************)
-}
lift_non_io_tree_fn tree_fn t@(TreeSt tr tr_st gst)
= tree_fn tr |.|
( \ res -> reTurn ( TreeSt res tr_st gst ))
`handle`
failtest t
{-
(******************************************************************************)
(* Take a function of type (xinterface -> 'a tree -> 'a) tree and turn *)
(* it into a tree editor function *)
(******************************************************************************)
-}
lift_io_tree_fn tree_fn t@(TreeSt tr tr_st gst)
= tree_fn tr /./
( \ fn_res -> reTurn ( TreeSt fn_res tr_st gst ))
`handle`
failtest t
lift_non_io_tree_st_fn tree_fn tr_tr_st
= tree_fn tr_tr_st |.|
reTurn
`handle`
failtest tr_tr_st
lift_io_tree_st_fn tree_fn tr_tr_st
= tree_fn tr_tr_st
`handle`
(\ _ -> reTurn tr_tr_st )
failtest t s
= x_error s /./
( \ _ -> reTurn t )
replace :: b -> Int -> [b] -> MayBe [b] String
replace = replace' []
replace' :: [b] -> b -> Int -> [b] -> MayBe [b] String
replace' rl x 0 (_ : l) = Ok ( rl ++ (x : l))
replace' rl x i (y : l) = replace' (rl <: y) x (i-1) l
replace' _ x i l = Bad " Match"
undo (Tree _ _ _ _ (SOME tr)) = tr
undo tr@(Tree _ _ _ _ NONE) = tr
down i (TreeSt tr@(Tree _ trL _ _ _) tr_st gst)
= TreeSt (trL!!i) ((i,tr) : tr_st) gst
up (TreeSt tr ( (i, Tree x trL dn vf tropt) : tr_st) gst)
= replace tr i trL |||
exp
where
exp rl = Ok ( TreeSt tr2 tr_st gst )
where
tr2 = if done && not (is_complete tr)
then if is_complete tr
then tr1
else mk_incomplete tr1
else (vf gst tr1 ) --`handle` \ _ -> tr1)
tr1 = Tree x rl dn vf tropt
done = is_complete tr1
up tr_st = Ok tr_st
is_complete (Tree _ _ NONE _ _) = False
is_complete (Tree _ _ (SOME _) _ _) = True
mk_incomplete (Tree x trL _ vf tropt)
= Tree x trL NONE vf tropt
top (tr_st@(TreeSt _ (_:_) gst))
= up tr_st ||| top
top tr_st = Ok tr_st
search p f t = search_tree p f t []
search_tree p f t@(Tree _ l _ _ _) il
= if p t
then (if f then search_sub_tree p f l 0 il else []) ++ [(il,t)]
else search_sub_tree p f l 0 il
search_sub_tree p f [] _ _ = []
search_sub_tree p f (t:l) i il
= search_tree p f t (i:il) ++ search_sub_tree p f l (i+1) il
goto [] tr_st = tr_st
goto (i:il) tr_st = goto il (down i tr_st)
tree_undo = lift_non_io_tree_fn ( mk_ok undo )
tree_top = lift_non_io_tree_st_fn top
tree_up = lift_non_io_tree_st_fn up
tree_down = lift_non_io_tree_st_fn . mk_ok . down
tree_search p f t = search p f t
tree_goto a b = goto a b
|