first draft of the stock exchange

This commit is contained in:
didier amyot committed 2018-06-01 19:04:52 -04:00
1 parent b1ba21f391
commit c099924a89
7 files changed
+296 -24

No files matched your search

+77 -2
View File
@@ -1,5 +1,80 @@
(ns book.core)
(ns book.core
(:require [book.match :refer [sell?
create-buy-book
create-sell-book
match-order-in-book]]
[book.util :refer :all]
[book.order] ;; for spec side effect
[clojure.edn :as edn]
[clojure.core.async :refer [chan go >!! <!!]]
[clojure.spec.alpha :as s])
(:gen-class))
(def incoming-order-channel (chan))
(def trades-channel (chan))
(def new-book-order-channel (chan))
(defn print-chan [prefix c]
(loop [shit (<!! c)]
(println prefix shit)
(recur (<!! c))))
(def master-book {:sell (create-sell-book)
:buy (create-buy-book)})
;
;(defn process-buy-order [order]
; (let [[x y x] (match-order-in-book @buy-book order)]))
;;; repl things.
(defn read-order []
(try
(print "$ ")
(let [order (edn/read-string (read-line))
valid? (s/valid? :book.order/order order)]
(if valid? order nil))
(catch Exception e nil)))
(def order-ids (atom -1))
(defn add-id-to-order [order]
(assoc order :book.order/id (swap! order-ids inc)))
(defn process-orders [master-book orders-channel trades-channel new-book-order-channel]
(loop [order (<!! orders-channel)
{sell-book :sell buy-book :buy} master-book]
(if (sell? order)
(do
(let [[trades new-buy-book leftover-order] (match-order-in-book buy-book order)
new-sell-book (if leftover-order (conj sell-book) leftover-order)]
(when (seq trades) (>!! trades-channel trades))
(when leftover-order (>!! new-book-order-channel leftover-order))
(recur (<!! orders-channel) {:sell new-sell-book :buy new-buy-book})))
(do
(let [[trades new-sell-book leftover-order] (match-order-in-book sell-book order)
new-buy-book (if leftover-order (conj buy-book) leftover-order)]
(when (seq trades) (>!! trades-channel trades))
(when leftover-order (>!! new-book-order-channel leftover-order))
(recur (<!! orders-channel) {:sell new-sell-book :buy new-buy-book}))))))
(defn -main [& args]
(println "hello workd"))
(println "enter orders in edn format.")
(go (print-chan "trade > " trades-channel))
(go (print-chan "order > " new-book-order-channel))
(go (process-orders master-book incoming-order-channel trades-channel new-book-order-channel))
(loop [order (read-order)]
(if (some? order)
(do
(let [order-with-id (add-id-to-order order)]
(>!! incoming-order-channel order-with-id)
(println "\n\norder accepted with id: " (:book.order/id order-with-id))))
(println "invalid order"))
(recur (read-order))))