[commit: ghc] wip/nfs-locking: Experiment with parameterised graphs. (8f52904)
git at git.haskell.org
git at git.haskell.org
Thu Oct 26 23:55:26 UTC 2017
Repository : ssh://git@git.haskell.org/ghc
On branch : wip/nfs-locking
Link : http://ghc.haskell.org/trac/ghc/changeset/8f52904d2c05f7503b142fa48eb46eb7945e450c/ghc
>---------------------------------------------------------------
commit 8f52904d2c05f7503b142fa48eb46eb7945e450c
Author: Andrey Mokhov <andrey.mokhov at gmail.com>
Date: Mon Feb 9 22:25:52 2015 +0000
Experiment with parameterised graphs.
>---------------------------------------------------------------
8f52904d2c05f7503b142fa48eb46eb7945e450c
src/Settings.hs | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
1 file changed, 87 insertions(+), 7 deletions(-)
diff --git a/src/Settings.hs b/src/Settings.hs
index 6ffc976..42ceed9 100644
--- a/src/Settings.hs
+++ b/src/Settings.hs
@@ -1,18 +1,98 @@
+{-# LANGUAGE FlexibleInstances #-}
+
module Settings (
- IntegerLibrary (..), integerLibrary,
+ IntegerLibrary (..), integerLibrary, integerLibraryName,
buildHaddock
) where
-data IntegerLibrary = IntegerGmp | IntegerGmp2 | IntegerSimple
+import Base
+import Ways
-instance Show IntegerLibrary where
- show library = case library of
- IntegerGmp -> "integer-gmp"
- IntegerGmp2 -> "integer-gmp2"
- IntegerSimple -> "integer-simple"
+data IntegerLibrary = IntegerGmp | IntegerGmp2 | IntegerSimple
integerLibrary :: IntegerLibrary
integerLibrary = IntegerGmp2
+integerLibraryName :: String
+integerLibraryName = case integerLibrary of
+ IntegerGmp -> "integer-gmp"
+ IntegerGmp2 -> "integer-gmp2"
+ IntegerSimple -> "integer-simple"
+
buildHaddock :: Bool
buildHaddock = True
+
+-- A Parameterised Graph datatype for storing argument lists with conditions
+data PG a b = Epsilon
+ | Vertex a
+ | Overlay (PG a b) (PG a b)
+ | Sequence (PG a b) (PG a b)
+ | Condition b (PG a b)
+
+instance Monoid (PG a b) where
+ mempty = Epsilon
+ mappend = Overlay
+
+type ArgsExpression = PG String Predicate
+type WaysExpression = PG Way Predicate
+
+data Match = MatchPackage FilePath -- Match a Package name
+ | MatchFile FilePath -- Match a file
+ | MatchStage Stage -- Match a Stage
+ | MatchWay Way -- Match a Way
+ | MatchKeyValue String String -- Match a key with a value (config)
+
+-- A Matcher takes a Match description and attempts to evaluate it.
+-- Returns Nothing if the attempt fails.
+type Matcher = Match -> Maybe Bool
+
+-- A Monoid instance for matchers (returns first successful match)
+instance Monoid Matcher where
+ mempty = const Nothing
+ p `mappend` q = \m -> getFirst $ First (p m) <> First (q m)
+
+data Predicate = Evaluated Bool -- Evaluated predicate
+ | If Match -- Perform a match to evaluate
+ | Not Predicate -- Negate predicate
+ | And Predicate Predicate -- Conjunction of two predicates
+ | Or Predicate Predicate -- Disjunction of two predicates
+
+match :: Predicate -> Matcher -> Predicate
+match p @ (Evaluated _) _ = p
+match p @ (If match ) m = case m match of
+ Just bool -> Evaluated bool
+ Nothing -> p
+match (Not p ) m = match p m
+match (And p q) m = And (match p m) (match q m)
+match (Or p q) m = Or (match p m) (match q m)
+
+-- returns Nothing if the given predicate cannot be uniquely evaluated
+evalPredicate :: Predicate -> Maybe Bool
+evalPredicate (Evaluated bool) = Just bool
+evalPredicate (Not p) = not <$> evalPredicate p
+evalPredicate (And p q)
+ | p' == Just False || q' == Just False = Just False
+ | p' == Just True && q' == Just True = Just True
+ | otherwise = Nothing
+ where
+ p' = evalPredicate p
+ q' = evalPredicate q
+evalPredicate (Or p q)
+ | p' == Just True || q' == Just True = Just True
+ | p' == Just False && q' == Just False = Just False
+ | otherwise = Nothing
+ where
+ p' = evalPredicate p
+ q' = evalPredicate q
+evalPredicate (If _) = Nothing
+
+-- returns Nothing if the given expression cannot be uniquely evaluated
+evalPG :: PG a Predicate -> Maybe [a]
+evalPG Epsilon = Just []
+evalPG (Vertex v) = Just [v]
+evalPG (Overlay p q) = (++) <$> evalPG p <*> evalPG q
+evalPG (Sequence p q) = (++) <$> evalPG p <*> evalPG q
+evalPG (Condition x p) = case evalPredicate x of
+ Just True -> evalPG p
+ Just False -> Just []
+ Nothing -> Nothing
More information about the ghc-commits
mailing list