aboutsummaryrefslogtreecommitdiff
path: root/ch09
diff options
context:
space:
mode:
Diffstat (limited to 'ch09')
-rw-r--r--ch09/9_b_3.hs68
1 files changed, 68 insertions, 0 deletions
diff --git a/ch09/9_b_3.hs b/ch09/9_b_3.hs
new file mode 100644
index 0000000..882f7db
--- /dev/null
+++ b/ch09/9_b_3.hs
@@ -0,0 +1,68 @@
+-- Take the predicates and combinators from "Gluing predicates together" on page
+-- 224 and make them work with our new Info type.
+
+{-- From examples/examples/ch09/BetterPredicate.hs modified according to the assignment --}
+import Data.Time (UTCTime(..))
+import System.Directory (Permissions(..))
+import System.FilePath (takeExtension)
+
+
+data Info = Info {
+ infoPath :: FilePath
+ , infoPerms :: Maybe Permissions
+ , infoSize :: Maybe Integer
+ , infoModTime :: Maybe UTCTime
+ } deriving (Eq, Ord, Show)
+
+type InfoF a = Info -> a
+
+
+equalP :: (Eq a) => InfoF a -> a -> (InfoF Bool)
+equalP f k = (\info -> f info == k)
+
+equalP' :: (Eq a) => (InfoF a) -> a -> (InfoF Bool)
+equalP' f k info = (f info == k)
+
+liftP :: (a -> b -> Bool) -> (InfoF a) -> b -> (InfoF Bool)
+liftP q f k info = f info `q` k
+
+greaterP, lesserP :: (Ord a) => (InfoF a) -> a -> (InfoF Bool)
+greaterP = liftP (>)
+lesserP = liftP (<)
+
+simpleAndP :: (InfoF Bool) -> (InfoF Bool) -> (InfoF Bool)
+simpleAndP f g info = f info && g info
+
+liftP2 :: (a -> b -> Bool) -> (InfoF a) -> (InfoF b) -> (InfoF Bool)
+liftP2 q f g info = f info `q` g info
+
+andP = liftP2 (&&)
+orP = liftP2 (||)
+
+constP :: a -> (InfoF a)
+constP k _ = k
+
+liftP' q f k info = f info `q` constP k info
+
+liftPath :: (FilePath -> a) -> (InfoF a)
+liftPath f info = f (infoPath info)
+
+myTest2 = (liftPath takeExtension `equalP` ".cpp") `andP`
+ (infoSize `greaterP` (Just 131072))
+{-- End of code from examples --}
+
+-- ghci> :l 9_b_3.hs
+-- [1 of 1] Compiling Main ( 9_b_3.hs, interpreted )
+-- Ok, one module loaded.
+
+-- ghci> infoA = Info "asdf.cpp" Nothing (Just 131072) Nothing
+-- ghci> myTest2 infoA
+-- False
+
+-- ghci> infoB = Info "asdf.hs" Nothing (Just 131073) Nothing
+-- ghci> myTest2 infoB
+-- False
+
+-- ghci> infoC = Info "asdf.cpp" Nothing (Just 131073) Nothing
+-- ghci> myTest2 infoC
+-- True