-- | This library provides functions for list multiplexing.
module Data.List.Mux
    ( -- * Multiplex two lists starting from the left element
      mux
      -- * ... or the right element
    , mux'
    )
  where

-- | Two examples follow below:
--
-- >>> mux [1,2,3] [4,5,6]
-- [1,4,2,5,3,6]
--
-- >>> mux' [1,2,3] [4,5,6]
-- [4,1,5,2,6,3]
--

mux :: [a] -> [a] -> [a]
mux = muxl

mux' :: [a] -> [a] -> [a]
mux' = muxr

muxl :: [a] -> [a] -> [a]
muxl [] [] = []
muxl xs [] = xs
muxl [] ys = ys
muxl (x:xs) ys = x : muxr xs ys

muxr :: [a] -> [a] -> [a]
muxr [] [] = []
muxr xs [] = xs
muxr [] ys = ys
muxr xs (y:ys) = y : muxl xs ys