data-index-0.1.0.0: src/Data/List/Index.hs
-- | 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