| Safe Haskell | Safe-Infered | 
|---|
Data.Cycle
- data Cycle a
 - goLeft :: Cycle a -> Cycle a
 - goRight :: Cycle a -> Cycle a
 - goLR :: Int -> Cycle a -> Cycle a
 - getValue :: Cycle a -> a
 - leftValue :: Cycle a -> a
 - rightValue :: Cycle a -> a
 - nthValue :: Int -> Cycle a -> a
 - takeLR :: Int -> Cycle a -> [a]
 - dropLR :: Int -> Cycle a -> [a]
 - cycleToInfiniteList :: Cycle a -> [a]
 - zipCycle :: Cycle a -> Cycle b -> Cycle (a, b)
 - zipCycleWith :: (a -> b -> c) -> Cycle a -> Cycle b -> Cycle c
 
Documentation
A cyclic doubly linked list.
To create a new Cycle, use 
   fromList, fromFoldable or any of
   the insertion functions from Unfoldable. Elements
   are inserted in front of the current position.
To get the length of the list, use size. 
   To extract all cycle elements, use toList. You can
   also create an infinite list with cycleToInfiniteList.
take, drop and splitAt
   also accept negative values for working backwards (see takeLR and dropLR 
   for details).
In general, any function f working on
   [a] can be adapted for Cycle a by writing fromList . f . toList.
The Monad, Functor, Applicative, Alternative, Monoid and
   Foldable instances work
   like the default instances for lists.
goRight :: Cycle a -> Cycle aSource
Move focus to the element on the right of the current position.
goLeft . goRight == id
goLR :: Int -> Cycle a -> Cycle aSource
Move abs n steps to the left (n < 0) or right (n > 0) or don't move
   at all (n == 0).
rightValue :: Cycle a -> aSource
Get value on the right. error if null c.
nthValue :: Int -> Cycle a -> aSource
Get nth value to the left (n < 0) or right (n > 0) or 
   the current value (n == 0). error if null c.
nthValue = flip (!)
takeLR :: Int -> Cycle a -> [a]Source
Take abs n values starting at the current one and moving 
   to the right (n > 0) or left (n < 0). n can be arbitrary
   big. 
take n = fromList . takeLR n
dropLR :: Int -> Cycle a -> [a]Source
Drop abs n values starting at the current one and moving 
   to the right (n > 0) or left (n < 0). n can be arbitrary
   big.
drop n = fromList . dropLR n
cycleToInfiniteList :: Cycle a -> [a]Source
Convert to an infinite list starting with the current value and moving to the right.