module Data.List.Scroll
( up
, down
, deleteByIndex
) where
import Data.Tuple.Extra ( second )
up :: Int -> Int -> [a] -> [a]
up :: Int -> Int -> [a] -> [a]
up Int
index Int
steps [a]
ls
| (Int -> Bool) -> [Int] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
any (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0) [Int
steps, Int
index, [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
ls Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
index] = [a]
ls
| Bool
otherwise = Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
take Int
prev [a]
ls [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ ([a]
ls [a] -> Int -> a
forall a. [a] -> Int -> a
!! Int
index) a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
tailNoTarget
where prev :: Int
prev = Int
index Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
steps
tailNoTarget :: [a]
tailNoTarget = Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
drop Int
prev ([a] -> [a]) -> [a] -> [a]
forall a b. (a -> b) -> a -> b
$ Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
deleteByIndex Int
index [a]
ls
down :: Int -> Int -> [a] -> [a]
down :: Int -> Int -> [a] -> [a]
down Int
index Int
steps [a]
ls = [a] -> [a]
forall a. [a] -> [a]
reverse ([a] -> [a]) -> ([a] -> [a]) -> [a] -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Int -> [a] -> [a]
forall a. Int -> Int -> [a] -> [a]
up Int
reverseIndex Int
steps ([a] -> [a]) -> [a] -> [a]
forall a b. (a -> b) -> a -> b
$ [a] -> [a]
forall a. [a] -> [a]
reverse [a]
ls
where reverseIndex :: Int
reverseIndex = [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
ls Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
index Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1
deleteByIndex :: Int -> [a] -> [a]
deleteByIndex :: Int -> [a] -> [a]
deleteByIndex Int
index [a]
ls
| Int
index Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 = [a]
ls
| Bool
otherwise = ([a] -> [a] -> [a]) -> ([a], [a]) -> [a]
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
(++) (([a], [a]) -> [a])
-> (([a], [a]) -> ([a], [a])) -> ([a], [a]) -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([a] -> [a]) -> ([a], [a]) -> ([a], [a])
forall b b' a. (b -> b') -> (a, b) -> (a, b')
second (Int -> [a] -> [a]
forall a. Int -> [a] -> [a]
drop Int
1) (([a], [a]) -> [a]) -> ([a], [a]) -> [a]
forall a b. (a -> b) -> a -> b
$ Int -> [a] -> ([a], [a])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
index [a]
ls