module ForSyDe.Shallow.Core.Vector (
Vector (..), (<+>), (<:),
nullV, lengthV,
vector, fromVector, unitV,
iterateV, generateV, copyV,
mapV, zipWithV, zipWith3V,
reduceV, pipeV, foldlV, foldrV,
scanlV, scanrV,
atV, headV, tailV, lastV, initV, headsV, tailsV,
takeV, dropV, selectV, groupV, filterV, stencilV,
replaceV, zipV, unzipV,
concatV, reverseV, shiftlV, shiftrV, rotrV, rotlV, rotateV
) where
infixr 5 :>
infixl 5 <:
infixr 5 <+>
data Vector a = NullV
| a :> (Vector a) deriving (Vector a -> Vector a -> Bool
(Vector a -> Vector a -> Bool)
-> (Vector a -> Vector a -> Bool) -> Eq (Vector a)
forall a. Eq a => Vector a -> Vector a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Vector a -> Vector a -> Bool
$c/= :: forall a. Eq a => Vector a -> Vector a -> Bool
== :: Vector a -> Vector a -> Bool
$c== :: forall a. Eq a => Vector a -> Vector a -> Bool
Eq)
instance (Show a) => Show (Vector a) where
showsPrec :: Int -> Vector a -> ShowS
showsPrec Int
p Vector a
NullV = Bool -> ShowS -> ShowS
showParen (Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
9) (String -> ShowS
showString String
"<>")
showsPrec Int
p Vector a
xs = Bool -> ShowS -> ShowS
showParen (Int
p Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
9) (Char -> ShowS
showChar Char
'<' ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector a -> ShowS
forall a. Show a => Vector a -> ShowS
showVector1 Vector a
xs)
where
showVector1 :: Vector a -> ShowS
showVector1 Vector a
NullV = Char -> ShowS
showChar Char
'>'
showVector1 (a
y:>Vector a
NullV) = a -> ShowS
forall a. Show a => a -> ShowS
shows a
y ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> ShowS
showChar Char
'>'
showVector1 (a
y:>Vector a
ys) = a -> ShowS
forall a. Show a => a -> ShowS
shows a
y ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> ShowS
showChar Char
','
ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector a -> ShowS
showVector1 Vector a
ys
instance Read a => Read (Vector a) where
readsPrec :: Int -> ReadS (Vector a)
readsPrec Int
_ String
s = ReadS (Vector a)
forall a. Read a => ReadS (Vector a)
readsVector String
s
readsVector :: (Read a) => ReadS (Vector a)
readsVector :: ReadS (Vector a)
readsVector String
s = [((a
xa -> Vector a -> Vector a
forall a. a -> Vector a -> Vector a
:>Vector a
forall a. Vector a
NullV), String
rest) | (String
"<", String
r2) <- ReadS String
lex String
s,
(a
x, String
r3) <- ReadS a
forall a. Read a => ReadS a
reads String
r2,
(String
">", String
rest) <- ReadS String
lex String
r3]
[(Vector a, String)]
-> [(Vector a, String)] -> [(Vector a, String)]
forall a. [a] -> [a] -> [a]
++
[(Vector a
forall a. Vector a
NullV, String
r4) | (String
"<", String
r5) <- ReadS String
lex String
s,
(String
">", String
r4) <- ReadS String
lex String
r5]
[(Vector a, String)]
-> [(Vector a, String)] -> [(Vector a, String)]
forall a. [a] -> [a] -> [a]
++
[((a
xa -> Vector a -> Vector a
forall a. a -> Vector a -> Vector a
:>Vector a
xs), String
r6) | (String
"<", String
r7) <- ReadS String
lex String
s,
(a
x, String
r8) <- ReadS a
forall a. Read a => ReadS a
reads String
r7,
(String
",", String
r9) <- ReadS String
lex String
r8,
(Vector a
xs, String
r6) <- ReadS (Vector a)
forall a. Read a => ReadS (Vector a)
readsValues String
r9]
readsValues :: (Read a) => ReadS (Vector a)
readsValues :: ReadS (Vector a)
readsValues String
s = [((a
xa -> Vector a -> Vector a
forall a. a -> Vector a -> Vector a
:>Vector a
forall a. Vector a
NullV), String
r1) | (a
x, String
r2) <- ReadS a
forall a. Read a => ReadS a
reads String
s,
(String
">", String
r1) <- ReadS String
lex String
r2]
[(Vector a, String)]
-> [(Vector a, String)] -> [(Vector a, String)]
forall a. [a] -> [a] -> [a]
++
[((a
xa -> Vector a -> Vector a
forall a. a -> Vector a -> Vector a
:>Vector a
xs), String
r3) | (a
x, String
r4) <- ReadS a
forall a. Read a => ReadS a
reads String
s,
(String
",", String
r5) <- ReadS String
lex String
r4,
(Vector a
xs, String
r3) <- ReadS (Vector a)
forall a. Read a => ReadS (Vector a)
readsValues String
r5]
(<:) :: Vector a
-> a
-> Vector a
Vector a
xs <: :: Vector a -> a -> Vector a
<: a
x = Vector a
xs Vector a -> Vector a -> Vector a
forall a. Vector a -> Vector a -> Vector a
<+> a -> Vector a
forall a. a -> Vector a
unitV a
x
(<+>) :: Vector a
-> Vector a
-> Vector a
Vector a
NullV <+> :: Vector a -> Vector a -> Vector a
<+> Vector a
ys = Vector a
ys
(a
x:>Vector a
xs) <+> Vector a
ys = a
x a -> Vector a -> Vector a
forall a. a -> Vector a -> Vector a
:> (Vector a
xs Vector a -> Vector a -> Vector a
forall a. Vector a -> Vector a -> Vector a
<+> Vector a
ys)
vector :: [a] -> Vector a
vector :: [a] -> Vector a
vector [] = Vector a
forall a. Vector a
NullV
vector (a
x:[a]
xs) = a
x a -> Vector a -> Vector a
forall a. a -> Vector a -> Vector a
:> ([a] -> Vector a
forall a. [a] -> Vector a
vector [a]
xs)
fromVector :: Vector a -> [a]
fromVector :: Vector a -> [a]
fromVector Vector a
NullV = []
fromVector (a
x:>Vector a
xs) = a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: Vector a -> [a]
forall a. Vector a -> [a]
fromVector Vector a
xs
unitV :: a -> Vector a
unitV :: a -> Vector a
unitV a
x = a
x a -> Vector a -> Vector a
forall a. a -> Vector a -> Vector a
:> Vector a
forall a. Vector a
NullV
iterateV :: (Num a, Eq a)
=> a
-> (b -> b)
-> b
-> Vector b
iterateV :: a -> (b -> b) -> b -> Vector b
iterateV a
0 b -> b
_ b
_ = Vector b
forall a. Vector a
NullV
iterateV a
n b -> b
f b
a = b
a b -> Vector b -> Vector b
forall a. a -> Vector a -> Vector a
:> a -> (b -> b) -> b -> Vector b
forall a b. (Num a, Eq a) => a -> (b -> b) -> b -> Vector b
iterateV (a
na -> a -> a
forall a. Num a => a -> a -> a
-a
1) b -> b
f (b -> b
f b
a)
generateV :: (Num a, Eq a)
=> a
-> (b -> b)
-> b
-> Vector b
generateV :: a -> (b -> b) -> b -> Vector b
generateV a
0 b -> b
_ b
_ = Vector b
forall a. Vector a
NullV
generateV a
n b -> b
f b
a = b
x b -> Vector b -> Vector b
forall a. a -> Vector a -> Vector a
:> a -> (b -> b) -> b -> Vector b
forall a b. (Num a, Eq a) => a -> (b -> b) -> b -> Vector b
generateV (a
na -> a -> a
forall a. Num a => a -> a -> a
-a
1) b -> b
f b
x
where x :: b
x = b -> b
f b
a
copyV :: (Num a, Eq a)
=> a
-> b
-> Vector b
copyV :: a -> b -> Vector b
copyV a
k b
x = a -> (b -> b) -> b -> Vector b
forall a b. (Num a, Eq a) => a -> (b -> b) -> b -> Vector b
iterateV a
k b -> b
forall a. a -> a
id b
x
nullV :: Vector a -> Bool
nullV :: Vector a -> Bool
nullV Vector a
NullV = Bool
True
nullV Vector a
_ = Bool
False
lengthV :: Vector a -> Int
lengthV :: Vector a -> Int
lengthV Vector a
NullV = Int
0
lengthV (a
_:>Vector a
xs) = Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Vector a -> Int
forall a. Vector a -> Int
lengthV Vector a
xs
mapV :: (a -> b)
-> Vector a
-> Vector b
mapV :: (a -> b) -> Vector a -> Vector b
mapV a -> b
f (a
x:>Vector a
xs) = a -> b
f a
x b -> Vector b -> Vector b
forall a. a -> Vector a -> Vector a
:> (a -> b) -> Vector a -> Vector b
forall a b. (a -> b) -> Vector a -> Vector b
mapV a -> b
f Vector a
xs
mapV a -> b
_ Vector a
NullV = Vector b
forall a. Vector a
NullV
zipWithV :: (a -> b -> c)
-> Vector a
-> Vector b
-> Vector c
zipWithV :: (a -> b -> c) -> Vector a -> Vector b -> Vector c
zipWithV a -> b -> c
f (a
x:>Vector a
xs) (b
y:>Vector b
ys) = a -> b -> c
f a
x b
y c -> Vector c -> Vector c
forall a. a -> Vector a -> Vector a
:> ((a -> b -> c) -> Vector a -> Vector b -> Vector c
forall a b c. (a -> b -> c) -> Vector a -> Vector b -> Vector c
zipWithV a -> b -> c
f Vector a
xs Vector b
ys)
zipWithV a -> b -> c
_ Vector a
_ Vector b
_ = Vector c
forall a. Vector a
NullV
zipWith3V :: (a -> b -> c -> d)
-> Vector a
-> Vector b
-> Vector c
-> Vector d
zipWith3V :: (a -> b -> c -> d) -> Vector a -> Vector b -> Vector c -> Vector d
zipWith3V a -> b -> c -> d
f (a
x:>Vector a
xs) (b
y:>Vector b
ys) (c
z:>Vector c
zs) = a -> b -> c -> d
f a
x b
y c
z d -> Vector d -> Vector d
forall a. a -> Vector a -> Vector a
:> ((a -> b -> c -> d) -> Vector a -> Vector b -> Vector c -> Vector d
forall a b c d.
(a -> b -> c -> d) -> Vector a -> Vector b -> Vector c -> Vector d
zipWith3V a -> b -> c -> d
f Vector a
xs Vector b
ys Vector c
zs)
zipWith3V a -> b -> c -> d
_ Vector a
_ Vector b
_ Vector c
_ = Vector d
forall a. Vector a
NullV
foldlV :: (a -> b -> a) -> a -> Vector b -> a
foldlV :: (a -> b -> a) -> a -> Vector b -> a
foldlV a -> b -> a
_ a
a Vector b
NullV = a
a
foldlV a -> b -> a
f a
a (b
x:>Vector b
xs) = (a -> b -> a) -> a -> Vector b -> a
forall a b. (a -> b -> a) -> a -> Vector b -> a
foldlV a -> b -> a
f (a -> b -> a
f a
a b
x) Vector b
xs
foldrV :: (b -> a -> a) -> a -> Vector b -> a
foldrV :: (b -> a -> a) -> a -> Vector b -> a
foldrV b -> a -> a
_ a
a Vector b
NullV = a
a
foldrV b -> a -> a
f a
a (b
x:>Vector b
xs) = b -> a -> a
f b
x ((b -> a -> a) -> a -> Vector b -> a
forall b a. (b -> a -> a) -> a -> Vector b -> a
foldrV b -> a -> a
f a
a Vector b
xs)
reduceV :: (a -> a -> a) -> Vector a -> a
reduceV :: (a -> a -> a) -> Vector a -> a
reduceV a -> a -> a
_ Vector a
NullV = String -> a
forall a. HasCallStack => String -> a
error String
"Cannot reduce a null vector"
reduceV a -> a -> a
_ (a
x:>Vector a
NullV) = a
x
reduceV a -> a -> a
f (a
x:>Vector a
xs) = (a -> a -> a) -> a -> Vector a -> a
forall a b. (a -> b -> a) -> a -> Vector b -> a
foldlV a -> a -> a
f a
x Vector a
xs
pipeV :: Vector (a -> a) -> a -> a
pipeV :: Vector (a -> a) -> a -> a
pipeV Vector (a -> a)
vf = ((a -> a) -> (a -> a) -> a -> a)
-> (a -> a) -> Vector (a -> a) -> a -> a
forall b a. (b -> a -> a) -> a -> Vector b -> a
foldrV (a -> a) -> (a -> a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) a -> a
forall a. a -> a
id Vector (a -> a)
vf
atV :: (Integral a) => Vector b -> a -> b
Vector b
NullV atV :: Vector b -> a -> b
`atV` a
_ = String -> b
forall a. HasCallStack => String -> a
error String
"atV: Vector has not enough elements"
(b
x:>Vector b
_) `atV` a
0 = b
x
(b
_:>Vector b
xs) `atV` a
n = Vector b
xs Vector b -> a -> b
forall a b. Integral a => Vector b -> a -> b
`atV` (a
na -> a -> a
forall a. Num a => a -> a -> a
-a
1)
headV :: Vector a -> a
headV :: Vector a -> a
headV Vector a
NullV = String -> a
forall a. HasCallStack => String -> a
error String
"headV: Vector is empty"
headV (a
v:>Vector a
_) = a
v
lastV :: Vector a -> a
lastV :: Vector a -> a
lastV Vector a
NullV = String -> a
forall a. HasCallStack => String -> a
error String
"lastV: Vector is empty"
lastV (a
v:>Vector a
NullV) = a
v
lastV (a
_:>Vector a
vs) = Vector a -> a
forall a. Vector a -> a
lastV Vector a
vs
tailV :: Vector a
-> Vector a
tailV :: Vector a -> Vector a
tailV Vector a
NullV = String -> Vector a
forall a. HasCallStack => String -> a
error String
"tailV: Vector is empty"
tailV (a
_:>Vector a
vs) = Vector a
vs
initV :: Vector a
-> Vector a
initV :: Vector a -> Vector a
initV Vector a
NullV = String -> Vector a
forall a. HasCallStack => String -> a
error String
"initV: Vector is empty"
initV (a
_:>Vector a
NullV) = Vector a
forall a. Vector a
NullV
initV (a
v:>Vector a
vs) = a
v a -> Vector a -> Vector a
forall a. a -> Vector a -> Vector a
:> Vector a -> Vector a
forall a. Vector a -> Vector a
initV Vector a
vs
takeV :: (Num a, Ord a)
=> a
-> Vector b
-> Vector b
takeV :: a -> Vector b -> Vector b
takeV a
0 Vector b
_ = Vector b
forall a. Vector a
NullV
takeV a
_ Vector b
NullV = Vector b
forall a. Vector a
NullV
takeV a
n (b
v:>Vector b
vs) | a
n a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
0 = Vector b
forall a. Vector a
NullV
| Bool
otherwise = b
v b -> Vector b -> Vector b
forall a. a -> Vector a -> Vector a
:> a -> Vector b -> Vector b
forall a b. (Num a, Ord a) => a -> Vector b -> Vector b
takeV (a
na -> a -> a
forall a. Num a => a -> a -> a
-a
1) Vector b
vs
dropV :: (Num a, Ord a)
=> a
-> Vector b
-> Vector b
dropV :: a -> Vector b -> Vector b
dropV a
0 Vector b
vs = Vector b
vs
dropV a
_ Vector b
NullV = Vector b
forall a. Vector a
NullV
dropV a
n (b
v:>Vector b
vs) | a
n a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
0 = b
v b -> Vector b -> Vector b
forall a. a -> Vector a -> Vector a
:> Vector b
vs
| Bool
otherwise = a -> Vector b -> Vector b
forall a b. (Num a, Ord a) => a -> Vector b -> Vector b
dropV (a
na -> a -> a
forall a. Num a => a -> a -> a
-a
1) Vector b
vs
selectV :: Int
-> Int
-> Int
-> Vector a
-> Vector a
selectV :: Int -> Int -> Int -> Vector a -> Vector a
selectV Int
f Int
s Int
n Vector a
vs
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 = Vector a
forall a. Vector a
NullV
| (Int
fInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
sInt -> Int -> Int
forall a. Num a => a -> a -> a
*Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Vector a -> Int
forall a. Vector a -> Int
lengthV Vector a
vs = String -> Vector a
forall a. HasCallStack => String -> a
error String
"selectV: Vector has not enough elements"
| Bool
otherwise = Vector a -> Int -> a
forall a b. Integral a => Vector b -> a -> b
atV Vector a
vs Int
f a -> Vector a -> Vector a
forall a. a -> Vector a -> Vector a
:> Int -> Int -> Int -> Vector a -> Vector a
forall a. Int -> Int -> Int -> Vector a -> Vector a
selectV (Int
fInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
s) Int
s (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) Vector a
vs
groupV :: Int
-> Vector a
-> Vector (Vector a)
groupV :: Int -> Vector a -> Vector (Vector a)
groupV Int
n Vector a
v
| Vector a -> Int
forall a. Vector a -> Int
lengthV Vector a
v Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
n = Vector (Vector a)
forall a. Vector a
NullV
| Bool
otherwise = Int -> Int -> Int -> Vector a -> Vector a
forall a. Int -> Int -> Int -> Vector a -> Vector a
selectV Int
0 Int
1 Int
n Vector a
v
Vector a -> Vector (Vector a) -> Vector (Vector a)
forall a. a -> Vector a -> Vector a
:> Int -> Vector a -> Vector (Vector a)
forall a. Int -> Vector a -> Vector (Vector a)
groupV Int
n (Int -> Int -> Int -> Vector a -> Vector a
forall a. Int -> Int -> Int -> Vector a -> Vector a
selectV Int
n Int
1 (Vector a -> Int
forall a. Vector a -> Int
lengthV Vector a
vInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
n) Vector a
v)
filterV :: (a -> Bool)
-> Vector a
-> Vector a
filterV :: (a -> Bool) -> Vector a -> Vector a
filterV a -> Bool
_ Vector a
NullV = Vector a
forall a. Vector a
NullV
filterV a -> Bool
p (a
v:>Vector a
vs) = if (a -> Bool
p a
v)
then a
v a -> Vector a -> Vector a
forall a. a -> Vector a -> Vector a
:> (a -> Bool) -> Vector a -> Vector a
forall a. (a -> Bool) -> Vector a -> Vector a
filterV a -> Bool
p Vector a
vs
else (a -> Bool) -> Vector a -> Vector a
forall a. (a -> Bool) -> Vector a -> Vector a
filterV a -> Bool
p Vector a
vs
headsV :: Vector a
-> Vector (Vector a)
headsV :: Vector a -> Vector (Vector a)
headsV Vector a
NullV = String -> Vector (Vector a)
forall a. HasCallStack => String -> a
error String
"heads: null vector"
headsV Vector a
v = (Vector (Vector a) -> Vector (Vector a) -> Vector (Vector a))
-> Vector (Vector a)
-> Vector (Vector (Vector a))
-> Vector (Vector a)
forall b a. (b -> a -> a) -> a -> Vector b -> a
foldrV Vector (Vector a) -> Vector (Vector a) -> Vector (Vector a)
forall a.
Vector (Vector a) -> Vector (Vector a) -> Vector (Vector a)
sel (Vector a -> Vector (Vector a)
forall a. a -> Vector a
unitV Vector a
forall a. Vector a
NullV) (Vector (Vector (Vector a)) -> Vector (Vector a))
-> Vector (Vector (Vector a)) -> Vector (Vector a)
forall a b. (a -> b) -> a -> b
$ (a -> Vector (Vector a)) -> Vector a -> Vector (Vector (Vector a))
forall a b. (a -> b) -> Vector a -> Vector b
mapV (Vector a -> Vector (Vector a)
forall a. a -> Vector a
unitV (Vector a -> Vector (Vector a))
-> (a -> Vector a) -> a -> Vector (Vector a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Vector a
forall a. a -> Vector a
unitV) Vector a
v
where sel :: Vector (Vector a) -> Vector (Vector a) -> Vector (Vector a)
sel Vector (Vector a)
x Vector (Vector a)
y = Vector (Vector a)
x Vector (Vector a) -> Vector (Vector a) -> Vector (Vector a)
forall a. Vector a -> Vector a -> Vector a
<+> (Vector a -> Vector a) -> Vector (Vector a) -> Vector (Vector a)
forall a b. (a -> b) -> Vector a -> Vector b
mapV (Vector (Vector a) -> Vector a
forall a. Vector a -> a
lastV Vector (Vector a)
x Vector a -> Vector a -> Vector a
forall a. Vector a -> Vector a -> Vector a
<+>) Vector (Vector a)
y
tailsV :: Vector a
-> Vector (Vector a)
tailsV :: Vector a -> Vector (Vector a)
tailsV Vector a
NullV = Vector (Vector a)
forall a. Vector a
NullV
tailsV Vector a
v = (Vector (Vector a) -> Vector (Vector a) -> Vector (Vector a))
-> Vector (Vector a)
-> Vector (Vector (Vector a))
-> Vector (Vector a)
forall b a. (b -> a -> a) -> a -> Vector b -> a
foldrV Vector (Vector a) -> Vector (Vector a) -> Vector (Vector a)
forall a.
Vector (Vector a) -> Vector (Vector a) -> Vector (Vector a)
sel (Vector a -> Vector (Vector a)
forall a. a -> Vector a
unitV Vector a
forall a. Vector a
NullV) (Vector (Vector (Vector a)) -> Vector (Vector a))
-> Vector (Vector (Vector a)) -> Vector (Vector a)
forall a b. (a -> b) -> a -> b
$ (a -> Vector (Vector a)) -> Vector a -> Vector (Vector (Vector a))
forall a b. (a -> b) -> Vector a -> Vector b
mapV (Vector a -> Vector (Vector a)
forall a. a -> Vector a
unitV (Vector a -> Vector (Vector a))
-> (a -> Vector a) -> a -> Vector (Vector a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Vector a
forall a. a -> Vector a
unitV) Vector a
v
where sel :: Vector (Vector a) -> Vector (Vector a) -> Vector (Vector a)
sel Vector (Vector a)
x Vector (Vector a)
y = (Vector a -> Vector a) -> Vector (Vector a) -> Vector (Vector a)
forall a b. (a -> b) -> Vector a -> Vector b
mapV (Vector a -> Vector a -> Vector a
forall a. Vector a -> Vector a -> Vector a
<+> Vector (Vector a) -> Vector a
forall a. Vector a -> a
headV Vector (Vector a)
y) Vector (Vector a)
x Vector (Vector a) -> Vector (Vector a) -> Vector (Vector a)
forall a. Vector a -> Vector a -> Vector a
<+> Vector (Vector a)
y
stencilV :: Int
-> Vector a
-> Vector (Vector a)
stencilV :: Int -> Vector a -> Vector (Vector a)
stencilV Int
n Vector a
v = (Vector a -> Vector a) -> Vector (Vector a) -> Vector (Vector a)
forall a b. (a -> b) -> Vector a -> Vector b
mapV (Int -> Vector a -> Vector a
forall a b. (Num a, Ord a) => a -> Vector b -> Vector b
takeV Int
n) (Vector (Vector a) -> Vector (Vector a))
-> Vector (Vector a) -> Vector (Vector a)
forall a b. (a -> b) -> a -> b
$ Int -> Vector (Vector a) -> Vector (Vector a)
forall b. Int -> Vector b -> Vector b
dropFromEnd Int
n (Vector (Vector a) -> Vector (Vector a))
-> Vector (Vector a) -> Vector (Vector a)
forall a b. (a -> b) -> a -> b
$ Vector a -> Vector (Vector a)
forall a. Vector a -> Vector (Vector a)
tailsV Vector a
v
where dropFromEnd :: Int -> Vector b -> Vector b
dropFromEnd Int
n = Int -> Vector b -> Vector b
forall a b. (Num a, Ord a) => a -> Vector b -> Vector b
takeV (Vector a -> Int
forall a. Vector a -> Int
lengthV Vector a
v Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1)
replaceV :: Vector a
-> Int
-> a
-> Vector a
replaceV :: Vector a -> Int -> a -> Vector a
replaceV Vector a
vs Int
n a
x
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Vector a -> Int
forall a. Vector a -> Int
lengthV Vector a
vs Bool -> Bool -> Bool
&& Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>= Int
0 = Int -> Vector a -> Vector a
forall a b. (Num a, Ord a) => a -> Vector b -> Vector b
takeV Int
n Vector a
vs Vector a -> Vector a -> Vector a
forall a. Vector a -> Vector a -> Vector a
<+> a -> Vector a
forall a. a -> Vector a
unitV a
x
Vector a -> Vector a -> Vector a
forall a. Vector a -> Vector a -> Vector a
<+> Int -> Vector a -> Vector a
forall a b. (Num a, Ord a) => a -> Vector b -> Vector b
dropV (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) Vector a
vs
| Bool
otherwise = Vector a
vs
zipV :: Vector a
-> Vector b
-> Vector (a, b)
zipV :: Vector a -> Vector b -> Vector (a, b)
zipV (a
x:>Vector a
xs) (b
y:>Vector b
ys) = (a
x, b
y) (a, b) -> Vector (a, b) -> Vector (a, b)
forall a. a -> Vector a -> Vector a
:> Vector a -> Vector b -> Vector (a, b)
forall a b. Vector a -> Vector b -> Vector (a, b)
zipV Vector a
xs Vector b
ys
zipV Vector a
_ Vector b
_ = Vector (a, b)
forall a. Vector a
NullV
unzipV :: Vector (a, b)
-> (Vector a, Vector b)
unzipV :: Vector (a, b) -> (Vector a, Vector b)
unzipV Vector (a, b)
NullV = (Vector a
forall a. Vector a
NullV, Vector b
forall a. Vector a
NullV)
unzipV ((a
x, b
y) :> Vector (a, b)
xys) = (a
xa -> Vector a -> Vector a
forall a. a -> Vector a -> Vector a
:>Vector a
xs, b
yb -> Vector b -> Vector b
forall a. a -> Vector a -> Vector a
:>Vector b
ys)
where (Vector a
xs, Vector b
ys) = Vector (a, b) -> (Vector a, Vector b)
forall a b. Vector (a, b) -> (Vector a, Vector b)
unzipV Vector (a, b)
xys
shiftlV :: Vector a -> a -> Vector a
shiftlV :: Vector a -> a -> Vector a
shiftlV Vector a
vs a
v = a
v a -> Vector a -> Vector a
forall a. a -> Vector a -> Vector a
:> Vector a -> Vector a
forall a. Vector a -> Vector a
initV Vector a
vs
shiftrV :: Vector a -> a -> Vector a
shiftrV :: Vector a -> a -> Vector a
shiftrV Vector a
vs a
v = Vector a -> Vector a
forall a. Vector a -> Vector a
tailV Vector a
vs Vector a -> a -> Vector a
forall a. Vector a -> a -> Vector a
<: a
v
rotlV :: Vector a -> Vector a
rotrV :: Vector a -> Vector a
rotrV Vector a
NullV = Vector a
forall a. Vector a
NullV
rotrV Vector a
vs = Vector a -> Vector a
forall a. Vector a -> Vector a
tailV Vector a
vs Vector a -> a -> Vector a
forall a. Vector a -> a -> Vector a
<: Vector a -> a
forall a. Vector a -> a
headV Vector a
vs
rotrV :: Vector a -> Vector a
rotlV :: Vector a -> Vector a
rotlV Vector a
NullV = Vector a
forall a. Vector a
NullV
rotlV Vector a
vs = Vector a -> a
forall a. Vector a -> a
lastV Vector a
vs a -> Vector a -> Vector a
forall a. a -> Vector a -> Vector a
:> Vector a -> Vector a
forall a. Vector a -> Vector a
initV Vector a
vs
rotateV :: Int -> Vector a -> Vector a
rotateV :: Int -> Vector a -> Vector a
rotateV Int
n
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 = Vector (Vector a -> Vector a) -> Vector a -> Vector a
forall a. Vector (a -> a) -> a -> a
pipeV (Int -> (Vector a -> Vector a) -> Vector (Vector a -> Vector a)
forall a b. (Num a, Eq a) => a -> b -> Vector b
copyV (Int -> Int
forall a. Num a => a -> a
abs Int
n) Vector a -> Vector a
forall a. Vector a -> Vector a
rotlV)
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0 = Vector (Vector a -> Vector a) -> Vector a -> Vector a
forall a. Vector (a -> a) -> a -> a
pipeV (Int -> (Vector a -> Vector a) -> Vector (Vector a -> Vector a)
forall a b. (Num a, Eq a) => a -> b -> Vector b
copyV (Int -> Int
forall a. Num a => a -> a
abs Int
n) Vector a -> Vector a
forall a. Vector a -> Vector a
rotrV)
| Bool
otherwise = Vector a -> Vector a
forall a. a -> a
id
concatV :: Vector (Vector a) -> Vector a
concatV :: Vector (Vector a) -> Vector a
concatV = (Vector a -> Vector a -> Vector a)
-> Vector a -> Vector (Vector a) -> Vector a
forall b a. (b -> a -> a) -> a -> Vector b -> a
foldrV Vector a -> Vector a -> Vector a
forall a. Vector a -> Vector a -> Vector a
(<+>) Vector a
forall a. Vector a
NullV
reverseV :: Vector a -> Vector a
reverseV :: Vector a -> Vector a
reverseV Vector a
NullV = Vector a
forall a. Vector a
NullV
reverseV (a
v:>Vector a
vs) = Vector a -> Vector a
forall a. Vector a -> Vector a
reverseV Vector a
vs Vector a -> a -> Vector a
forall a. Vector a -> a -> Vector a
<: a
v
scanlV :: (a -> b -> a)
-> a
-> Vector b
-> Vector a
scanlV :: (a -> b -> a) -> a -> Vector b -> Vector a
scanlV a -> b -> a
_ a
_ Vector b
NullV = Vector a
forall a. Vector a
NullV
scanlV a -> b -> a
f a
a (b
x:>Vector b
xs) = a
q a -> Vector a -> Vector a
forall a. a -> Vector a -> Vector a
:> (a -> b -> a) -> a -> Vector b -> Vector a
forall a b. (a -> b -> a) -> a -> Vector b -> Vector a
scanlV a -> b -> a
f a
q Vector b
xs
where q :: a
q = a -> b -> a
f a
a b
x
scanrV :: (b -> a -> a)
-> a
-> Vector b
-> Vector a
scanrV :: (b -> a -> a) -> a -> Vector b -> Vector a
scanrV b -> a -> a
_ a
_ Vector b
NullV = Vector a
forall a. Vector a
NullV
scanrV b -> a -> a
f a
a (b
x:>Vector b
NullV) = b -> a -> a
f b
x a
a a -> Vector a -> Vector a
forall a. a -> Vector a -> Vector a
:> Vector a
forall a. Vector a
NullV
scanrV b -> a -> a
f a
a (b
x:>Vector b
xs) = b -> a -> a
f b
x a
y a -> Vector a -> Vector a
forall a. a -> Vector a -> Vector a
:> Vector a
ys
where ys :: Vector a
ys@(a
y:>Vector a
_) = (b -> a -> a) -> a -> Vector b -> Vector a
forall b a. (b -> a -> a) -> a -> Vector b -> Vector a
scanrV b -> a -> a
f a
a Vector b
xs