loops-0.2.0.2: Fast imperative-style loops
Safe HaskellSafe-Inferred
LanguageHaskell2010

Control.Monad.Loop.Internal

Synopsis

Documentation

newtype LoopT (m :: k -> Type) a Source #

LoopT m a represents a loop over a base type m that yields a value a at each iteration. It can be used as a monad transformer, but there are actually no restrictions on the type m. However, this library only provides functions to execute the loop if m is at least Applicative (for exec_). If m is also Foldable, so is LoopT m. For any other type, you may use runLoopT.

Constructors

LoopT 

Fields

  • runLoopT :: forall (r :: k). (a -> m r -> m r -> m r) -> m r -> m r -> m r
     

Instances

Instances details
MonadTrans (LoopT :: (Type -> Type) -> Type -> Type) Source # 
Instance details

Defined in Control.Monad.Loop.Internal

Methods

lift :: Monad m => m a -> LoopT m a #

MonadIO m => MonadIO (LoopT m) Source # 
Instance details

Defined in Control.Monad.Loop.Internal

Methods

liftIO :: IO a -> LoopT m a #

(Applicative m, Foldable m) => Foldable (LoopT m) Source # 
Instance details

Defined in Control.Monad.Loop.Internal

Methods

fold :: Monoid m0 => LoopT m m0 -> m0 #

foldMap :: Monoid m0 => (a -> m0) -> LoopT m a -> m0 #

foldMap' :: Monoid m0 => (a -> m0) -> LoopT m a -> m0 #

foldr :: (a -> b -> b) -> b -> LoopT m a -> b #

foldr' :: (a -> b -> b) -> b -> LoopT m a -> b #

foldl :: (b -> a -> b) -> b -> LoopT m a -> b #

foldl' :: (b -> a -> b) -> b -> LoopT m a -> b #

foldr1 :: (a -> a -> a) -> LoopT m a -> a #

foldl1 :: (a -> a -> a) -> LoopT m a -> a #

toList :: LoopT m a -> [a] #

null :: LoopT m a -> Bool #

length :: LoopT m a -> Int #

elem :: Eq a => a -> LoopT m a -> Bool #

maximum :: Ord a => LoopT m a -> a #

minimum :: Ord a => LoopT m a -> a #

sum :: Num a => LoopT m a -> a #

product :: Num a => LoopT m a -> a #

(Applicative m, Foldable m) => Traversable (LoopT m) Source # 
Instance details

Defined in Control.Monad.Loop.Internal

Methods

traverse :: Applicative f => (a -> f b) -> LoopT m a -> f (LoopT m b) #

sequenceA :: Applicative f => LoopT m (f a) -> f (LoopT m a) #

mapM :: Monad m0 => (a -> m0 b) -> LoopT m a -> m0 (LoopT m b) #

sequence :: Monad m0 => LoopT m (m0 a) -> m0 (LoopT m a) #

Applicative (LoopT m) Source # 
Instance details

Defined in Control.Monad.Loop.Internal

Methods

pure :: a -> LoopT m a #

(<*>) :: LoopT m (a -> b) -> LoopT m a -> LoopT m b #

liftA2 :: (a -> b -> c) -> LoopT m a -> LoopT m b -> LoopT m c #

(*>) :: LoopT m a -> LoopT m b -> LoopT m b #

(<*) :: LoopT m a -> LoopT m b -> LoopT m a #

Functor (LoopT m) Source # 
Instance details

Defined in Control.Monad.Loop.Internal

Methods

fmap :: (a -> b) -> LoopT m a -> LoopT m b #

(<$) :: a -> LoopT m b -> LoopT m a #

Monad (LoopT m) Source # 
Instance details

Defined in Control.Monad.Loop.Internal

Methods

(>>=) :: LoopT m a -> (a -> LoopT m b) -> LoopT m b #

(>>) :: LoopT m a -> LoopT m b -> LoopT m b #

return :: a -> LoopT m a #

Monad m => ForEach (LoopT m) (Vector a) Source # 
Instance details

Defined in Control.Monad.Loop.ForEach

Associated Types

type ForEachValue (Vector a) 
Instance details

Defined in Control.Monad.Loop.ForEach

type ForEachValue (Vector a) = a
type ForEachIx (Vector a) 
Instance details

Defined in Control.Monad.Loop.ForEach

type ForEachIx (Vector a) = Int

Methods

forEach :: forall (n :: Nat). Unrolling (UnTL n) => Unroll n -> Vector a -> LoopT m (ForEachValue (Vector a)) Source #

iforEach :: forall (n :: Nat). Unrolling (UnTL n) => Unroll n -> Vector a -> LoopT m (ForEachIx (Vector a), ForEachValue (Vector a)) Source #

(Monad m, Prim a) => ForEach (LoopT m) (Vector a) Source # 
Instance details

Defined in Control.Monad.Loop.ForEach

Associated Types

type ForEachValue (Vector a) 
Instance details

Defined in Control.Monad.Loop.ForEach

type ForEachValue (Vector a) = a
type ForEachIx (Vector a) 
Instance details

Defined in Control.Monad.Loop.ForEach

type ForEachIx (Vector a) = Int

Methods

forEach :: forall (n :: Nat). Unrolling (UnTL n) => Unroll n -> Vector a -> LoopT m (ForEachValue (Vector a)) Source #

iforEach :: forall (n :: Nat). Unrolling (UnTL n) => Unroll n -> Vector a -> LoopT m (ForEachIx (Vector a), ForEachValue (Vector a)) Source #

(Monad m, Storable a) => ForEach (LoopT m) (Vector a) Source # 
Instance details

Defined in Control.Monad.Loop.ForEach

Associated Types

type ForEachValue (Vector a) 
Instance details

Defined in Control.Monad.Loop.ForEach

type ForEachValue (Vector a) = a
type ForEachIx (Vector a) 
Instance details

Defined in Control.Monad.Loop.ForEach

type ForEachIx (Vector a) = Int

Methods

forEach :: forall (n :: Nat). Unrolling (UnTL n) => Unroll n -> Vector a -> LoopT m (ForEachValue (Vector a)) Source #

iforEach :: forall (n :: Nat). Unrolling (UnTL n) => Unroll n -> Vector a -> LoopT m (ForEachIx (Vector a), ForEachValue (Vector a)) Source #

(Monad m, Unbox a) => ForEach (LoopT m) (Vector a) Source # 
Instance details

Defined in Control.Monad.Loop.ForEach

Associated Types

type ForEachValue (Vector a) 
Instance details

Defined in Control.Monad.Loop.ForEach

type ForEachValue (Vector a) = a
type ForEachIx (Vector a) 
Instance details

Defined in Control.Monad.Loop.ForEach

type ForEachIx (Vector a) = Int

Methods

forEach :: forall (n :: Nat). Unrolling (UnTL n) => Unroll n -> Vector a -> LoopT m (ForEachValue (Vector a)) Source #

iforEach :: forall (n :: Nat). Unrolling (UnTL n) => Unroll n -> Vector a -> LoopT m (ForEachIx (Vector a), ForEachValue (Vector a)) Source #

Monad m => ForEach (LoopT m) [a] Source # 
Instance details

Defined in Control.Monad.Loop.ForEach

Associated Types

type ForEachValue [a] 
Instance details

Defined in Control.Monad.Loop.ForEach

type ForEachValue [a] = a
type ForEachIx [a] 
Instance details

Defined in Control.Monad.Loop.ForEach

type ForEachIx [a] = Int

Methods

forEach :: forall (n :: Nat). Unrolling (UnTL n) => Unroll n -> [a] -> LoopT m (ForEachValue [a]) Source #

iforEach :: forall (n :: Nat). Unrolling (UnTL n) => Unroll n -> [a] -> LoopT m (ForEachIx [a], ForEachValue [a]) Source #

(PrimMonad m, PrimState m ~ s) => ForEach (LoopT m) (MVector s a) Source # 
Instance details

Defined in Control.Monad.Loop.ForEach

Associated Types

type ForEachValue (MVector s a) 
Instance details

Defined in Control.Monad.Loop.ForEach

type ForEachValue (MVector s a) = a
type ForEachIx (MVector s a) 
Instance details

Defined in Control.Monad.Loop.ForEach

type ForEachIx (MVector s a) = Int

Methods

forEach :: forall (n :: Nat). Unrolling (UnTL n) => Unroll n -> MVector s a -> LoopT m (ForEachValue (MVector s a)) Source #

iforEach :: forall (n :: Nat). Unrolling (UnTL n) => Unroll n -> MVector s a -> LoopT m (ForEachIx (MVector s a), ForEachValue (MVector s a)) Source #

(PrimMonad m, Prim a, PrimState m ~ s) => ForEach (LoopT m) (MVector s a) Source # 
Instance details

Defined in Control.Monad.Loop.ForEach

Associated Types

type ForEachValue (MVector s a) 
Instance details

Defined in Control.Monad.Loop.ForEach

type ForEachValue (MVector s a) = a
type ForEachIx (MVector s a) 
Instance details

Defined in Control.Monad.Loop.ForEach

type ForEachIx (MVector s a) = Int

Methods

forEach :: forall (n :: Nat). Unrolling (UnTL n) => Unroll n -> MVector s a -> LoopT m (ForEachValue (MVector s a)) Source #

iforEach :: forall (n :: Nat). Unrolling (UnTL n) => Unroll n -> MVector s a -> LoopT m (ForEachIx (MVector s a), ForEachValue (MVector s a)) Source #

(Storable a, PrimMonad m, PrimState m ~ s) => ForEach (LoopT m) (MVector s a) Source # 
Instance details

Defined in Control.Monad.Loop.ForEach

Associated Types

type ForEachValue (MVector s a) 
Instance details

Defined in Control.Monad.Loop.ForEach

type ForEachValue (MVector s a) = a
type ForEachIx (MVector s a) 
Instance details

Defined in Control.Monad.Loop.ForEach

type ForEachIx (MVector s a) = Int

Methods

forEach :: forall (n :: Nat). Unrolling (UnTL n) => Unroll n -> MVector s a -> LoopT m (ForEachValue (MVector s a)) Source #

iforEach :: forall (n :: Nat). Unrolling (UnTL n) => Unroll n -> MVector s a -> LoopT m (ForEachIx (MVector s a), ForEachValue (MVector s a)) Source #

(PrimMonad m, Unbox a, PrimState m ~ s) => ForEach (LoopT m) (MVector s a) Source # 
Instance details

Defined in Control.Monad.Loop.ForEach

Associated Types

type ForEachValue (MVector s a) 
Instance details

Defined in Control.Monad.Loop.ForEach

type ForEachValue (MVector s a) = a
type ForEachIx (MVector s a) 
Instance details

Defined in Control.Monad.Loop.ForEach

type ForEachIx (MVector s a) = Int

Methods

forEach :: forall (n :: Nat). Unrolling (UnTL n) => Unroll n -> MVector s a -> LoopT m (ForEachValue (MVector s a)) Source #

iforEach :: forall (n :: Nat). Unrolling (UnTL n) => Unroll n -> MVector s a -> LoopT m (ForEachIx (MVector s a), ForEachValue (MVector s a)) Source #

type Loop = LoopT Identity Source #

Loop is a pure loop, without side-effects.

loop :: Loop a -> Loop a Source #

loop is just an aid to type inference. For loops over a base monad, there are usually other constraints that fix the type, but for pure loops, the compiler often has trouble inferring Identity.

data Unroll (n :: Nat) Source #

Proxy type for GHC's type level literal natural numbers. n is the number of times the loop will be unrolled into its own body.

Constructors

Unroll 

type family UnTL (n :: Nat) :: Nat where ... Source #

Equations

UnTL 1 = 'S 'Z 
UnTL n = 'S (UnTL (n - 1)) 

class Unrolling (n :: Nat) Source #

Minimal complete definition

unrollFor, unrollIterate

noUnroll :: Unroll 1 Source #

Do not unroll the loop at all.

cons :: forall {k} a (m :: k -> Type). a -> LoopT m a -> LoopT m a Source #

continue :: forall {k} a (m :: k -> Type). a -> LoopT m a Source #

Yield a value for this iteration of the loop and skip immediately to the next iteration.

continue_ :: forall {k} (m :: k -> Type) a. LoopT m a Source #

Skip immediately to the next iteration of the loop without yielding a value.

break_ :: forall {k} (m :: k -> Type) a. LoopT m a Source #

Skip all the remaining iterations of the immediately-enclosing loop.

exec_ :: Applicative m => LoopT m a -> m () Source #

Execute a loop, sequencing the effects and discarding the values.

iterate Source #

Arguments

:: forall {k} (n :: Nat) a (m :: k -> Type). Unrolling (UnTL n) 
=> Unroll n

Unrolling factor

-> a

Starting value of iterator

-> (a -> a)

Advance the iterator

-> LoopT m a 

Iterate forever (or until break is used).

forever :: forall {k} (n :: Nat) (m :: k -> Type). Unrolling (UnTL n) => Unroll n -> LoopT m () Source #

Loop forever without yielding (interesting) values.

for Source #

Arguments

:: forall {k} (n :: Nat) a (m :: k -> Type). Unrolling (UnTL n) 
=> Unroll n

Unrolling factor

-> a

Starting value of iterator

-> (a -> Bool)

Termination condition. The loop will terminate the first time this is false. The termination condition is checked at the start of each iteration.

-> (a -> a)

Advance the iterator

-> LoopT m a 

Standard for loop.

unfoldl Source #

Arguments

:: forall {k} (n :: Nat) i a (m :: k -> Type). Unrolling (UnTL n) 
=> Unroll n

Unrolling factor

-> (i -> Maybe (i, a))

Just (i, a) advances the loop, yielding an a. Nothing terminates the loop.

-> i

Starting value

-> LoopT m a 

Unfold a loop from the left.

while :: forall (n :: Nat) m. (Unrolling (UnTL n), Monad m) => Unroll n -> m Bool -> LoopT m () Source #