package acme import ( "errors" "time" ) // Solver decribes a solving interface type Solver interface { Solve() error Abort() error } var ( canSolve = make(map[ChallengeType]bool) errTimeOut = errors.New("time out") ) func registerSolver(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 } }