Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Control.Monad.Trans.State.Lazy
- groupSuccWithCarry :: (Bounded a, Enum a, Ord a) => [a] -> [a]
- groupSuccWithCarry (h : t) = let (carry, h') = succWithCarry h
- in h' : evalState (carryOver t) carry
- succWithCarry :: (Bounded a, Enum a, Ord a) => a -> (Bool, a)
- succWithCarry x = let overflow = x == maxBound
- in (overflow, if overflow then minBound else succ x)
- carryOver :: (Bounded a, Enum a, Monad m, Ord a) => [a] -> StateT Bool m [a]
- carryOver = mapM (\x -> do carry <- get
- let (carry', x') = if carry then succWithCarry x else (False, x)
- put carry'
- return $ x')
Advertisement
Add Comment
Please, Sign In to add comment