[commit: ghc] wip/nfs-locking: Begin translating the code using expressions. (d7cd023)
git at git.haskell.org
git at git.haskell.org
Thu Oct 26 23:09:49 UTC 2017
Repository : ssh://git@git.haskell.org/ghc
On branch : wip/nfs-locking
Link : http://ghc.haskell.org/trac/ghc/changeset/d7cd023a4cc538bcde70d1872af41e4eafc77248/ghc
>---------------------------------------------------------------
commit d7cd023a4cc538bcde70d1872af41e4eafc77248
Author: Andrey Mokhov <andrey.mokhov at gmail.com>
Date: Thu Apr 9 02:50:25 2015 +0100
Begin translating the code using expressions.
>---------------------------------------------------------------
d7cd023a4cc538bcde70d1872af41e4eafc77248
src/Expression/PGPredicate.hs | 62 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 62 insertions(+)
diff --git a/src/Expression/PGPredicate.hs b/src/Expression/PGPredicate.hs
new file mode 100644
index 0000000..45bb97f
--- /dev/null
+++ b/src/Expression/PGPredicate.hs
@@ -0,0 +1,62 @@
+{-# LANGUAGE FlexibleInstances #-}
+
+module Expression.PGPredicate (
+ module Expression.PG,
+ module Expression.Predicate,
+ PGPredicate (..),
+ fence, (?), ite,
+ whenExists,
+ remove,
+ project,
+ linearise
+ ) where
+
+import Control.Applicative
+import Expression.PG
+import Expression.Predicate
+
+type PGPredicate p v = PG (Predicate p) v
+
+fence :: PGPredicate p v -> PGPredicate p v -> PGPredicate p v
+fence = Sequence
+
+(?) :: Predicate p -> PGPredicate p v -> PGPredicate p v
+(?) = Condition
+
+ite :: Predicate p -> PGPredicate p v -> PGPredicate p v -> PGPredicate p v
+ite p t f = Overlay (p ? t) (Not p ? f)
+
+infixl 7 ?
+
+whenExists :: Eq v => v -> PGPredicate p v -> Predicate p
+whenExists _ Epsilon = Evaluated False
+whenExists a (Vertex b) = Evaluated $ a == b
+whenExists a (Overlay l r) = Or (whenExists a l) (whenExists a r)
+whenExists a (Sequence l r) = Or (whenExists a l) (whenExists a r)
+whenExists a (Condition x r) = And x (whenExists a r)
+
+remove :: Eq v => v -> PGPredicate p v -> PGPredicate p v
+remove _ Epsilon = Epsilon
+remove a v @ (Vertex b)
+ | a == b = Epsilon
+ | otherwise = v
+remove a (Overlay l r) = Overlay (remove a l) (remove a r)
+remove a (Sequence l r) = Sequence (remove a l) (remove a r)
+remove a (Condition x r) = Condition x (remove a r)
+
+-- Partially evaluate a PG using a truth-teller (compute a 'projection')
+project :: TruthTeller p -> PGPredicate p v -> PGPredicate p v
+project t = mapP (evaluate t)
+
+-- Linearise a PG into a list. Returns Nothing if the given expression
+-- cannot be uniquely evaluated due to remaining parameters.
+-- Overlay subexpressions are evaluated in arbitrary order.
+linearise :: PGPredicate p v -> Maybe [v]
+linearise Epsilon = Just []
+linearise (Vertex v) = Just [v]
+linearise (Overlay l r) = (++) <$> linearise l <*> linearise r -- TODO: union
+linearise (Sequence l r) = (++) <$> linearise l <*> linearise r
+linearise (Condition x r) = case tellTruth x of
+ Just True -> linearise r
+ Just False -> Just []
+ Nothing -> Nothing
More information about the ghc-commits
mailing list