{-# LANGUAGE BangPatterns #-}
module Control.Loop.Internal
( loop
, unsafeLoop
) where
loop :: (Enum e, Eq e, Monad m) => e -> e -> (e -> m ()) -> m ()
loop :: e -> e -> (e -> m ()) -> m ()
loop e
start e
end e -> m ()
f = e -> m ()
go e
start
where
go :: e -> m ()
go !e
x | e
x e -> e -> Bool
forall a. Eq a => a -> a -> Bool
== e
end = e -> m ()
f e
x
| Bool
otherwise = e -> m ()
f e
x m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> e -> m ()
go (e -> e
forall a. Enum a => a -> a
succ e
x)
{-# INLINE loop #-}
unsafeLoop :: (Enum e, Eq e, Monad m) => e -> e -> (e -> m ()) -> m ()
unsafeLoop :: e -> e -> (e -> m ()) -> m ()
unsafeLoop e
start e
end e -> m ()
f = e -> m ()
go e
start
where
go :: e -> m ()
go !e
x | e
x e -> e -> Bool
forall a. Eq a => a -> a -> Bool
== e
end = e -> m ()
f e
x
| Bool
otherwise = e -> m ()
f e
x m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> e -> m ()
go (e -> e
unsafeSucc e
x)
unsafeSucc :: e -> e
unsafeSucc = Int -> e
forall a. Enum a => Int -> a
toEnum (Int -> e) -> (e -> Int) -> e -> e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) (Int -> Int) -> (e -> Int) -> e -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> Int
forall a. Enum a => a -> Int
fromEnum
{-# INLINE unsafeLoop #-}