pointedlist-0.2: Data/List/PointedList/Circular.hs
module Data.List.PointedList.Circular
( -- Re-export many of the regular PointedList features
module Data.List.PointedList
-- And, of course, export the alternatives here
, next
, previous
, delete
, deleteLeft
, deleteRight
) where
import Data.List.PointedList
( PointedList(..)
, singleton
, fromList
, fromListEnd
, focus
, insert
, insertLeft
, insertRight
, length
, positions
, contextMap
, move
, find
, index
)
import qualified Data.List.PointedList as PL
next :: PointedList a -> PointedList a
next pl@(PointedList [] b []) = pl
next (PointedList a b []) = let (x:xs) = reverse a in
PointedList [] x (xs ++ [b])
next pl = PL.tryNext pl
previous :: PointedList a -> PointedList a
previous pl@(PointedList [] b []) = pl
previous (PointedList [] b c ) = let (x:xs) = reverse c in
PointedList (xs ++ [b]) x []
previous pl = PL.tryPrevious pl
-- | An alias of 'deleteRight'.
delete :: PointedList a -> Maybe (PointedList a)
delete = deleteRight
-- | Possibly delete the element at the focus, then move the element on the
-- left to the focus. If no element is on the left, focus on the element to
-- the right. If the deletion will cause the list to be empty, return
-- @Nothing@.
deleteLeft :: PointedList a -> Maybe (PointedList a)
deleteLeft (PointedList [] _ []) = Nothing
deleteLeft (PointedList (l:ls) _ rs) = Just $ PointedList ls l rs
deleteLeft (PointedList [] _ rs) = let (x:xs) = reverse rs in
Just $ PointedList xs x []
-- | Possibly delete the element at the focus, then move the element on the
-- right to the focus. If no element is on the right, focus on the element to
-- the left. If the deletion will cause the list to be empty, return
-- @Nothing@.
deleteRight :: PointedList a -> Maybe (PointedList a)
deleteRight (PointedList [] _ [] ) = Nothing
deleteRight (PointedList ls _ (r:rs)) = Just $ PointedList ls r rs
deleteRight (PointedList ls _ [] ) = let (x:xs) = reverse ls in
Just $ PointedList [] x xs