hsequence :: Monad m => [[x] -> m x] -> m [x]
hsequence [] = pure []
hsequence (r:rs) = do
x <- r []
xs <- hsequence [ \ys -> g (x:ys) | g <- rs ]
pure (x:xs)