module Util.Associate where
associateWith :: (a->b->c) -> [a] -> [b] -> [c]
associateWith :: (a -> b -> c) -> [a] -> [b] -> [c]
associateWith a -> b -> c
f [a]
a [b]
b
| Int
lbInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
la = Int -> (a -> b -> c) -> [a] -> [b] -> [c]
forall t a a. Int -> (t -> a -> a) -> [t] -> [a] -> [a]
spreadn(Int
lbInt -> Int -> Int
forall a. Integral a => a -> a -> a
`quot`Int
la) a -> b -> c
f [a]
a [b]
b
| Bool
otherwise = Int -> (b -> a -> c) -> [b] -> [a] -> [c]
forall t a a. Int -> (t -> a -> a) -> [t] -> [a] -> [a]
spreadn(Int
laInt -> Int -> Int
forall a. Integral a => a -> a -> a
`quot`Int
lb) ((a -> b -> c) -> b -> a -> c
forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> b -> c
f) [b]
b [a]
a
where la :: Int
la = [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
a; lb :: Int
lb = [b] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [b]
b
spreadn :: Int -> (t -> a -> a) -> [t] -> [a] -> [a]
spreadn Int
n t -> a -> a
f' = [t] -> [a] -> [a]
go
where go :: [t] -> [a] -> [a]
go (t
e:[t]
es) [a]
t
| ([a]
et, [a]
tr) <- Int -> [a] -> ([a], [a])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
n [a]
t
= (a -> [a] -> [a]) -> [a] -> [a] -> [a]
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr((:) (a -> [a] -> [a]) -> (a -> a) -> a -> [a] -> [a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t -> a -> a
f' t
e) ([t] -> [a] -> [a]
go [t]
es [a]
tr) [a]
et
go [t]
_ [a]
_ = []
associate :: [a] -> [b] -> [(a,b)]
associate :: [a] -> [b] -> [(a, b)]
associate = (a -> b -> (a, b)) -> [a] -> [b] -> [(a, b)]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
associateWith (,)
associaterSectorsWith :: (a->[b]->c) -> [a] -> [b] -> [c]
associaterSectorsWith :: (a -> [b] -> c) -> [a] -> [b] -> [c]
associaterSectorsWith a -> [b] -> c
f [a]
a [b]
b = Int -> [a] -> [b] -> [c]
spreadn(Int
lbInt -> Int -> Int
forall a. Integral a => a -> a -> a
`quot`Int
la) [a]
a [b]
b
where la :: Int
la = [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
a; lb :: Int
lb = [b] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [b]
b
spreadn :: Int -> [a] -> [b] -> [c]
spreadn Int
n (a
e:[a]
es) [b]
t
| ([b]
et, [b]
tr) <- Int -> [b] -> ([b], [b])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
n [b]
t = a -> [b] -> c
f a
e [b]
et c -> [c] -> [c]
forall a. a -> [a] -> [a]
: Int -> [a] -> [b] -> [c]
spreadn Int
n [a]
es [b]
tr
spreadn Int
_ [a]
_ [b]
_ = []
associaterSectors :: [a] -> [b] -> [(a,[b])]
associaterSectors :: [a] -> [b] -> [(a, [b])]
associaterSectors = (a -> [b] -> (a, [b])) -> [a] -> [b] -> [(a, [b])]
forall a b c. (a -> [b] -> c) -> [a] -> [b] -> [c]
associaterSectorsWith (,)
associatelSectorsWith :: ([a]->b->c) -> [a] -> [b] -> [c]
associatelSectorsWith :: ([a] -> b -> c) -> [a] -> [b] -> [c]
associatelSectorsWith [a] -> b -> c
f = ([b] -> [a] -> [c]) -> [a] -> [b] -> [c]
forall a b c. (a -> b -> c) -> b -> a -> c
flip ((b -> [a] -> c) -> [b] -> [a] -> [c]
forall a b c. (a -> [b] -> c) -> [a] -> [b] -> [c]
associaterSectorsWith ((b -> [a] -> c) -> [b] -> [a] -> [c])
-> (b -> [a] -> c) -> [b] -> [a] -> [c]
forall a b. (a -> b) -> a -> b
$ ([a] -> b -> c) -> b -> [a] -> c
forall a b c. (a -> b -> c) -> b -> a -> c
flip [a] -> b -> c
f)
associatelSectors :: [a] -> [b] -> [([a],b)]
associatelSectors :: [a] -> [b] -> [([a], b)]
associatelSectors = ([a] -> b -> ([a], b)) -> [a] -> [b] -> [([a], b)]
forall a b c. ([a] -> b -> c) -> [a] -> [b] -> [c]
associatelSectorsWith (,)
partitions :: Int -> [a] -> [[a]]
partitions :: Int -> [a] -> [[a]]
partitions Int
n = [a] -> [[a]]
forall a. [a] -> [[a]]
go
where go :: [a] -> [[a]]
go [] = []
go [a]
l | ([a]
chunk,[a]
rest) <- Int -> [a] -> ([a], [a])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
n [a]
l = [a]
chunk [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [a] -> [[a]]
go [a]
rest
divide :: Int -> [a] -> [[a]]
divide :: Int -> [a] -> [[a]]
divide Int
n [a]
ls = Int -> [a] -> [[a]]
forall a. Int -> [a] -> [[a]]
partitions([a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [a]
lsInt -> Int -> Int
forall a. Integral a => a -> a -> a
`div`Int
n) [a]
ls
mapOnNth :: (a->a) -> Int -> [a] -> [a]
mapOnNth :: (a -> a) -> Int -> [a] -> [a]
mapOnNth a -> a
f Int
0 (a
l:[a]
ls) = a -> a
f a
l a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
ls
mapOnNth a -> a
f Int
n (a
l:[a]
ls) = a
l a -> [a] -> [a]
forall a. a -> [a] -> [a]
: (a -> a) -> Int -> [a] -> [a]
forall a. (a -> a) -> Int -> [a] -> [a]
mapOnNth a -> a
f (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) [a]
ls
mapOnNth a -> a
_ Int
_ [] = []
mapExceptOnNth :: (a->a) -> Int -> [a] -> [a]
mapExceptOnNth :: (a -> a) -> Int -> [a] -> [a]
mapExceptOnNth a -> a
f Int
0 (a
l:[a]
ls) = a
l a -> [a] -> [a]
forall a. a -> [a] -> [a]
: (a -> a) -> [a] -> [a]
forall a b. (a -> b) -> [a] -> [b]
map a -> a
f [a]
ls
mapExceptOnNth a -> a
f Int
n (a
l:[a]
ls) = a -> a
f a
l a -> [a] -> [a]
forall a. a -> [a] -> [a]
: (a -> a) -> Int -> [a] -> [a]
forall a. (a -> a) -> Int -> [a] -> [a]
mapOnNth a -> a
f (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) [a]
ls
mapExceptOnNth a -> a
_ Int
_ [] = []