-- | Redefined index-related functions for Data.List
module Data.List.Index (
    module Data.Index,
    module Data.List.Index
    ) where

import Data.Index
import Prelude hiding ((!!), take, drop, splitAt)
import qualified Data.List as List

-- |
-- >>> [1..7] !! 1
-- 2
-- >>> [1..7] !! end
-- 7
-- >>> [1..7] !! (end-2)
-- 5
-- >>> [1..7] !! mid
-- 4
(!!) :: [a] -> Index [] Int -> a
t !! idx = run t $ do
    i <- idx
    return $ t List.!! i

-- |
-- >>> take 10 ['a'..'z']
-- "abcdefghij"
-- >>> take (mid - 3) ['a'..'z']
-- "abcdefghij"
take :: Index [] Int -> [a] -> [a]
take idx t = run t $ do
    i <- idx
    return $ List.take i t

-- |
-- >>> drop 13 ['a'..'z']
-- "nopqrstuvwxyz"
-- >>> drop mid ['a'..'z']
-- "nopqrstuvwxyz"
drop :: Index [] Int -> [a] -> [a]
drop idx t = run t $ do
    i <- idx
    return $ List.drop i t

-- |
-- >>> splitAt mid "Hello World!"
-- ("Hello ","World!")
-- >>> splitAt (mid - 1) "Hello World!"
-- ("Hello"," World!")
splitAt :: Index [] Int -> [a] -> ([a], [a])
splitAt idx t = run t $ do
    i <- idx
    return $ List.splitAt i t