module Data.Tree.NavigatableTree.XPathAxis
where
import Data.Maybe ( maybeToList )
import Data.Tree.NavigatableTree.Class
import Control.Arrow ( (>>>) )
import Control.Monad ( (>=>) )
maybeStar :: (a -> Maybe a) -> (a -> [a])
maybeStar :: forall a. (a -> Maybe a) -> a -> [a]
maybeStar a -> Maybe a
f a
x = a
x forall a. a -> [a] -> [a]
: forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (forall a. (a -> Maybe a) -> a -> [a]
maybeStar a -> Maybe a
f) (a -> Maybe a
f a
x)
maybePlus :: (a -> Maybe a) -> (a -> [a])
maybePlus :: forall a. (a -> Maybe a) -> a -> [a]
maybePlus a -> Maybe a
f a
x = forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] (forall a. (a -> Maybe a) -> a -> [a]
maybeStar a -> Maybe a
f) (a -> Maybe a
f a
x)
{-# INLINE maybePlus #-}
parentAxis :: NavigatableTree t => t a -> [t a]
parentAxis :: forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
parentAxis = forall a. Maybe a -> [a]
maybeToList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. NavigatableTree t => t a -> Maybe (t a)
mvUp
{-# INLINE parentAxis #-}
ancestorAxis :: NavigatableTree t => t a -> [t a]
ancestorAxis :: forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
ancestorAxis = forall a. (a -> Maybe a) -> a -> [a]
maybePlus forall (t :: * -> *) a. NavigatableTree t => t a -> Maybe (t a)
mvUp
{-# INLINE ancestorAxis #-}
ancestorOrSelfAxis :: NavigatableTree t => t a -> [t a]
ancestorOrSelfAxis :: forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
ancestorOrSelfAxis = forall a. (a -> Maybe a) -> a -> [a]
maybeStar forall (t :: * -> *) a. NavigatableTree t => t a -> Maybe (t a)
mvUp
{-# INLINE ancestorOrSelfAxis #-}
childAxis :: NavigatableTree t => t a -> [t a]
childAxis :: forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
childAxis = (forall (t :: * -> *) a. NavigatableTree t => t a -> Maybe (t a)
mvDown forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> forall a. Maybe a -> [a]
maybeToList) forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> forall a. (a -> Maybe a) -> a -> [a]
maybeStar forall (t :: * -> *) a. NavigatableTree t => t a -> Maybe (t a)
mvRight
{-# INLINE childAxis #-}
descendantAxis :: NavigatableTree t => t a -> [t a]
descendantAxis :: forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
descendantAxis = forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
descendantOrSelfAxis forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> forall a. [a] -> [a]
tail
{-# INLINE descendantAxis #-}
descendantOrSelfAxis :: NavigatableTree t => t a -> [t a]
descendantOrSelfAxis :: forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
descendantOrSelfAxis = forall {t :: * -> *} {a}.
NavigatableTree t =>
[t a] -> t a -> [t a]
visit []
where
visit :: [t a] -> t a -> [t a]
visit [t a]
k t a
t = t a
t forall a. a -> [a] -> [a]
: forall b a. b -> (a -> b) -> Maybe a -> b
maybe [t a]
k ([t a] -> t a -> [t a]
visit' [t a]
k) (forall (t :: * -> *) a. NavigatableTree t => t a -> Maybe (t a)
mvDown t a
t)
visit' :: [t a] -> t a -> [t a]
visit' [t a]
k t a
t = [t a] -> t a -> [t a]
visit (forall b a. b -> (a -> b) -> Maybe a -> b
maybe [t a]
k ([t a] -> t a -> [t a]
visit' [t a]
k) (forall (t :: * -> *) a. NavigatableTree t => t a -> Maybe (t a)
mvRight t a
t)) t a
t
revDescendantOrSelfAxis :: NavigatableTree t => t a -> [t a]
revDescendantOrSelfAxis :: forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
revDescendantOrSelfAxis t a
t
= t a
t forall a. a -> [a] -> [a]
: forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
revDescendantOrSelfAxis (forall a. [a] -> [a]
reverse forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
childAxis t a
t)
followingSiblingAxis :: NavigatableTree t => t a -> [t a]
followingSiblingAxis :: forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
followingSiblingAxis = forall a. (a -> Maybe a) -> a -> [a]
maybePlus forall (t :: * -> *) a. NavigatableTree t => t a -> Maybe (t a)
mvRight
{-# INLINE followingSiblingAxis #-}
precedingSiblingAxis :: NavigatableTree t => t a -> [t a]
precedingSiblingAxis :: forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
precedingSiblingAxis = forall a. (a -> Maybe a) -> a -> [a]
maybePlus forall (t :: * -> *) a. NavigatableTree t => t a -> Maybe (t a)
mvLeft
{-# INLINE precedingSiblingAxis #-}
selfAxis :: NavigatableTree t => t a -> [t a]
selfAxis :: forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
selfAxis = (forall a. a -> [a] -> [a]
:[])
{-# INLINE selfAxis #-}
followingAxis :: NavigatableTree t => t a -> [t a]
followingAxis :: forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
followingAxis = forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
ancestorOrSelfAxis forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
followingSiblingAxis forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
descendantOrSelfAxis
precedingAxis :: NavigatableTree t => t a -> [t a]
precedingAxis :: forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
precedingAxis = forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
ancestorOrSelfAxis forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
precedingSiblingAxis forall (m :: * -> *) a b c.
Monad m =>
(a -> m b) -> (b -> m c) -> a -> m c
>=> forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
revDescendantOrSelfAxis
mvToRoot :: NavigatableTree t => t a -> t a
mvToRoot :: forall (t :: * -> *) a. NavigatableTree t => t a -> t a
mvToRoot = forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
ancestorOrSelfAxis forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> forall a. [a] -> a
last
{-# INLINE mvToRoot #-}
isAtRoot :: NavigatableTree t => t a -> Bool
isAtRoot :: forall (t :: * -> *) a. NavigatableTree t => t a -> Bool
isAtRoot = forall (t :: * -> *) a. Foldable t => t a -> Bool
null forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (t :: * -> *) a. NavigatableTree t => t a -> [t a]
ancestorAxis
{-# INLINE isAtRoot #-}