-- | Replacements for unhelpful Haskell list functions.
--   If the standard versions are passed an empty list then we don't
--   get a proper source location.
module DDC.Data.ListUtils
        ( takeHead
        , takeTail
        , takeInit
        , index)
where


-- | Take the head of a list, or `Nothing` if it's empty.
takeHead :: [a] -> Maybe a
takeHead xs
 = case xs of
        []      -> Nothing
        _       -> Just (head xs)


-- | Take the tail of a list, or `Nothing` if it's empty.
takeTail :: [a] -> Maybe [a]
takeTail xs
 = case xs of
        []      -> Nothing
        _       -> Just (tail xs)


-- | Take the init of a list, or `Nothing` if it's empty.
takeInit :: [a] -> Maybe [a]
takeInit xs
 = case xs of
        []      -> Nothing
        _       -> Just (init xs)


-- | Retrieve the element at the given index,
--   or `Nothing if it's not there.
index :: [a] -> Int -> Maybe a
index [] _              = Nothing
index (x : _)  0        = Just x
index (_ : xs) i        = index xs (i - 1)