{-# LANGUAGE CPP #-}
module Streamly.Internal.Data.Fold.Window
{-# DEPRECATED "Please use Streamly.Internal.Data.Scanl instead." #-}
(
windowLmap
, cumulative
, windowRollingMap
, windowRollingMapM
, windowLength
, windowSum
, windowSumInt
, windowPowerSum
, windowPowerSumFrac
, windowMinimum
, windowMaximum
, windowRange
, windowMean
)
where
import Control.Monad.IO.Class (MonadIO (liftIO))
import Data.Bifunctor(bimap)
import Data.Proxy (Proxy(..))
import Streamly.Internal.Data.RingArray (RingArray(..))
import Streamly.Internal.Data.Unbox (Unbox(..))
import Streamly.Internal.Data.Fold.Type (Fold(..), Step(..))
import Streamly.Internal.Data.Tuple.Strict
(Tuple'(..), Tuple3Fused' (Tuple3Fused'))
import qualified Streamly.Internal.Data.Fold.Type as Fold
import qualified Streamly.Internal.Data.MutArray.Type as MutArray
import qualified Streamly.Internal.Data.RingArray as RingArray
import Prelude hiding (length, sum, minimum, maximum)
#include "ArrayMacros.h"
#include "DocTestDataFold.hs"
{-# INLINE windowLmap #-}
windowLmap :: (c -> a) -> Fold m (a, Maybe a) b -> Fold m (c, Maybe c) b
windowLmap :: forall c a (m :: * -> *) b.
(c -> a) -> Fold m (a, Maybe a) b -> Fold m (c, Maybe c) b
windowLmap c -> a
f = ((c, Maybe c) -> (a, Maybe a))
-> Fold m (a, Maybe a) b -> Fold m (c, Maybe c) b
forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
Fold.lmap ((c -> a) -> (Maybe c -> Maybe a) -> (c, Maybe c) -> (a, Maybe a)
forall a b c d. (a -> b) -> (c -> d) -> (a, c) -> (b, d)
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap c -> a
f (c -> a
f (c -> a) -> Maybe c -> Maybe a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>))
{-# INLINE cumulative #-}
cumulative :: Fold m (a, Maybe a) b -> Fold m a b
cumulative :: forall (m :: * -> *) a b. Fold m (a, Maybe a) b -> Fold m a b
cumulative = (a -> (a, Maybe a)) -> Fold m (a, Maybe a) b -> Fold m a b
forall a b (m :: * -> *) r. (a -> b) -> Fold m b r -> Fold m a r
Fold.lmap (, Maybe a
forall a. Maybe a
Nothing)
{-# INLINE windowRollingMapM #-}
windowRollingMapM :: Monad m =>
(Maybe a -> a -> m (Maybe b)) -> Fold m (a, Maybe a) (Maybe b)
windowRollingMapM :: forall (m :: * -> *) a b.
Monad m =>
(Maybe a -> a -> m (Maybe b)) -> Fold m (a, Maybe a) (Maybe b)
windowRollingMapM Maybe a -> a -> m (Maybe b)
f = (Maybe b -> (a, Maybe a) -> m (Maybe b))
-> m (Maybe b) -> Fold m (a, Maybe a) (Maybe b)
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> m b) -> m b -> Fold m a b
Fold.foldlM' Maybe b -> (a, Maybe a) -> m (Maybe b)
forall {p}. p -> (a, Maybe a) -> m (Maybe b)
f1 m (Maybe b)
forall {a}. m (Maybe a)
initial
where
initial :: m (Maybe a)
initial = Maybe a -> m (Maybe a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe a
forall a. Maybe a
Nothing
f1 :: p -> (a, Maybe a) -> m (Maybe b)
f1 p
_ (a
a, Maybe a
ma) = Maybe a -> a -> m (Maybe b)
f Maybe a
ma a
a
{-# INLINE windowRollingMap #-}
windowRollingMap :: Monad m =>
(Maybe a -> a -> Maybe b) -> Fold m (a, Maybe a) (Maybe b)
windowRollingMap :: forall (m :: * -> *) a b.
Monad m =>
(Maybe a -> a -> Maybe b) -> Fold m (a, Maybe a) (Maybe b)
windowRollingMap Maybe a -> a -> Maybe b
f = (Maybe b -> (a, Maybe a) -> Maybe b)
-> Maybe b -> Fold m (a, Maybe a) (Maybe b)
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Fold m a b
Fold.foldl' Maybe b -> (a, Maybe a) -> Maybe b
forall {p}. p -> (a, Maybe a) -> Maybe b
f1 Maybe b
forall a. Maybe a
initial
where
initial :: Maybe a
initial = Maybe a
forall a. Maybe a
Nothing
f1 :: p -> (a, Maybe a) -> Maybe b
f1 p
_ (a
a, Maybe a
ma) = Maybe a -> a -> Maybe b
f Maybe a
ma a
a
{-# INLINE windowSumInt #-}
windowSumInt :: forall m a. (Monad m, Integral a) => Fold m (a, Maybe a) a
windowSumInt :: forall (m :: * -> *) a.
(Monad m, Integral a) =>
Fold m (a, Maybe a) a
windowSumInt = (a -> (a, Maybe a) -> m (Step a a))
-> m (Step a a)
-> (a -> m a)
-> (a -> m a)
-> Fold m (a, Maybe a) a
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> (s -> m b) -> Fold m a b
Fold a -> (a, Maybe a) -> m (Step a a)
forall {m :: * -> *} {s} {b}.
(Monad m, Num s) =>
s -> (s, Maybe s) -> m (Step s b)
step m (Step a a)
forall {b}. m (Step a b)
initial a -> m a
forall {a}. a -> m a
extract a -> m a
forall {a}. a -> m a
extract
where
initial :: m (Step a b)
initial = Step a b -> m (Step a b)
forall {a}. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step a b -> m (Step a b)) -> Step a b -> m (Step a b)
forall a b. (a -> b) -> a -> b
$ a -> Step a b
forall s b. s -> Step s b
Partial (a
0 :: a)
step :: s -> (s, Maybe s) -> m (Step s b)
step s
s (s
a, Maybe s
ma) =
Step s b -> m (Step s b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
(Step s b -> m (Step s b)) -> Step s b -> m (Step s b)
forall a b. (a -> b) -> a -> b
$ s -> Step s b
forall s b. s -> Step s b
Partial
(s -> Step s b) -> s -> Step s b
forall a b. (a -> b) -> a -> b
$ case Maybe s
ma of
Maybe s
Nothing -> s
s s -> s -> s
forall a. Num a => a -> a -> a
+ s
a
Just s
old -> s
s s -> s -> s
forall a. Num a => a -> a -> a
+ s
a s -> s -> s
forall a. Num a => a -> a -> a
- s
old
extract :: a -> m a
extract = a -> m a
forall {a}. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
{-# INLINE windowSum #-}
windowSum :: forall m a. (Monad m, Num a) => Fold m (a, Maybe a) a
windowSum :: forall (m :: * -> *) a. (Monad m, Num a) => Fold m (a, Maybe a) a
windowSum = (Tuple' a a -> (a, Maybe a) -> m (Step (Tuple' a a) a))
-> m (Step (Tuple' a a) a)
-> (Tuple' a a -> m a)
-> (Tuple' a a -> m a)
-> Fold m (a, Maybe a) a
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> (s -> m b) -> Fold m a b
Fold Tuple' a a -> (a, Maybe a) -> m (Step (Tuple' a a) a)
forall {m :: * -> *} {b} {b}.
(Monad m, Num b) =>
Tuple' b b -> (b, Maybe b) -> m (Step (Tuple' b b) b)
step m (Step (Tuple' a a) a)
forall {b}. m (Step (Tuple' a a) b)
initial Tuple' a a -> m a
forall {m :: * -> *} {a} {b}. Monad m => Tuple' a b -> m a
extract Tuple' a a -> m a
forall {m :: * -> *} {a} {b}. Monad m => Tuple' a b -> m a
extract
where
initial :: m (Step (Tuple' a a) b)
initial =
Step (Tuple' a a) b -> m (Step (Tuple' a a) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return
(Step (Tuple' a a) b -> m (Step (Tuple' a a) b))
-> Step (Tuple' a a) b -> m (Step (Tuple' a a) b)
forall a b. (a -> b) -> a -> b
$ Tuple' a a -> Step (Tuple' a a) b
forall s b. s -> Step s b
Partial
(Tuple' a a -> Step (Tuple' a a) b)
-> Tuple' a a -> Step (Tuple' a a) b
forall a b. (a -> b) -> a -> b
$ a -> a -> Tuple' a a
forall a b. a -> b -> Tuple' a b
Tuple'
(a
0 :: a)
(a
0 :: a)
step :: Tuple' b b -> (b, Maybe b) -> m (Step (Tuple' b b) b)
step (Tuple' b
total b
err) (b
new, Maybe b
mOld) =
let incr :: b
incr =
case Maybe b
mOld of
Maybe b
Nothing -> b
new b -> b -> b
forall a. Num a => a -> a -> a
- b
err
Just b
old -> (b
new b -> b -> b
forall a. Num a => a -> a -> a
- b
old) b -> b -> b
forall a. Num a => a -> a -> a
- b
err
total1 :: b
total1 = b
total b -> b -> b
forall a. Num a => a -> a -> a
+ b
incr
err1 :: b
err1 = (b
total1 b -> b -> b
forall a. Num a => a -> a -> a
- b
total) b -> b -> b
forall a. Num a => a -> a -> a
- b
incr
in Step (Tuple' b b) b -> m (Step (Tuple' b b) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Tuple' b b) b -> m (Step (Tuple' b b) b))
-> Step (Tuple' b b) b -> m (Step (Tuple' b b) b)
forall a b. (a -> b) -> a -> b
$ Tuple' b b -> Step (Tuple' b b) b
forall s b. s -> Step s b
Partial (Tuple' b b -> Step (Tuple' b b) b)
-> Tuple' b b -> Step (Tuple' b b) b
forall a b. (a -> b) -> a -> b
$ b -> b -> Tuple' b b
forall a b. a -> b -> Tuple' a b
Tuple' b
total1 b
err1
extract :: Tuple' a b -> m a
extract (Tuple' a
total b
_) = a -> m a
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return a
total
{-# INLINE windowLength #-}
windowLength :: (Monad m, Num b) => Fold m (a, Maybe a) b
windowLength :: forall (m :: * -> *) b a. (Monad m, Num b) => Fold m (a, Maybe a) b
windowLength = (b -> (a, Maybe a) -> b) -> b -> Fold m (a, Maybe a) b
forall (m :: * -> *) b a.
Monad m =>
(b -> a -> b) -> b -> Fold m a b
Fold.foldl' b -> (a, Maybe a) -> b
forall {a} {a} {a}. Num a => a -> (a, Maybe a) -> a
step b
0
where
step :: a -> (a, Maybe a) -> a
step a
w (a
_, Maybe a
Nothing) = a
w a -> a -> a
forall a. Num a => a -> a -> a
+ a
1
step a
w (a, Maybe a)
_ = a
w
{-# INLINE windowPowerSum #-}
windowPowerSum :: (Monad m, Num a) => Int -> Fold m (a, Maybe a) a
windowPowerSum :: forall (m :: * -> *) a.
(Monad m, Num a) =>
Int -> Fold m (a, Maybe a) a
windowPowerSum Int
k = (a -> a) -> Fold m (a, Maybe a) a -> Fold m (a, Maybe a) a
forall c a (m :: * -> *) b.
(c -> a) -> Fold m (a, Maybe a) b -> Fold m (c, Maybe c) b
windowLmap (a -> Int -> a
forall a b. (Num a, Integral b) => a -> b -> a
^ Int
k) Fold m (a, Maybe a) a
forall (m :: * -> *) a. (Monad m, Num a) => Fold m (a, Maybe a) a
windowSum
{-# INLINE windowPowerSumFrac #-}
windowPowerSumFrac :: (Monad m, Floating a) => a -> Fold m (a, Maybe a) a
windowPowerSumFrac :: forall (m :: * -> *) a.
(Monad m, Floating a) =>
a -> Fold m (a, Maybe a) a
windowPowerSumFrac a
p = (a -> a) -> Fold m (a, Maybe a) a -> Fold m (a, Maybe a) a
forall c a (m :: * -> *) b.
(c -> a) -> Fold m (a, Maybe a) b -> Fold m (c, Maybe c) b
windowLmap (a -> a -> a
forall a. Floating a => a -> a -> a
** a
p) Fold m (a, Maybe a) a
forall (m :: * -> *) a. (Monad m, Num a) => Fold m (a, Maybe a) a
windowSum
{-# INLINE ringRange #-}
ringRange :: (MonadIO m, Unbox a, Ord a) => RingArray a -> m (Maybe (a, a))
ringRange :: forall (m :: * -> *) a.
(MonadIO m, Unbox a, Ord a) =>
RingArray a -> m (Maybe (a, a))
ringRange rb :: RingArray a
rb@RingArray{Int
MutByteArray
ringContents :: MutByteArray
ringSize :: Int
ringHead :: Int
ringContents :: forall a. RingArray a -> MutByteArray
ringSize :: forall a. RingArray a -> Int
ringHead :: forall a. RingArray a -> Int
..} = do
if Int
ringSize Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0
then Maybe (a, a) -> m (Maybe (a, a))
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe (a, a)
forall a. Maybe a
Nothing
else do
a
x <- IO a -> m a
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO a -> m a) -> IO a -> m a
forall a b. (a -> b) -> a -> b
$ Int -> MutByteArray -> IO a
forall a. Unbox a => Int -> MutByteArray -> IO a
peekAt Int
0 MutByteArray
ringContents
let accum :: (b, b) -> b -> m (b, b)
accum (b
mn, b
mx) b
a = (b, b) -> m (b, b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> b -> b
forall a. Ord a => a -> a -> a
min b
mn b
a, b -> b -> b
forall a. Ord a => a -> a -> a
max b
mx b
a)
in ((a, a) -> Maybe (a, a)) -> m (a, a) -> m (Maybe (a, a))
forall a b. (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, a) -> Maybe (a, a)
forall a. a -> Maybe a
Just (m (a, a) -> m (Maybe (a, a))) -> m (a, a) -> m (Maybe (a, a))
forall a b. (a -> b) -> a -> b
$ ((a, a) -> a -> m (a, a)) -> (a, a) -> RingArray a -> m (a, a)
forall (m :: * -> *) a b.
(MonadIO m, Unbox a) =>
(b -> a -> m b) -> b -> RingArray a -> m b
RingArray.foldlM' (a, a) -> a -> m (a, a)
forall {m :: * -> *} {b}.
(Monad m, Ord b) =>
(b, b) -> b -> m (b, b)
accum (a
x, a
x) RingArray a
rb
{-# INLINE windowRange #-}
windowRange :: forall m a. (MonadIO m, Unbox a, Ord a) => Int -> Fold m a (Maybe (a, a))
windowRange :: forall (m :: * -> *) a.
(MonadIO m, Unbox a, Ord a) =>
Int -> Fold m a (Maybe (a, a))
windowRange Int
n = (Tuple3Fused' MutByteArray Int Int
-> a
-> m (Step (Tuple3Fused' MutByteArray Int Int) (Maybe (a, a))))
-> m (Step (Tuple3Fused' MutByteArray Int Int) (Maybe (a, a)))
-> (Tuple3Fused' MutByteArray Int Int -> m (Maybe (a, a)))
-> (Tuple3Fused' MutByteArray Int Int -> m (Maybe (a, a)))
-> Fold m a (Maybe (a, a))
forall (m :: * -> *) a b s.
(s -> a -> m (Step s b))
-> m (Step s b) -> (s -> m b) -> (s -> m b) -> Fold m a b
Fold Tuple3Fused' MutByteArray Int Int
-> a -> m (Step (Tuple3Fused' MutByteArray Int Int) (Maybe (a, a)))
forall {m :: * -> *} {a} {c} {b}.
(MonadIO m, Unbox a, Num c) =>
Tuple3Fused' MutByteArray Int c
-> a -> m (Step (Tuple3Fused' MutByteArray Int c) b)
step m (Step (Tuple3Fused' MutByteArray Int Int) (Maybe (a, a)))
forall {b}. m (Step (Tuple3Fused' MutByteArray Int Int) b)
initial Tuple3Fused' MutByteArray Int Int -> m (Maybe (a, a))
forall {m :: * -> *} {a}.
(MonadIO m, Ord a, Unbox a) =>
Tuple3Fused' MutByteArray Int Int -> m (Maybe (a, a))
extract Tuple3Fused' MutByteArray Int Int -> m (Maybe (a, a))
forall {m :: * -> *} {a}.
(MonadIO m, Ord a, Unbox a) =>
Tuple3Fused' MutByteArray Int Int -> m (Maybe (a, a))
extract
where
initial :: m (Step (Tuple3Fused' MutByteArray Int Int) b)
initial =
if Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0
then [Char] -> m (Step (Tuple3Fused' MutByteArray Int Int) b)
forall a. HasCallStack => [Char] -> a
error [Char]
"ringsOf: window size must be > 0"
else do
MutArray a
arr :: MutArray.MutArray a <- IO (MutArray a) -> m (MutArray a)
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (MutArray a) -> m (MutArray a))
-> IO (MutArray a) -> m (MutArray a)
forall a b. (a -> b) -> a -> b
$ Int -> IO (MutArray a)
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
Int -> m (MutArray a)
MutArray.emptyOf Int
n
Step (Tuple3Fused' MutByteArray Int Int) b
-> m (Step (Tuple3Fused' MutByteArray Int Int) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Tuple3Fused' MutByteArray Int Int) b
-> m (Step (Tuple3Fused' MutByteArray Int Int) b))
-> Step (Tuple3Fused' MutByteArray Int Int) b
-> m (Step (Tuple3Fused' MutByteArray Int Int) b)
forall a b. (a -> b) -> a -> b
$ Tuple3Fused' MutByteArray Int Int
-> Step (Tuple3Fused' MutByteArray Int Int) b
forall s b. s -> Step s b
Partial (Tuple3Fused' MutByteArray Int Int
-> Step (Tuple3Fused' MutByteArray Int Int) b)
-> Tuple3Fused' MutByteArray Int Int
-> Step (Tuple3Fused' MutByteArray Int Int) b
forall a b. (a -> b) -> a -> b
$ MutByteArray -> Int -> Int -> Tuple3Fused' MutByteArray Int Int
forall a b c. a -> b -> c -> Tuple3Fused' a b c
Tuple3Fused' (MutArray a -> MutByteArray
forall a. MutArray a -> MutByteArray
MutArray.arrContents MutArray a
arr) Int
0 Int
0
step :: Tuple3Fused' MutByteArray Int c
-> a -> m (Step (Tuple3Fused' MutByteArray Int c) b)
step (Tuple3Fused' MutByteArray
mba Int
rh c
i) a
a = do
RingArray MutByteArray
_ Int
_ Int
rh1 <- RingArray a -> a -> m (RingArray a)
forall (m :: * -> *) a.
(MonadIO m, Unbox a) =>
RingArray a -> a -> m (RingArray a)
RingArray.replace_ (MutByteArray -> Int -> Int -> RingArray a
forall a. MutByteArray -> Int -> Int -> RingArray a
RingArray MutByteArray
mba (Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
* SIZE_OF(a)) rh) a
Step (Tuple3Fused' MutByteArray Int c) b
-> m (Step (Tuple3Fused' MutByteArray Int c) b)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Tuple3Fused' MutByteArray Int c) b
-> m (Step (Tuple3Fused' MutByteArray Int c) b))
-> Step (Tuple3Fused' MutByteArray Int c) b
-> m (Step (Tuple3Fused' MutByteArray Int c) b)
forall a b. (a -> b) -> a -> b
$ Tuple3Fused' MutByteArray Int c
-> Step (Tuple3Fused' MutByteArray Int c) b
forall s b. s -> Step s b
Partial (Tuple3Fused' MutByteArray Int c
-> Step (Tuple3Fused' MutByteArray Int c) b)
-> Tuple3Fused' MutByteArray Int c
-> Step (Tuple3Fused' MutByteArray Int c) b
forall a b. (a -> b) -> a -> b
$ MutByteArray -> Int -> c -> Tuple3Fused' MutByteArray Int c
forall a b c. a -> b -> c -> Tuple3Fused' a b c
Tuple3Fused' MutByteArray
mba Int
rh1 (c
i c -> c -> c
forall a. Num a => a -> a -> a
+ c
1)
extract :: Tuple3Fused' MutByteArray Int Int -> m (Maybe (a, a))
extract (Tuple3Fused' MutByteArray
mba Int
rh Int
i) =
let rs :: Int
rs = Int -> Int -> Int
forall a. Ord a => a -> a -> a
min Int
i Int
n Int -> Int -> Int
forall a. Num a => a -> a -> a
* SIZE_OF(a)
rh1 :: Int
rh1 = if Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
n then Int
0 else Int
rh
in RingArray a -> m (Maybe (a, a))
forall (m :: * -> *) a.
(MonadIO m, Unbox a, Ord a) =>
RingArray a -> m (Maybe (a, a))
ringRange (RingArray a -> m (Maybe (a, a)))
-> RingArray a -> m (Maybe (a, a))
forall a b. (a -> b) -> a -> b
$ MutByteArray -> Int -> Int -> RingArray a
forall a. MutByteArray -> Int -> Int -> RingArray a
RingArray MutByteArray
mba Int
rs Int
rh1
{-# INLINE windowMinimum #-}
windowMinimum :: (MonadIO m, Unbox a, Ord a) => Int -> Fold m a (Maybe a)
windowMinimum :: forall (m :: * -> *) a.
(MonadIO m, Unbox a, Ord a) =>
Int -> Fold m a (Maybe a)
windowMinimum Int
n = (Maybe (a, a) -> Maybe a)
-> Fold m a (Maybe (a, a)) -> Fold m a (Maybe a)
forall a b. (a -> b) -> Fold m a a -> Fold m a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (((a, a) -> a) -> Maybe (a, a) -> Maybe a
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, a) -> a
forall a b. (a, b) -> a
fst) (Fold m a (Maybe (a, a)) -> Fold m a (Maybe a))
-> Fold m a (Maybe (a, a)) -> Fold m a (Maybe a)
forall a b. (a -> b) -> a -> b
$ Int -> Fold m a (Maybe (a, a))
forall (m :: * -> *) a.
(MonadIO m, Unbox a, Ord a) =>
Int -> Fold m a (Maybe (a, a))
windowRange Int
n
{-# INLINE windowMaximum #-}
windowMaximum :: (MonadIO m, Unbox a, Ord a) => Int -> Fold m a (Maybe a)
windowMaximum :: forall (m :: * -> *) a.
(MonadIO m, Unbox a, Ord a) =>
Int -> Fold m a (Maybe a)
windowMaximum Int
n = (Maybe (a, a) -> Maybe a)
-> Fold m a (Maybe (a, a)) -> Fold m a (Maybe a)
forall a b. (a -> b) -> Fold m a a -> Fold m a b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (((a, a) -> a) -> Maybe (a, a) -> Maybe a
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, a) -> a
forall a b. (a, b) -> b
snd) (Fold m a (Maybe (a, a)) -> Fold m a (Maybe a))
-> Fold m a (Maybe (a, a)) -> Fold m a (Maybe a)
forall a b. (a -> b) -> a -> b
$ Int -> Fold m a (Maybe (a, a))
forall (m :: * -> *) a.
(MonadIO m, Unbox a, Ord a) =>
Int -> Fold m a (Maybe (a, a))
windowRange Int
n
{-# INLINE windowMean #-}
windowMean :: forall m a. (Monad m, Fractional a) => Fold m (a, Maybe a) a
windowMean :: forall (m :: * -> *) a.
(Monad m, Fractional a) =>
Fold m (a, Maybe a) a
windowMean = (a -> a -> a)
-> Fold m (a, Maybe a) a
-> Fold m (a, Maybe a) a
-> Fold m (a, Maybe a) a
forall (m :: * -> *) a b c x.
Monad m =>
(a -> b -> c) -> Fold m x a -> Fold m x b -> Fold m x c
Fold.teeWith a -> a -> a
forall a. Fractional a => a -> a -> a
(/) Fold m (a, Maybe a) a
forall (m :: * -> *) a. (Monad m, Num a) => Fold m (a, Maybe a) a
windowSum Fold m (a, Maybe a) a
forall (m :: * -> *) b a. (Monad m, Num b) => Fold m (a, Maybe a) b
windowLength