packages feed

marionetta-0.1.0.3: Data/List/Zipper.hs

-----------------------------------------------------------------------------
--
-- Module      :  Data.List.Zipper
-- Copyright   :  Paolo Veronelli
-- License     :  BSD3
--
-- Maintainer  :  paolo.veronelli@gmail.com
-- Stability   :  Stable
-- Portability :  Portable
--
-- | Zipper structure on list
--
-----------------------------------------------------------------------------



module Data.List.Zipper where

data Zipper a = Zipper [a] [a] 
instance Functor Zipper where
	fmap f (Zipper xs ys) = Zipper (fmap f xs) (fmap f ys)

sinistra z@(Zipper [] _) = z
sinistra (Zipper (x:xs) ys) = Zipper xs (x:ys)

destra z@(Zipper _ [x]) = z
destra (Zipper xs (y:ys)) = Zipper (y:xs) ys

isLast (Zipper [] _) = True
isLast _ = False

mkZipper x = Zipper [] [x]
valore (Zipper _ (x:_)) = x

inserisci f (Zipper xs (y:ys)) = Zipper (y:xs) ((f y):ys)

elimina (Zipper [] [y]) = Nothing 
elimina (Zipper (x:xs) [y]) = Just (Zipper xs [x])
elimina (Zipper xs (y:ys)) = Just (Zipper xs ys)

modifica f (Zipper xs (y:ys)) = Zipper xs (f y : ys)
elementi (Zipper xs ys) = reverse xs ++ ys