53 lines
1.3 KiB
Haskell
53 lines
1.3 KiB
Haskell
module Db where
|
|
|
|
import Data.Time
|
|
|
|
data DatabaseItem = DbString String
|
|
| DbNumber Integer
|
|
| DbDate UTCTime
|
|
deriving (Eq, Ord, Show)
|
|
|
|
theDatabase :: [DatabaseItem]
|
|
theDatabase =
|
|
[ DbDate (UTCTime (fromGregorian 1911 5 1) (secondsToDiffTime 34123))
|
|
, DbNumber 9001
|
|
, DbString "Hello, world!"
|
|
, DbDate (UTCTime (fromGregorian 1921 5 1) (secondsToDiffTime 34123))
|
|
]
|
|
|
|
filterDbDate :: [DatabaseItem] -> [UTCTime]
|
|
filterDbDate xs = foldr f1 [] (filter f2 xs)
|
|
where f1 (DbDate d) acc = d : acc
|
|
f2 (DbDate d) = True
|
|
f2 _ = False
|
|
|
|
filterDbNumber :: [DatabaseItem] -> [Integer]
|
|
filterDbNumber xs = foldr f1 [] (filter f2 xs)
|
|
where f1 (DbNumber d) acc = d : acc
|
|
f2 (DbNumber d) = True
|
|
f2 _ = False
|
|
|
|
mostRecent :: [DatabaseItem] -> UTCTime
|
|
mostRecent xs = maximum (filterDbDate xs)
|
|
|
|
sumDb :: [DatabaseItem] -> Integer
|
|
sumDb xs = foldr (+) 0 (filterDbNumber xs)
|
|
|
|
avgDb :: [DatabaseItem] -> Double
|
|
avgDb xs = (fromIntegral (sumDb xs)) / (fromIntegral (length (filterDbNumber xs)))
|
|
|
|
fibs :: [Integer]
|
|
fibs = 1 : scanl (+) 1 fibs
|
|
|
|
fibs20 :: [Integer]
|
|
fibs20 = take 20 (1 : scanl (+) 1 fibs)
|
|
|
|
fibs100 :: [Integer]
|
|
fibs100 = takeWhile (\x -> x < 100) fibs
|
|
|
|
fibsN :: Int -> Integer
|
|
fibsN x = fibs !! x
|
|
|
|
factorial :: [Integer]
|
|
factorial = scanl (*) 1 [1..]
|