Skip to content

Instantly share code, notes, and snippets.

@avalonalex
Last active March 6, 2018 13:14
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save avalonalex/8120708 to your computer and use it in GitHub Desktop.
Save avalonalex/8120708 to your computer and use it in GitHub Desktop.
An implementation of List Zip for moving `cursor` back and forth through list.
{-# OPTIONS -Wall -Werror -fwarn-tabs -fno-warn-type-defaults #-}
module Zip where
newtype Zip a = Z ([a], [a]) deriving Show
mkZip :: [a] -> Zip a
mkZip l = Z ([], l)
current :: Zip a -> a
current (Z (_, [])) = error "End of stream!"
current (Z (_, x:_)) = x
forward :: Zip a -> Zip a
forward (Z (_, [])) = error "End of stream!"
forward (Z (b, x:f)) = Z (x:b, f)
backward :: Zip a -> Zip a
backward (Z ([], _)) = error "Start of stream!"
backward (Z (x:b, f)) = Z (b, x:f)
start :: Zip a -> Bool
start (Z ([], _)) = True
start _ = False
lastToEnd :: Zip a -> Bool
lastToEnd (Z (_, [_])) = True
lastToEnd _ = False
end :: Zip a -> Bool
end (Z (_, [])) = True
end _ = False
findForward :: Eq a => a -> Zip a -> Bool
findForward a (Z (_, f)) = a `elem` f
findBackward :: Eq a => a -> Zip a -> Bool
findBackward a (Z (b, _)) = a `elem` b
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment