{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE DeriveFunctor #-}

module Syntax.ListWriter.Internal where

import Control.Monad.Writer (Writer(..), runWriter, tell, MonadWriter(..))

newtype ListM' a x = ListM {
      unListM :: Writer [a] x
   } deriving (Functor, Applicative, Monad, MonadWriter [a], Show, Ord, Eq)

type ListM a = ListM' a ()


toList :: ListM a -> [a]
toList m = snd $ runWriter $ unListM m


fromList :: [a] -> ListM a
fromList = tell


element :: a -> ListM a
element a = fromList [a]


-- addElems :: [a] -> ListM a -> ListM a
-- addElems ls m = m >> tell ls


-- empty :: ListM a
-- empty = ListM $ tell []