{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, FlexibleInstances, 
             TypeOperators, DataKinds, KindSignatures #-}

module Control.Effect.WriteOnceWriter (put, WriteOnce(..)) where

import Control.Effect
import Control.Effect.Helpers.List
import Prelude hiding (Monad(..))

data WriteOnce (w :: [*]) a = W { runWriteOnce :: (a, List w) }

instance Effect WriteOnce where
    type Inv WriteOnce s t = ()
    type Unit WriteOnce = '[]
    type Plus WriteOnce s t = s :++ t

    return x = W (x, Nil)
    (W (a, r)) >>= k = let (W (b, s)) = k a in W (b, r `append` s)
 
put :: a -> WriteOnce (a ': '[]) ()
put x = W ((), Cons x Nil)