func CreateMarkovChain(prefixlen int, dbpath string, create bool, getchan func() (chan Token, error)) (mc *MarkovChain, err error) { var opts = new(kv.Options) var conerr error mc = new(MarkovChain) opts.Compare = bytes.Compare mc.prefixLen = prefixlen if create { mc.CorpusDB, conerr = kv.Create(dbpath, opts) if conerr != nil { if mc.CorpusDB, conerr = kv.Open(dbpath, opts); conerr != nil { err = errors.New(fmt.Sprintf("cannot create new database %s : %s", dbpath, conerr)) return } } else { c, e := getchan() if e != nil { mc.CorpusDB.Close() os.Remove(dbpath) err = nil return } mc.PopulateCorpus(c) } } else { mc.CorpusDB, conerr = kv.Open(dbpath, opts) if conerr != nil { err = errors.New(fmt.Sprintf("cannot open database %s : %s", dbpath, conerr)) return } } return }