{-# LANGUAGE CPP                       #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleContexts          #-}
{-# LANGUAGE RankNTypes                #-}
{-# LANGUAGE TupleSections             #-}
module Control.Scanl (
    
      Scan(..)
    , ScanM(..)
    
    , scan
    , scanM
    , scanr
    , prescan
    , postscan
    
    
    , purely
    , purely_
    , impurely
    , impurely_
    , generalize
    , simplify
    , hoists
    , arrM
    , premap
    , premapM
    ) where
import Control.Applicative
import Control.Arrow
import Control.Category
import Control.Foldl (Fold(..))
import Control.Foldl.Internal (Pair(..))
import Control.Monad ((<=<))
import Control.Monad.Trans.Class
import qualified Control.Monad.Trans.State.Lazy as Lazy
import Control.Monad.Trans.State.Strict
import Data.Functor.Identity
import Data.Monoid hiding ((<>))
import Data.Profunctor
import Data.Semigroup (Semigroup(..))
import Data.Traversable
import Data.Tuple (swap)
import Prelude hiding ((.), id, scanr)
#if MIN_VERSION_base(4, 7, 0)
import Data.Coerce
#endif
asLazy :: StateT s m a -> Lazy.StateT s m a
asLazy :: forall s (m :: * -> *) a. StateT s m a -> StateT s m a
asLazy = forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
Lazy.StateT forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT
data Scan a b
  
  = forall x. Scan (a -> State x b) x
instance Functor (Scan a) where
    fmap :: forall a b. (a -> b) -> Scan a a -> Scan a b
fmap a -> b
f (Scan a -> State x a
step x
begin) = forall a b x. (a -> State x b) -> x -> Scan a b
Scan (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> State x a
step) x
begin
    {-# INLINE fmap #-}
instance Applicative (Scan a) where
    pure :: forall a. a -> Scan a a
pure a
b    = forall a b x. (a -> State x b) -> x -> Scan a b
Scan (\a
_ -> forall (f :: * -> *) a. Applicative f => a -> f a
pure a
b) ()
    {-# INLINE pure #-}
    (Scan a -> State x (a -> b)
stepL x
beginL) <*> :: forall a b. Scan a (a -> b) -> Scan a a -> Scan a b
<*> (Scan a -> State x a
stepR x
beginR) =
        let step :: a -> Pair x x -> (b, Pair x x)
step a
a (Pair x
xL x
xR) = (a -> b
bL a
bR, (forall a b. a -> b -> Pair a b
Pair x
xL' x
xR'))
              where (a -> b
bL, x
xL') = forall s a. State s a -> s -> (a, s)
runState (a -> State x (a -> b)
stepL a
a) x
xL
                    (a
bR, x
xR') = forall s a. State s a -> s -> (a, s)
runState (a -> State x a
stepR a
a) x
xR
            begin :: Pair x x
begin = forall a b. a -> b -> Pair a b
Pair x
beginL x
beginR
        in  forall a b x. (a -> State x b) -> x -> Scan a b
Scan (forall (m :: * -> *) s a. Monad m => (s -> (a, s)) -> StateT s m a
state forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> Pair x x -> (b, Pair x x)
step) Pair x x
begin
    {-# INLINE (<*>) #-}
instance Profunctor Scan where
    lmap :: forall a b c. (a -> b) -> Scan b c -> Scan a c
lmap = forall a b c. (a -> b) -> Scan b c -> Scan a c
premap
    rmap :: forall b c a. (b -> c) -> Scan a b -> Scan a c
rmap = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
instance Category Scan where
    id :: forall a. Scan a a
id = forall a b x. (a -> State x b) -> x -> Scan a b
Scan forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    {-# INLINE id #-}
    (Scan b -> State x c
s2 x
b2) . :: forall b c a. Scan b c -> Scan a b -> Scan a c
. (Scan a -> State x b
s1 x
b1) = forall a b x. (a -> State x b) -> x -> Scan a b
Scan (forall (m :: * -> *) s a. Monad m => (s -> (a, s)) -> StateT s m a
state forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> Pair x x -> (c, Pair x x)
step) (forall a b. a -> b -> Pair a b
Pair x
b1 x
b2)
        where step :: a -> Pair x x -> (c, Pair x x)
step a
a (Pair x
xL x
xR) = (c
c, forall a b. a -> b -> Pair a b
Pair x
xL' x
xR')
                where (b
b, x
xL') = forall s a. State s a -> s -> (a, s)
runState (a -> State x b
s1 a
a) x
xL
                      (c
c, x
xR') = forall s a. State s a -> s -> (a, s)
runState (b -> State x c
s2 b
b) x
xR
    {-# INLINE (.) #-}
instance Arrow Scan where
    arr :: forall b c. (b -> c) -> Scan b c
arr b -> c
f = forall a b x. (a -> State x b) -> x -> Scan a b
Scan (forall (f :: * -> *) a. Applicative f => a -> f a
pure forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. b -> c
f) ()
    {-# INLINE arr #-}
    first :: forall b c d. Scan b c -> Scan (b, d) (c, d)
first  (Scan b -> State x c
step x
begin) = forall a b x. (a -> State x b) -> x -> Scan a b
Scan
      (\(b
a,d
b) -> forall (m :: * -> *) s a. Monad m => (s -> (a, s)) -> StateT s m a
state forall a b. (a -> b) -> a -> b
$ \x
x -> forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first (,d
b) forall a b. (a -> b) -> a -> b
$ forall s a. State s a -> s -> (a, s)
runState (b -> State x c
step b
a) x
x)
      x
begin
    {-# INLINE first #-}
    second :: forall b c d. Scan b c -> Scan (d, b) (d, c)
second (Scan b -> State x c
step x
begin) = forall a b x. (a -> State x b) -> x -> Scan a b
Scan
      (\(d
b,b
a) -> forall (m :: * -> *) s a. Monad m => (s -> (a, s)) -> StateT s m a
state forall a b. (a -> b) -> a -> b
$ \x
x  -> forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first (d
b,) forall a b. (a -> b) -> a -> b
$ forall s a. State s a -> s -> (a, s)
runState (b -> State x c
step b
a) x
x)
      x
begin
    {-# INLINE second #-}
instance Semigroup b => Semigroup (Scan a b) where
    <> :: Scan a b -> Scan a b -> Scan a b
(<>) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. Semigroup a => a -> a -> a
(<>)
    {-# INLINE (<>) #-}
instance Monoid b => Monoid (Scan a b) where
    mempty :: Scan a b
mempty = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Monoid a => a
mempty
    {-# INLINE mempty #-}
    mappend :: Scan a b -> Scan a b -> Scan a b
mappend = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. Monoid a => a -> a -> a
mappend
    {-# INLINE mappend #-}
instance Num b => Num (Scan a b) where
    fromInteger :: Integer -> Scan a b
fromInteger = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Num a => Integer -> a
fromInteger
    {-# INLINE fromInteger #-}
    negate :: Scan a b -> Scan a b
negate = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Num a => a -> a
negate
    {-# INLINE negate #-}
    abs :: Scan a b -> Scan a b
abs = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Num a => a -> a
abs
    {-# INLINE abs #-}
    signum :: Scan a b -> Scan a b
signum = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Num a => a -> a
signum
    {-# INLINE signum #-}
    + :: Scan a b -> Scan a b -> Scan a b
(+) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. Num a => a -> a -> a
(+)
    {-# INLINE (+) #-}
    * :: Scan a b -> Scan a b -> Scan a b
(*) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. Num a => a -> a -> a
(*)
    {-# INLINE (*) #-}
    (-) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (-)
    {-# INLINE (-) #-}
instance Fractional b => Fractional (Scan a b) where
    fromRational :: Rational -> Scan a b
fromRational = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Fractional a => Rational -> a
fromRational
    {-# INLINE fromRational #-}
    recip :: Scan a b -> Scan a b
recip = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Fractional a => a -> a
recip
    {-# INLINE recip #-}
    / :: Scan a b -> Scan a b -> Scan a b
(/) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. Fractional a => a -> a -> a
(/)
    {-# INLINE (/) #-}
instance Floating b => Floating (Scan a b) where
    pi :: Scan a b
pi = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Floating a => a
pi
    {-# INLINE pi #-}
    exp :: Scan a b -> Scan a b
exp = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
exp
    {-# INLINE exp #-}
    sqrt :: Scan a b -> Scan a b
sqrt = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
sqrt
    {-# INLINE sqrt #-}
    log :: Scan a b -> Scan a b
log = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
log
    {-# INLINE log #-}
    sin :: Scan a b -> Scan a b
sin = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
sin
    {-# INLINE sin #-}
    tan :: Scan a b -> Scan a b
tan = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
tan
    {-# INLINE tan #-}
    cos :: Scan a b -> Scan a b
cos = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
cos
    {-# INLINE cos #-}
    asin :: Scan a b -> Scan a b
asin = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
asin
    {-# INLINE asin #-}
    atan :: Scan a b -> Scan a b
atan = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
atan
    {-# INLINE atan #-}
    acos :: Scan a b -> Scan a b
acos = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
acos
    {-# INLINE acos #-}
    sinh :: Scan a b -> Scan a b
sinh = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
sinh
    {-# INLINE sinh #-}
    tanh :: Scan a b -> Scan a b
tanh = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
tanh
    {-# INLINE tanh #-}
    cosh :: Scan a b -> Scan a b
cosh = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
cosh
    {-# INLINE cosh #-}
    asinh :: Scan a b -> Scan a b
asinh = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
asinh
    {-# INLINE asinh #-}
    atanh :: Scan a b -> Scan a b
atanh = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
atanh
    {-# INLINE atanh #-}
    acosh :: Scan a b -> Scan a b
acosh = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
acosh
    {-# INLINE acosh #-}
    ** :: Scan a b -> Scan a b -> Scan a b
(**) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. Floating a => a -> a -> a
(**)
    {-# INLINE (**) #-}
    logBase :: Scan a b -> Scan a b -> Scan a b
logBase = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. Floating a => a -> a -> a
logBase
    {-# INLINE logBase #-}
data ScanM m a b =
  
  forall x . ScanM (a -> StateT x m b) (m x)
instance Functor m => Functor (ScanM m a) where
    fmap :: forall a b. (a -> b) -> ScanM m a a -> ScanM m a b
fmap a -> b
f (ScanM a -> StateT x m a
step m x
begin) = forall (m :: * -> *) a b x.
(a -> StateT x m b) -> m x -> ScanM m a b
ScanM (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> StateT x m a
step) m x
begin
    {-# INLINE fmap #-}
instance Applicative m => Applicative (ScanM m a) where
    pure :: forall a. a -> ScanM m a a
pure a
b    = forall (m :: * -> *) a b x.
(a -> StateT x m b) -> m x -> ScanM m a b
ScanM (\a
_ -> forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \() -> forall (f :: * -> *) a. Applicative f => a -> f a
pure (a
b, ())) (forall (f :: * -> *) a. Applicative f => a -> f a
pure ())
    {-# INLINE pure #-}
    (ScanM a -> StateT x m (a -> b)
stepL m x
beginL) <*> :: forall a b. ScanM m a (a -> b) -> ScanM m a a -> ScanM m a b
<*> (ScanM a -> StateT x m a
stepR m x
beginR) =
        let step :: a -> Pair x x -> m (b, Pair x x)
step a
a (Pair x
xL x
xR) =
              (\(a -> b
bL, x
xL') (a
bR, x
xR') -> (a -> b
bL a
bR, (forall a b. a -> b -> Pair a b
Pair x
xL' x
xR')))
              forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT (a -> StateT x m (a -> b)
stepL a
a) x
xL
              forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT (a -> StateT x m a
stepR a
a) x
xR
            begin :: m (Pair x x)
begin = forall a b. a -> b -> Pair a b
Pair forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m x
beginL forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> m x
beginR
        in  forall (m :: * -> *) a b x.
(a -> StateT x m b) -> m x -> ScanM m a b
ScanM (forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> Pair x x -> m (b, Pair x x)
step) m (Pair x x)
begin
    {-# INLINE (<*>) #-}
instance Functor m => Profunctor (ScanM m) where
    rmap :: forall b c a. (b -> c) -> ScanM m a b -> ScanM m a c
rmap = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
    lmap :: forall a b c. (a -> b) -> ScanM m b c -> ScanM m a c
lmap a -> b
f (ScanM b -> StateT x m c
step m x
begin) = forall (m :: * -> *) a b x.
(a -> StateT x m b) -> m x -> ScanM m a b
ScanM (b -> StateT x m c
step forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> b
f) m x
begin
instance Monad m => Category (ScanM m) where
    id :: forall a. ScanM m a a
id = forall (m :: * -> *) a b x.
(a -> StateT x m b) -> m x -> ScanM m a b
ScanM forall (f :: * -> *) a. Applicative f => a -> f a
pure (forall (f :: * -> *) a. Applicative f => a -> f a
pure ())
    {-# INLINE id #-}
    (ScanM b -> StateT x m c
s2 m x
b2) . :: forall b c a. ScanM m b c -> ScanM m a b -> ScanM m a c
. (ScanM a -> StateT x m b
s1 m x
b1) = forall (m :: * -> *) a b x.
(a -> StateT x m b) -> m x -> ScanM m a b
ScanM (forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> Pair x x -> m (c, Pair x x)
step) (forall a b. a -> b -> Pair a b
Pair forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m x
b1 forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> m x
b2)
        where step :: a -> Pair x x -> m (c, Pair x x)
step a
a (Pair x
xL x
xR) = do
                (b
b, x
xL') <- forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT (a -> StateT x m b
s1 a
a) x
xL
                (c
c, x
xR') <- forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT (b -> StateT x m c
s2 b
b) x
xR
                forall (f :: * -> *) a. Applicative f => a -> f a
pure (c
c, forall a b. a -> b -> Pair a b
Pair x
xL' x
xR')
    {-# INLINE (.) #-}
instance Monad m => Arrow (ScanM m) where
    arr :: forall b c. (b -> c) -> ScanM m b c
arr b -> c
f = forall (m :: * -> *) a b x.
(a -> StateT x m b) -> m x -> ScanM m a b
ScanM (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. b -> c
f) (forall (f :: * -> *) a. Applicative f => a -> f a
pure ())
    {-# INLINE arr #-}
    first :: forall b c d. ScanM m b c -> ScanM m (b, d) (c, d)
first  (ScanM b -> StateT x m c
step m x
begin) = forall (m :: * -> *) a b x.
(a -> StateT x m b) -> m x -> ScanM m a b
ScanM
      (\(b
a,d
b) -> forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \x
x -> forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first (,d
b) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT (b -> StateT x m c
step b
a) x
x)
      m x
begin
    {-# INLINE first #-}
    second :: forall b c d. ScanM m b c -> ScanM m (d, b) (d, c)
second (ScanM b -> StateT x m c
step m x
begin) = forall (m :: * -> *) a b x.
(a -> StateT x m b) -> m x -> ScanM m a b
ScanM
      (\(d
b,b
a) -> forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ \x
x  -> forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (b, d) (c, d)
first (d
b,) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT (b -> StateT x m c
step b
a) x
x)
      m x
begin
    {-# INLINE second #-}
instance (Monad m, Semigroup b) => Semigroup (ScanM m a b) where
    <> :: ScanM m a b -> ScanM m a b -> ScanM m a b
(<>) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. Semigroup a => a -> a -> a
(<>)
    {-# INLINE (<>) #-}
instance (Monad m, Monoid b) => Monoid (ScanM m a b) where
    mempty :: ScanM m a b
mempty = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Monoid a => a
mempty
    {-# INLINE mempty #-}
    mappend :: ScanM m a b -> ScanM m a b -> ScanM m a b
mappend = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. Monoid a => a -> a -> a
mappend
    {-# INLINE mappend #-}
instance (Monad m, Num b) => Num (ScanM m a b) where
    fromInteger :: Integer -> ScanM m a b
fromInteger = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Num a => Integer -> a
fromInteger
    {-# INLINE fromInteger #-}
    negate :: ScanM m a b -> ScanM m a b
negate = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Num a => a -> a
negate
    {-# INLINE negate #-}
    abs :: ScanM m a b -> ScanM m a b
abs = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Num a => a -> a
abs
    {-# INLINE abs #-}
    signum :: ScanM m a b -> ScanM m a b
signum = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Num a => a -> a
signum
    {-# INLINE signum #-}
    + :: ScanM m a b -> ScanM m a b -> ScanM m a b
(+) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. Num a => a -> a -> a
(+)
    {-# INLINE (+) #-}
    * :: ScanM m a b -> ScanM m a b -> ScanM m a b
(*) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. Num a => a -> a -> a
(*)
    {-# INLINE (*) #-}
    (-) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (-)
    {-# INLINE (-) #-}
instance (Monad m, Fractional b) => Fractional (ScanM m a b) where
    fromRational :: Rational -> ScanM m a b
fromRational = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall a. Fractional a => Rational -> a
fromRational
    {-# INLINE fromRational #-}
    recip :: ScanM m a b -> ScanM m a b
recip = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Fractional a => a -> a
recip
    {-# INLINE recip #-}
    / :: ScanM m a b -> ScanM m a b -> ScanM m a b
(/) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. Fractional a => a -> a -> a
(/)
    {-# INLINE (/) #-}
instance (Monad m, Floating b) => Floating (ScanM m a b) where
    pi :: ScanM m a b
pi = forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a. Floating a => a
pi
    {-# INLINE pi #-}
    exp :: ScanM m a b -> ScanM m a b
exp = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
exp
    {-# INLINE exp #-}
    sqrt :: ScanM m a b -> ScanM m a b
sqrt = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
sqrt
    {-# INLINE sqrt #-}
    log :: ScanM m a b -> ScanM m a b
log = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
log
    {-# INLINE log #-}
    sin :: ScanM m a b -> ScanM m a b
sin = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
sin
    {-# INLINE sin #-}
    tan :: ScanM m a b -> ScanM m a b
tan = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
tan
    {-# INLINE tan #-}
    cos :: ScanM m a b -> ScanM m a b
cos = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
cos
    {-# INLINE cos #-}
    asin :: ScanM m a b -> ScanM m a b
asin = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
asin
    {-# INLINE asin #-}
    atan :: ScanM m a b -> ScanM m a b
atan = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
atan
    {-# INLINE atan #-}
    acos :: ScanM m a b -> ScanM m a b
acos = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
acos
    {-# INLINE acos #-}
    sinh :: ScanM m a b -> ScanM m a b
sinh = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
sinh
    {-# INLINE sinh #-}
    tanh :: ScanM m a b -> ScanM m a b
tanh = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
tanh
    {-# INLINE tanh #-}
    cosh :: ScanM m a b -> ScanM m a b
cosh = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
cosh
    {-# INLINE cosh #-}
    asinh :: ScanM m a b -> ScanM m a b
asinh = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
asinh
    {-# INLINE asinh #-}
    atanh :: ScanM m a b -> ScanM m a b
atanh = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
atanh
    {-# INLINE atanh #-}
    acosh :: ScanM m a b -> ScanM m a b
acosh = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Floating a => a -> a
acosh
    {-# INLINE acosh #-}
    ** :: ScanM m a b -> ScanM m a b -> ScanM m a b
(**) = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. Floating a => a -> a -> a
(**)
    {-# INLINE (**) #-}
    logBase :: ScanM m a b -> ScanM m a b -> ScanM m a b
logBase = forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 forall a. Floating a => a -> a -> a
logBase
    {-# INLINE logBase #-}
scan :: Traversable t => Scan a b -> t a -> t b
scan :: forall (t :: * -> *) a b. Traversable t => Scan a b -> t a -> t b
scan (Scan a -> State x b
step x
begin) t a
as = forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall s a. State s a -> s -> (a, s)
Lazy.runState (forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (forall s (m :: * -> *) a. StateT s m a -> StateT s m a
asLazy forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> State x b
step) t a
as) x
begin
{-# INLINE scan #-}
scanr :: Traversable t => Scan a b -> t a -> t b
scanr :: forall (t :: * -> *) a b. Traversable t => Scan a b -> t a -> t b
scanr (Scan a -> State x b
step x
begin) t a
as =
  forall a b. (a, b) -> a
fst (forall s a. ReverseState s a -> s -> (a, s)
runReverseState (forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (forall s a. (s -> (a, s)) -> ReverseState s a
ReverseState forall b c a. Coercible b c => (b -> c) -> (a -> b) -> a -> c
#. forall s a. State s a -> s -> (a, s)
runState forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> State x b
step) t a
as) x
begin)
{-# INLINE scanr #-}
scanM :: (Traversable t, Monad m) => ScanM m a b -> t a -> m (t b)
scanM :: forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
ScanM m a b -> t a -> m (t b)
scanM (ScanM a -> StateT x m b
step m x
begin) t a
as = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a b. (a, b) -> a
fst forall a b. (a -> b) -> a -> b
$ forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
Lazy.runStateT (forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse (forall s (m :: * -> *) a. StateT s m a -> StateT s m a
asLazy forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> StateT x m b
step) t a
as) forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< m x
begin
{-# INLINE scanM #-}
prescan :: Fold a b -> Scan a b
prescan :: forall a b. Fold a b -> Scan a b
prescan (Fold x -> a -> x
step x
begin x -> b
done) = forall a b x. (a -> State x b) -> x -> Scan a b
Scan (forall (m :: * -> *) s a. Monad m => (s -> (a, s)) -> StateT s m a
state forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> x -> (b, x)
step') x
begin
  where
    step' :: a -> x -> (b, x)
step' a
a x
x = (b
b, x
x')
      where
        x' :: x
x' = x -> a -> x
step x
x a
a
        b :: b
b  = x -> b
done x
x
{-# INLINE prescan #-}
postscan :: Fold a b -> Scan a b
postscan :: forall a b. Fold a b -> Scan a b
postscan (Fold x -> a -> x
step x
begin x -> b
done) = forall a b x. (a -> State x b) -> x -> Scan a b
Scan (forall (m :: * -> *) s a. Monad m => (s -> (a, s)) -> StateT s m a
state forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> x -> (b, x)
step') x
begin
  where
    step' :: a -> x -> (b, x)
step' a
a x
x = (b
b, x
x')
      where
        x' :: x
x' = x -> a -> x
step x
x a
a
        b :: b
b  = x -> b
done x
x'
{-# INLINE postscan #-}
arrM :: Monad m => (b -> m c) -> ScanM m b c
arrM :: forall (m :: * -> *) b c. Monad m => (b -> m c) -> ScanM m b c
arrM b -> m c
f = forall (m :: * -> *) a b x.
(a -> StateT x m b) -> m x -> ScanM m a b
ScanM (forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. b -> m c
f) (forall (f :: * -> *) a. Applicative f => a -> f a
pure ())
{-# INLINE arrM #-}
purely :: (forall x . (a -> State x b) -> x -> r) -> Scan a b -> r
purely :: forall a b r.
(forall x. (a -> State x b) -> x -> r) -> Scan a b -> r
purely forall x. (a -> State x b) -> x -> r
f (Scan a -> State x b
step x
begin) = forall x. (a -> State x b) -> x -> r
f a -> State x b
step x
begin
{-# INLINABLE purely #-}
purely_ :: (forall x . (x -> a -> (x, b)) -> x -> r) -> Scan a b -> r
purely_ :: forall a b r.
(forall x. (x -> a -> (x, b)) -> x -> r) -> Scan a b -> r
purely_ forall x. (x -> a -> (x, b)) -> x -> r
f (Scan a -> State x b
step x
begin) = forall x. (x -> a -> (x, b)) -> x -> r
f (\x
s a
a -> forall a b. (a, b) -> (b, a)
swap forall a b. (a -> b) -> a -> b
$ forall s a. State s a -> s -> (a, s)
runState (a -> State x b
step a
a) x
s) x
begin
{-# INLINABLE purely_ #-}
impurely
    :: (forall x . (a -> StateT x m b) -> m x -> r)
    -> ScanM m a b
    -> r
impurely :: forall a (m :: * -> *) b r.
(forall x. (a -> StateT x m b) -> m x -> r) -> ScanM m a b -> r
impurely forall x. (a -> StateT x m b) -> m x -> r
f (ScanM a -> StateT x m b
step m x
begin) = forall x. (a -> StateT x m b) -> m x -> r
f a -> StateT x m b
step m x
begin
{-# INLINABLE impurely #-}
impurely_
    :: Monad m
    => (forall x . (x -> a -> m (x, b)) -> m x -> r)
    -> ScanM m a b
    -> r
impurely_ :: forall (m :: * -> *) a b r.
Monad m =>
(forall x. (x -> a -> m (x, b)) -> m x -> r) -> ScanM m a b -> r
impurely_ forall x. (x -> a -> m (x, b)) -> m x -> r
f (ScanM a -> StateT x m b
step m x
begin) = forall x. (x -> a -> m (x, b)) -> m x -> r
f (\x
s a
a -> forall a b. (a, b) -> (b, a)
swap forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT (a -> StateT x m b
step a
a) x
s) m x
begin
generalize :: Monad m => Scan a b -> ScanM m a b
generalize :: forall (m :: * -> *) a b. Monad m => Scan a b -> ScanM m a b
generalize (Scan a -> State x b
step x
begin) = forall (m :: * -> *) (n :: * -> *) a b.
(forall x. m x -> n x) -> ScanM m a b -> ScanM n a b
hoists
  (\(Identity x
c) -> forall (f :: * -> *) a. Applicative f => a -> f a
pure x
c)
  (forall (m :: * -> *) a b x.
(a -> StateT x m b) -> m x -> ScanM m a b
ScanM a -> State x b
step (forall a. a -> Identity a
Identity x
begin))
{-# INLINABLE generalize #-}
simplify :: ScanM Identity a b -> Scan a b
simplify :: forall a b. ScanM Identity a b -> Scan a b
simplify (ScanM a -> StateT x Identity b
step (Identity x
begin)) = forall a b x. (a -> State x b) -> x -> Scan a b
Scan a -> StateT x Identity b
step x
begin
{-# INLINABLE simplify #-}
hoists :: (forall x . m x -> n x) -> ScanM m a b -> ScanM n a b
hoists :: forall (m :: * -> *) (n :: * -> *) a b.
(forall x. m x -> n x) -> ScanM m a b -> ScanM n a b
hoists forall x. m x -> n x
phi (ScanM a -> StateT x m b
step m x
begin ) = forall (m :: * -> *) a b x.
(a -> StateT x m b) -> m x -> ScanM m a b
ScanM
  (\a
a -> forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT forall a b. (a -> b) -> a -> b
$ forall x. m x -> n x
phi forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT (a -> StateT x m b
step a
a))
  (forall x. m x -> n x
phi m x
begin)
{-# INLINABLE hoists #-}
premap :: (a -> b) -> Scan b r -> Scan a r
premap :: forall a b c. (a -> b) -> Scan b c -> Scan a c
premap a -> b
f (Scan b -> State x r
step x
begin) = forall a b x. (a -> State x b) -> x -> Scan a b
Scan (b -> State x r
step forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> b
f) x
begin
{-# INLINABLE premap #-}
premapM :: Monad m => (a -> m b) -> ScanM m b r -> ScanM m a r
premapM :: forall (m :: * -> *) a b r.
Monad m =>
(a -> m b) -> ScanM m b r -> ScanM m a r
premapM a -> m b
f (ScanM b -> StateT x m r
step m x
begin) = forall (m :: * -> *) a b x.
(a -> StateT x m b) -> m x -> ScanM m a b
ScanM (b -> StateT x m r
step forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
. a -> m b
f) m x
begin
{-# INLINABLE premapM #-}
newtype ReverseState s a = ReverseState
  { forall s a. ReverseState s a -> s -> (a, s)
runReverseState :: s -> (a, s)
  }
instance Functor (ReverseState s) where
  fmap :: forall a b. (a -> b) -> ReverseState s a -> ReverseState s b
fmap a -> b
f (ReverseState s -> (a, s)
m) =
    forall s a. (s -> (a, s)) -> ReverseState s a
ReverseState forall a b. (a -> b) -> a -> b
$ \s
s ->
      let (a
v, s
s') = s -> (a, s)
m s
s
      in (a -> b
f a
v, s
s')
  {-# INLINE fmap #-}
instance Applicative (ReverseState s) where
  pure :: forall a. a -> ReverseState s a
pure = forall s a. (s -> (a, s)) -> ReverseState s a
ReverseState forall b c a. Coercible b c => (b -> c) -> (a -> b) -> a -> c
#. (,)
  {-# INLINE pure #-}
  ReverseState s (a -> b)
mf <*> :: forall a b.
ReverseState s (a -> b) -> ReverseState s a -> ReverseState s b
<*> ReverseState s a
mx =
    forall s a. (s -> (a, s)) -> ReverseState s a
ReverseState forall a b. (a -> b) -> a -> b
$ \s
s ->
      let (a -> b
f, s
s2) = forall s a. ReverseState s a -> s -> (a, s)
runReverseState ReverseState s (a -> b)
mf s
s1
          (a
x, s
s1) = forall s a. ReverseState s a -> s -> (a, s)
runReverseState ReverseState s a
mx s
s
      in (a -> b
f a
x, s
s2)
  {-# INLINE (<*>) #-}
#if MIN_VERSION_base(4, 10, 0)
  
  liftA2 :: forall a b c.
(a -> b -> c)
-> ReverseState s a -> ReverseState s b -> ReverseState s c
liftA2 a -> b -> c
f ReverseState s a
mx ReverseState s b
my =
    forall s a. (s -> (a, s)) -> ReverseState s a
ReverseState forall a b. (a -> b) -> a -> b
$ \s
s ->
      let (a
x, s
s2) = forall s a. ReverseState s a -> s -> (a, s)
runReverseState ReverseState s a
mx s
s1
          (b
y, s
s1) = forall s a. ReverseState s a -> s -> (a, s)
runReverseState ReverseState s b
my s
s
      in (a -> b -> c
f a
x b
y, s
s2)
  {-# INLINE liftA2 #-}
#endif
#if MIN_VERSION_base(4, 7, 0)
(#.) :: Coercible b c => (b -> c) -> (a -> b) -> (a -> c)
#. :: forall b c a. Coercible b c => (b -> c) -> (a -> b) -> a -> c
(#.) b -> c
_ = coerce :: forall a b. Coercible a b => a -> b
coerce
#else
(#.) :: (b -> c) -> (a -> b) -> (a -> c)
(#.) = (.)
#endif
infixr 9 #.
{-# INLINE (#.) #-}