title: Efficient queue in Haskell
body: <p>How can I efficiently implement a list data structure where I can have 2 views to the head and end of the list, that always point to a head a tail of a list without expensive calls to reverse.
  i.e:</p>
  
  <pre><code>start x = []
  end x = reverse start -- []
  start1 = [1,2,3] ++ start
  end start1 -- [3,2,1]
  </code></pre>
  
  <p>end should be able to do this without invoking 'reverse' but simply looking at the given list from the perspective of the list being in reverse automatically. The same should hold if I create new lists from concatenations to start.</p>