--Zip, but store the excess in a pair
zipWithLeftover :: [a] -> [b] -> ([(a,b)], [a], [b])
zipWithLeftover la lb = (zipList, fst leftover, snd leftover)
    where
        zipList = zip la lb
        leftover 
            | (length la) == (length lb) = ([], [])
            | (length la) >  (length lb) =  (takeEnd (length la - length lb) la, [])
            | otherwise =  ([], takeEnd (length lb - length la) lb)
zipWithLeftover :: [a] -> [b] -> ([(a,b)], [a], [b])
zipWithLeftover la lb = (zipList, fst leftover, snd leftover)
    where
        zipList = zip la lb
        leftover 
            | (length la) == (length lb) = ([], [])
            | (length la) >  (length lb) =  (takeEnd (length la - length lb) la, [])
            | otherwise =  ([], takeEnd (length lb - length la) lb)
zipWithLeftover la lb = (zipList, fst leftover, snd leftover)
    where
        zipList = zip la lb
        leftover 
            | (length la) == (length lb) = ([], [])
            | (length la) >  (length lb) =  (takeEnd (length la - length lb) la, [])
            | otherwise =  ([], takeEnd (length lb - length la) lb)