module General.ListBuilder(
    ListBuilder, runListBuilder, newListBuilder
    ) where

import Data.Monoid
import Prelude()

data ListBuilder a
    = Zero
    | One a
    | Add (ListBuilder a) (ListBuilder a)

instance Monoid (ListBuilder a) where
    mempty = Zero
    mappend Zero x = x
    mappend x Zero = x
    mappend x y = Add x y

newListBuilder :: a -> ListBuilder a
newListBuilder = One

runListBuilder :: ListBuilder a -> [a]
runListBuilder x = f x []
    where
        f Zero acc = []
        f (One x) acc = x : acc
        f (Add x y) acc = f x (f y acc)