first draft of the stock exchange
This commit is contained in:
1 parent
b1ba21f391
commit
c099924a89
7 files changed
+296
-24
No files matched your search
+77
-2
@@ -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))))
|
||||
Reference in new issue
Block a user