package acme import ( "errors" "time" ) // Solver decribes a solving interface type Solver interface { Solve() error Abort() error } var canSolve = make(map[ChallengeType]bool) var errTimeOut = errors.New("time out") func registerChallenge(c ChallengeType) { canSolve[c] = true } func Solve(s Solver, timeout time.Duration) error { errc := make(chan error) go func() { errc <- s.Solve() }() select { case err := <-errc: return err case <-time.After(timeout): s.Abort() return errTimeOut } }