https://github.com/ppetr/timeout-with-results
Allows timeouting a computation while allowing it to return partial results. Useful for making AI-like algorithms that should return the best result found within a time limit.
https://github.com/ppetr/timeout-with-results
Last synced: about 1 year ago
JSON representation
Allows timeouting a computation while allowing it to return partial results. Useful for making AI-like algorithms that should return the best result found within a time limit.
- Host: GitHub
- URL: https://github.com/ppetr/timeout-with-results
- Owner: ppetr
- License: lgpl-3.0
- Created: 2012-12-03T08:45:41.000Z (over 13 years ago)
- Default Branch: master
- Last Pushed: 2012-12-15T18:29:54.000Z (over 13 years ago)
- Last Synced: 2025-03-27T19:21:56.659Z (over 1 year ago)
- Language: Haskell
- Size: 145 KB
- Stars: 4
- Watchers: 4
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: COPYING
Awesome Lists containing this project
README
# timeout-with-results
A Haskell library that allows timeouting a computation while allowing it to
return partial results. Useful for AI-like algorithms that should
return the best result found within a time limit.
It comes in two variants:
1. Simple, which only allows computations to save partial results, not
retrieve what has been written already. If a computation times out, the last
saved partial result is returned. It comes in two flavours: One that converts
saved values to WHNF, the other to NF. (This is required so that the producing
thread performs the computations, not the consuming thread.)
2. Based on MonadWriter. The types of partial results have to be monoids.
Saving a partial result combines it with the saved value using `mappend`. It
also adds the ability to run a contained computation within another one,
without disturbing its output.
## Examples
### Computing pairs of prime twins
```haskell
{-# LANGUAGE FlexibleContexts #-}
import Control.Monad
import Data.Numbers.Primes -- package 'primes'
import System.Timeout.Returning
-- | Loop forever, computing prime twins.
primeTwins :: MonadTimeout (Integer, Integer) m => [Integer] -> m (Maybe (Integer,Integer))
primeTwins (p : ps@(p' : _))
| p' == p + 2 = partialResult (p, p') >> primeTwins ps
| otherwise = primeTwins ps
-- | Print the largest pair of prime twins we were able to compute in 100ms.
main :: IO ()
main = runTimeoutNF 100000 (primeTwins primes) >>= print
```
### Number guessing game
```haskell
{-# LANGUAGE FlexibleContexts #-}
import Control.Monad
import Control.Monad.IO.Class
import System.Random
import System.Timeout.Returning.Writer
-- | Let the user guess until she hits the number.
guess :: (MonadIO m, MonadWriter [Int] m)
=> Int -- ^ The number to be guessed.
-> m ()
guess n = loop
where
loop = do
is <- liftIO $ putStr "Guess: " >> liftM reads getLine
case is of
((i,_) : _) -> do
tell [i]
case i `compare` n of
EQ -> return ()
LT -> liftIO (putStrLn "Guess larger.") >> loop
GT -> liftIO (putStrLn "Guess smaller.") >> loop
_ -> liftIO (putStrLn "Invalid number.") >> loop
-- | Guess a number.
main :: IO ()
main = do
let limit = 20
putStrLn "Guess a number from 1 to 100."
putStrLn $ "You have " ++ show limit ++ " seconds."
n <- randomRIO (1, 100)
(r, w) <- runTimeout (limit * (10^6)) (guess n)
putStrLn ""
putStr "The number was: " >> print n
case r of
Just _ -> putStrLn "You win!"
otherwise -> putStr "Time's up, you lose. Your guesses: " >> print w
```
# Copyright
Copyright 2012, Petr Pudlák
Contact: [petr.pudlak.name](http://petr.pudlak.name/).

This program is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option) any
later version.
This program is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
details.
You should have received a copy of the GNU Lesser General Public License along
with this program. If not, see .