-- ------------------------------------------------------------

{- |
   Module     : Control.Arrow.NTreeEdit
   Copyright  : Copyright (C) 2011 Uwe Schmidt
   License    : MIT

   Maintainer : Uwe Schmidt (uwe\@fh-wedel.de)
   Stability  : experimental
   Portability: portable

   arrows for efficient editing of rose trees

-}

-- ------------------------------------------------------------

module Control.Arrow.NTreeEdit
where

import Control.Arrow
import Control.Arrow.ArrowIf
import Control.Arrow.ArrowList
import Control.Arrow.ListArrow

import Data.Maybe
import Data.Tree.NTree.TypeDefs
import Data.Tree.NTree.Edit

-- ------------------------------------------------------------

-- | Edit parts of a rose tree
--
-- The subtrees to be modified are selected by the first part of the IfThen pairs
-- The modification by the second part

editNTreeA              :: [IfThen (LA (NTree b) c) (LA (NTree b) (NTree b))] ->
                           LA (NTree b) (NTree b)
editNTreeA cs           = arrL $ editNTreeBottomUp ef
    where
    ef                  = listToMaybe . (runLA . foldr (\ (g :-> h) -> ifA g (listA h)) none $ cs)

fmapNTreeA              :: (b -> Maybe b) -> LA (NTree b) (NTree b)
fmapNTreeA f            = arr $ mapNTree' f

-- eof ------------------------------------------------------------