FINALPROJECT
FINALPROJECT
-- Order Status
data OrderStatus = Pending | Shipped | Delivered | Canceled deriving (Show,
Eq)
-- Update stock
updateStock :: [(Product, Int)] -> Product -> Product
updateStock items p = case find (matchesProduct p) items of
Just (_, q) -> p { stock = stock p - q }
Nothing -> p
where
matchesProduct :: Product -> (Product, Int) -> Bool
matchesProduct prod (p, _) = productId prod == productId p
-- Cancel an order
cancelOrder :: Order -> [Product] -> [Product]
cancelOrder order products
| orderStatus order == Pending = foldr restoreStock products (productList
order)
| otherwise = products
where
restoreStock (prod, qty) prods = map (restoreProductStock prod qty) prods
-- Helper functions
notSameOrder :: Int -> Order -> Bool
notSameOrder oid order = orderId order /= oid