summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2011-08-19 14:28:07 -0400
committerGravatar Joey Hess <joey@kitenet.net>2011-08-19 14:28:07 -0400
commit021e8e1e0e40543f3861ed8fb0fc12cd2be46d46 (patch)
tree742a39de83c90ec6aa47dcb1f740a05c20f05f7f
parente97fede8cd86d0eb804ced6d2877f617ba15b1a6 (diff)
make Annex an opaque data type
Was a type alias; using newtype has the benefit that type errors will show "Annex foo" rather than two lines of internal type nonsense. Yay! There should be no other effects to size or runtime. I've tried to do this at least twice before (each time I read RWH chapter 10); finally understood how to this time.. sorta.
-rw-r--r--Annex.hs16
1 files changed, 13 insertions, 3 deletions
diff --git a/Annex.hs b/Annex.hs
index f7e3e29f8..fd7e3b391 100644
--- a/Annex.hs
+++ b/Annex.hs
@@ -5,6 +5,8 @@
- Licensed under the GNU GPL version 3 or higher.
-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+
module Annex (
Annex,
AnnexState(..),
@@ -17,6 +19,7 @@ module Annex (
) where
import Control.Monad.State
+import Control.Monad.IO.Control
import qualified Git
import Git.Queue
@@ -28,7 +31,14 @@ import Types.TrustLevel
import Types.UUID
-- git-annex's monad
-type Annex = StateT AnnexState IO
+newtype Annex a = Annex { runAnnex :: StateT AnnexState IO a }
+ deriving (
+ Functor,
+ Monad,
+ MonadIO,
+ MonadControlIO,
+ MonadState AnnexState
+ )
-- internal state storage
data AnnexState = AnnexState
@@ -78,9 +88,9 @@ new gitrepo = newState `liftM` (liftIO . Git.configRead) gitrepo
{- performs an action in the Annex monad -}
run :: AnnexState -> Annex a -> IO (a, AnnexState)
-run = flip runStateT
+run s a = runStateT (runAnnex a) s
eval :: AnnexState -> Annex a -> IO a
-eval = flip evalStateT
+eval s a = evalStateT (runAnnex a) s
{- Gets a value from the internal state, selected by the passed value
- constructor. -}