34 lines
884 B
Haskell
34 lines
884 B
Haskell
module ListHelp
|
|
( module Data.List
|
|
, initOrNull
|
|
, insertOver
|
|
, swapIndices
|
|
, (!?)
|
|
)where
|
|
import Data.List
|
|
|
|
initOrNull :: [a] -> [a]
|
|
initOrNull [] = []
|
|
initOrNull xs = init xs
|
|
|
|
insertOver :: Int -> a -> [a] -> [a]
|
|
insertOver i x xs = take i xs ++ x : drop (i+1) xs
|
|
|
|
swapIndices :: Int -> Int -> [a] -> [a]
|
|
swapIndices i j xs = insertOver i (xs !! j) . insertOver j (xs !! i) $ xs
|
|
|
|
--copied from Data.List.Extra:
|
|
-- | A total variant of the list index function `(!!)`.
|
|
--
|
|
-- > [2,3,4] !? 1 == Just 3
|
|
-- > [2,3,4] !? (-1) == Nothing
|
|
-- > [] !? 0 == Nothing
|
|
(!?) :: [a] -> Int -> Maybe a
|
|
xs !? n
|
|
| n < 0 = Nothing
|
|
-- Definition adapted from GHC.List
|
|
| otherwise = foldr (\x r k -> case k of
|
|
0 -> Just x
|
|
_ -> r (k-1)) (const Nothing) xs n
|
|
{-# INLINABLE (!?) #-}
|