module RepMax (doRepMax, foldMax, repMax, traverseMax, traverseMax') where
import Data.Foldable (toList)
import Data.Maybe (fromJust)
import Data.Monoid (First (..), getFirst)
import Data.Traversable (mapAccumR)
doRepMax :: (Integral a)
=> [a]
-> [a]
doRepMax :: forall a. Integral a => [a] -> [a]
doRepMax [a]
xs = [a]
xs'
where
(a
largest, [a]
xs') = [a] -> a -> (a, [a])
forall a. Integral a => [a] -> a -> (a, [a])
repMax [a]
xs a
largest
repMax :: (Integral a)
=> [a]
-> a
-> (a, [a])
repMax :: forall a. Integral a => [a] -> a -> (a, [a])
repMax [] a
rep = (a
rep, [])
repMax [a
x] a
rep = (a
x, [a
rep])
repMax (a
x:[a]
xs) a
rep = (a
m', a
repa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
xs')
where
(a
m, [a]
xs') = [a] -> a -> (a, [a])
forall a. Integral a => [a] -> a -> (a, [a])
repMax [a]
xs a
rep
m' :: a
m' = a -> a -> a
forall a. Ord a => a -> a -> a
max a
m a
x
foldMax :: (Integral a)
=> [a]
-> [a]
foldMax :: forall a. Integral a => [a] -> [a]
foldMax [a]
xs = [a]
xs'
where
m :: a
m = if [a] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
xs then a
0 else [a] -> a
forall a. HasCallStack => [a] -> a
head [a]
xs
([a]
xs', a
largest) = (([a], a) -> a -> ([a], a)) -> ([a], a) -> [a] -> ([a], a)
forall b a. (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl (\([a]
b, a
c) a
a -> (a
largest a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
b, a -> a -> a
forall a. Ord a => a -> a -> a
max a
a a
c)) ([], a
m) [a]
xs
traverseMax :: (Traversable t, Integral a)
=> t a
-> t a
traverseMax :: forall (t :: * -> *) a. (Traversable t, Integral a) => t a -> t a
traverseMax t a
t = t a
xs'
where
m :: a
m = Maybe a -> a
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe a -> a) -> Maybe a -> a
forall a b. (a -> b) -> a -> b
$ First a -> Maybe a
forall a. First a -> Maybe a
getFirst (First a -> Maybe a) -> First a -> Maybe a
forall a b. (a -> b) -> a -> b
$ (a -> First a) -> t a -> First a
forall m a. Monoid m => (a -> m) -> t a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap (Maybe a -> First a
forall a. Maybe a -> First a
First (Maybe a -> First a) -> (a -> Maybe a) -> a -> First a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Maybe a
forall a. a -> Maybe a
Just) t a
t
(a
largest, t a
xs') = (a -> a -> (a, a)) -> a -> t a -> (a, t a)
forall (t :: * -> *) s a b.
Traversable t =>
(s -> a -> (s, b)) -> s -> t a -> (s, t b)
mapAccumR (\a
a a
b -> (a -> a -> a
forall a. Ord a => a -> a -> a
max a
a a
b, a
largest)) a
m t a
t
traverseMax' :: (Traversable t, Integral a)
=> t a
-> t a
traverseMax' :: forall (t :: * -> *) a. (Traversable t, Integral a) => t a -> t a
traverseMax' t a
t = t a
xs'
where
m :: a
m = if t a -> Bool
forall a. t a -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null t a
xs' then a
0 else ([a] -> a
forall a. HasCallStack => [a] -> a
head ([a] -> a) -> (t a -> [a]) -> t a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t a -> [a]
forall a. t a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList) t a
t
(a
largest, t a
xs') = (a -> a -> (a, a)) -> a -> t a -> (a, t a)
forall (t :: * -> *) s a b.
Traversable t =>
(s -> a -> (s, b)) -> s -> t a -> (s, t b)
mapAccumR (\a
a a
b -> (a -> a -> a
forall a. Ord a => a -> a -> a
max a
a a
b, a
largest)) a
m t a
t