AV
Size: a a a
AV
A
AV
AV
AV
AV
AV
AV
R
zip x ((const True <$> drop 1 x)++[False])
import Control.Exception
import Data.IORef
import System.IO.Unsafe
lastIsFalse :: [Bool]
lastIsFalse = unsafePerformIO $ do
ref <- newIORef False
let go = do
b <- unsafeInterleaveIO $ readIORef ref
bs <- unsafeInterleaveIO $ do
writeIORef ref True
_ <- evaluate b
writeIORef ref False
go
pure $ b : bs
go
walk :: [a] -> [a]
walk = foldr (\x r -> (:) x $! r) []
-- >>> test
-- [(1,True),(2,True),(3,True),(4,True),(5,False)]
test = walk $ take 5 $ zip [1..] lastIsFalse