From 0718b4c5caa3fe0259fdd6d7fd363936ded03494 Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Mon, 4 May 2020 17:01:45 -0700 Subject: [PATCH] Add README --- README.md | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..484880b --- /dev/null +++ b/README.md @@ -0,0 +1,72 @@ +# Cow Description Language (CDL) +In times of the pandemic, it's not easy to get real input data from your cows to +demonstrate the functionality of your front end. To be able to test some +features of the application, we would like to have scripts that +insert fake data points into our database, allowing us how our app +would behave in real time, without the need to hook up any collars. +These scripts would be tedius to write... + +Unless, of course, you have a Domain Specific Language (DSL) for it! +Enter CDL. We can describe a cow in a turtle-style imperative language: + +```Haskell +squareCow = do + move 10 + turn 90 + move 10 + turn 90 + move 10 + turn 90 + move 10 +``` + +This DSL is shallowly embedded into Haskell, which means that we can +use all of Haskell's abstraction capabilities: + +```Haskell +repeat 0 _ = return () +repeat n thing = do + thing + repeat (n-1) thing + +squareCow = repeat 4 $ do + move 10 + turn 90 +``` + +Given a sampling frequency, CDL can generate a Python script that +inserts data points into our database each "sample": + +```Python +from server.fgs.model import * +from server.fgs import db +import datetime +db.session.add(DataPoint(longitude=0.0, latitude=0.0, datetime=datetime.now())) +db.session.commit() +sleep(0.1) +db.session.add(DataPoint(longitude=9.0000094e-7, latitude=0.0, datetime=datetime.now())) +db.session.commit() +sleep(0.1) +db.session.add(DataPoint(longitude=1.8000019e-6, latitude=0.0, datetime=datetime.now())) +db.session.commit() +sleep(0.1) +# ... +``` + +To generate scripts, load the program into GHCI and execute as follows: +``` +cd src +ghci +:load Cdl/SampleCows.hs Cdl/Codegen.hs Cdl/Cow.hs +:module Cdl.SampleCows Cdl.Codegen Cdl.Cow +outputCow "test.py" 0.1 (1, 1, Coord 0 0, squareCow) +``` + +In `outputCow`, the `0.1` is the sampling frequency (how often +the database will receive mock data from the cows), the first `1` is +the collar ID sending the data, the second `1` is the cow's walking speed (in meters/second), +the `Coord 0 0` is the initial longitude and latitude of the cow, and `squareCow` is +the cow's actions described above. + +Note that the script relies on being in the same directory as the `server` repository +containing our database model.