-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Simple functional ring type. -- -- Simple functional bidirectional ring type. Given that the ring -- terminiology clashes with certain mathematical branches, we're using -- the term CList or CircularList instead. @package data-clist @version 0.0.2 -- | A simple purely functional circular list, or ring, data type. -- -- Lets describe what we mean by ring. A ring is a circular data -- structure such that if you continue rotating the ring, you'll -- eventually return to the element you first observed. -- -- All of our analogies involve sitting at a table who's top surface -- rotates about its center axis (think of those convenient rotating -- platforms one often finds in an (Americanized) Chinese Restaurant). -- -- Only the closest item on the table is avialable to us. In order to -- reach other elements on the table, we need to rotate the table to the -- left or the right. -- -- Our convention for this problem says that rotations to the right are a -- forward motion while rotations to the left are backward motions. -- -- We'll use the following circular list for our examples: -- --
--     8 7 6
--    9     5
--   A       4
--   B       3
--    C     2
--     D 0 1
--       ^
--   
-- -- The pointer at the bottom represents our position at the table. The -- element currently in front of is is referred to as the focus. -- So, in this case, our focus is 0. -- -- If we were to rotate the table to the right using the rotR -- operation, we'd have the following table. -- --
--     9 8 7
--    A     6
--   B       5
--   C       4
--    D     3
--     0 1 2
--       ^
--   
-- -- This yeilds 1 as our new focus. Rotating this table left would return -- 0 to the focus position. module Data.CircularList -- | A functional ring type. data CList a -- | An empty CList. empty :: CList a -- | Make a (balanced) CList from a list. fromList :: [a] -> CList a -- | Starting with the focus, go left and accumulate all elements of the -- CList in a list. leftElements :: CList a -> [a] -- | Starting with the focus, go right and accumulate all elements of the -- CList in a list. rightElements :: CList a -> [a] -- | Make a list from a CList. toList :: CList a -> [a] -- | Make a CList into an infinite list. toInfList :: CList a -> [a] -- | Return the focus of the CList. focus :: CList a -> Maybe a -- | Insert an element into the CList as the new focus. The old focus is -- now the next element to the left. insertL :: a -> CList a -> CList a -- | Insert an element into the CList as the new focus. The old focus is -- now the next element to the right. insertR :: a -> CList a -> CList a -- | Remove the focus from the CList. The new focus is the next element to -- the left. removeL :: CList a -> CList a -- | Remove the focus from the CList. removeR :: CList a -> CList a -- | Rotate the focus to the next (right) element. rotR :: CList a -> CList a -- | Rotate the focus to the previous (left) element. rotL :: CList a -> CList a -- | Balance the CList. Equivalent to `fromList . toList` balance :: CList a -> CList a -- | Move all elements to the left side of the CList. packL :: CList a -> CList a -- | Move all elements to the right side of the CList. packR :: CList a -> CList a -- | Returns true if the CList is empty. isEmpty :: CList a -> Bool -- | Return the size of the CList. size :: CList a -> Int instance (Eq a) => Eq (CList a) instance Functor CList instance (Arbitrary a) => Arbitrary (CList a) instance (Show a) => Show (CList a)