aboutsummaryrefslogtreecommitdiff
path: root/ch09/Module_9_b_3.hs
diff options
context:
space:
mode:
authorJan Sucan <jan@jansucan.com>2023-09-27 15:59:19 +0200
committerJan Sucan <jan@jansucan.com>2023-09-27 15:59:19 +0200
commit1bb8a1fb9a13840f96fd395093ae1a8694917ac3 (patch)
treeaa8a68a308c7278507b93a74df8179202a0cd7a8 /ch09/Module_9_b_3.hs
parent5d47dc25454d0e2e9472aedd7b66099821e6658c (diff)
9_b_4: Add solution
Diffstat (limited to 'ch09/Module_9_b_3.hs')
-rw-r--r--ch09/Module_9_b_3.hs66
1 files changed, 66 insertions, 0 deletions
diff --git a/ch09/Module_9_b_3.hs b/ch09/Module_9_b_3.hs
new file mode 100644
index 0000000..ce38717
--- /dev/null
+++ b/ch09/Module_9_b_3.hs
@@ -0,0 +1,66 @@
+-- Take the predicates and combinators from "Gluing predicates together" on page
+-- 224 and make them work with our new Info type.
+
+module Module_9_b_3 where
+
+{-- From examples/examples/ch09/BetterPredicate.hs modified according to the assignment --}
+import Data.Time (UTCTime(..))
+import System.Directory (Permissions(..))
+import System.FilePath (takeExtension)
+
+import ControlledVisit (Info(..))
+
+
+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 Module_9_b_3.hs
+-- [1 of 2] Compiling ControlledVisit ( ControlledVisit.hs, interpreted )
+-- [2 of 2] Compiling Module_9_b_3 ( Module_9_b_3.hs, interpreted )
+-- Ok, two modules 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