module Data.DoList
( DoList
, DoListM (DoList)
, item
, fromList
, toList
) where
import Data.DoMonoid
import GHC.Exts (IsList, IsString, Item, fromString)
import qualified GHC.Exts as E (fromList, toList)
type DoList a = DoListM a ()
newtype DoListM a r = DoList (DoMonoidM [a] r)
deriving (Eq, Ord, Read, Show, Functor, Applicative, Monad)
instance (IsString a) => IsString (DoListM a r) where
{-# INLINE fromString #-}
fromString = item . fromString
instance IsList (DoListM a r) where
type Item (DoListM a r) = a
{-# INLINE fromList #-}
fromList = fromList
{-# INLINE toList #-}
toList = toList
{-# INLINE item #-}
item :: a -> DoListM a r
item = fromList . pure
{-# INLINE fromList #-}
fromList :: [a] -> DoListM a r
fromList = DoList . DoM
{-# INLINE toList #-}
toList :: DoListM a r -> [a]
toList (DoList x) = runDoM x