summaryrefslogtreecommitdiff
path: root/Types/DeferredParse.hs
diff options
context:
space:
mode:
authorJoey Hess <joeyh@joeyh.name>2015-07-09 16:20:30 -0400
committerJoey Hess <joeyh@joeyh.name>2015-07-09 16:20:30 -0400
commite59ba5a70b6d008afae4f9cfaea7e2495a870937 (patch)
treeab6a330b35d305e3eae9ee431de85c5bf24ce777 /Types/DeferredParse.hs
parenta7f58634b8aebaf653bd59f44abb62ea37e7d5e1 (diff)
refactor
Diffstat (limited to 'Types/DeferredParse.hs')
-rw-r--r--Types/DeferredParse.hs33
1 files changed, 33 insertions, 0 deletions
diff --git a/Types/DeferredParse.hs b/Types/DeferredParse.hs
new file mode 100644
index 0000000000..2f463de353
--- /dev/null
+++ b/Types/DeferredParse.hs
@@ -0,0 +1,33 @@
+{- git-annex deferred parse values
+ -
+ - Copyright 2015 Joey Hess <id@joeyh.name>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+{-# LANGUAGE FlexibleInstances #-}
+
+module Types.DeferredParse where
+
+import Annex
+import Common
+
+-- Some values cannot be fully parsed without performing an action.
+-- The action may be expensive, so it's best to call finishParse on such a
+-- value before using getParsed repeatedly.
+data DeferredParse a = DeferredParse (Annex a) | ReadyParse a
+
+class DeferredParseClass a where
+ finishParse :: a -> Annex a
+
+getParsed :: DeferredParse a -> Annex a
+getParsed (DeferredParse a) = a
+getParsed (ReadyParse a) = pure a
+
+instance DeferredParseClass (DeferredParse a) where
+ finishParse (DeferredParse a) = ReadyParse <$> a
+ finishParse (ReadyParse a) = pure (ReadyParse a)
+
+instance DeferredParseClass (Maybe (DeferredParse a)) where
+ finishParse Nothing = pure Nothing
+ finishParse (Just v) = Just <$> finishParse v