loops-0.2.0.2: Fast imperative-style loops
Safe HaskellNone
LanguageHaskell2010

Control.Monad.Loop

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.

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.

class ForEach (m :: Type -> Type) c Source #

Class of containers that can be iterated over. The class is parameterized over a base monad where the values of the container can be read to allow iterating over mutable structures. The associated type families parameterize the value and index types of the container, allowing the class to be instantiated for container types (unboxed or storable vectors, for example) which do not admit all types as values.

Minimal complete definition

forEach, iforEach

Associated Types

type ForEachValue c Source #

type ForEachIx c Source #

Instances

Instances details
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 #

iterate Source #

Arguments

:: forall a (m :: Type -> Type). a

Starting value of iterator

-> (a -> a)

Advance the iterator

-> LoopT m a 

forever :: forall (m :: Type -> Type). LoopT m () Source #

for Source #

Arguments

:: forall a (m :: Type -> Type). 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 

unfoldl Source #

Arguments

:: forall i a (m :: Type -> Type). (i -> Maybe (i, a))

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

-> i

Starting value

-> LoopT m a 

while :: Monad m => m Bool -> LoopT m () Source #

forEach :: ForEach m c => c -> m (ForEachValue c) Source #

Iterate over the values in the container.

iforEach :: ForEach m c => c -> m (ForEachIx c, ForEachValue c) Source #

Iterate over the indices and the value at each index.