{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, FlexibleInstances, RebindableSyntax #-} module Control.IxMonad.ReadOnlyWriter (HNil'(..), HCons'(..), put, AppendA(..)) where import Control.IxMonad import Data.HList hiding (Monad(..), append) import Prelude hiding (Monad(..)) instance IxMonad (,) where type Inv (,) s t = AppendA s t type Unit (,) = HNil' type Plus (,) s t = Append s t return x = (HNil', x) (r, a) >>= k = let (s, b) = k a in (r `append` s, b) put :: a -> (HCons' a HNil', ()) put x = (HCons' x HNil', ()) -- Type-level append class AppendA s t where type Append s t append :: s -> t -> Append s t instance AppendA HNil' t where type Append HNil' t = t append HNil' t = t instance AppendA xs ys => AppendA (HCons' x xs) ys where type Append (HCons' x xs) ys = HCons' x (Append xs ys) append (HCons' x xs) ys = HCons' x (append xs ys)