module Ivory.Artifact.Transformer
  ( Transformer()
  , emptyTransformer
  , transform
  , transformErr
  , runTransformer
  ) where

newtype Transformer a =
  Transformer
    { unTransformer :: a -> Either String a
    }

emptyTransformer :: Transformer a
emptyTransformer  = Transformer Right

transform :: (a -> a) -> Transformer a -> Transformer a
transform f (Transformer t) = Transformer $ \a -> do
  a' <- t a
  return (f a')

transformErr :: (a -> Either String a) -> Transformer a -> Transformer a
transformErr f (Transformer t) = Transformer $ \a -> do
  a' <- t a
  f a'

runTransformer :: Transformer a -> a -> Either String a
runTransformer  = unTransformer