NVOCQVASZWTKQJG7GPH7KHKZZR7NUG4WLV5YY4KAIRPCJRWCZPIAC *.swpdist
Test-Suite test-ananketype: exitcode-stdio-1.0main-is: Test.hshs-source-dirs: test, srcbuild-depends: base >=4.6 && <4.7,test-framework,test-framework-hunit,HUnit,containers == 0.5.*
{-# LANGUAGE DeriveDataTypeable #-}module Ananke.TimeLog( LogEntry(..), LogInterval(..), LogEvent(..), payouts, intervals) whereimport Anankeimport Data.Mapimport Data.Time.Clockimport Data.Typeable.Internalimport Database.PostgreSQL.Simple.FromRowimport Database.PostgreSQL.Simple.FromFieldimport Control.Applicativeimport Control.Exception.Basedata LogEvent = StartWork | StopWork deriving (Show, Eq)data LogEventParseError = LogEventParseError String deriving (Show, Typeable)instance Exception LogEventParseError whereinstance FromField LogEvent wherefromField f m = let fromText "start_work" = return StartWorkfromText "stop_work" = return StopWorkfromText a = conversionError $ LogEventParseError $ "unrecognized log event type " ++ ain fromField f m >>= fromTextdata LogEntry = LogEntry { btcAddr :: BtcAddr, logTime :: UTCTime, event :: LogEvent} deriving (Show, Eq)data LogInterval = LogInterval { intervalBtcAddr :: BtcAddr, start :: UTCTime, end :: UTCTime} deriving (Show, Eq)instance Ord LogEntry wherecompare a b = compare (logTime a) (logTime b)instance FromRow LogEntry wherefromRow = LogEntry <$> field <*> field <*> fieldpayouts :: [LogEntry] -> Map BtcAddr Rationalpayouts = undefinedintervals :: [LogEntry] -> [LogInterval]intervals e = undefined
module Ananke( BtcAddr(address), btcAddr) whereimport qualified Data.Text as Timport Database.PostgreSQL.Simple.FromFieldnewtype BtcAddr = BtcAddr { address :: T.Text } deriving (Show, Eq)btcAddr :: T.Text -> Maybe BtcAddrbtcAddr = Just . BtcAddr -- this will be changed to do validationinstance FromField BtcAddr wherefromField f m = fmap BtcAddr $ fromField f m
create table users (btc_addr varchar(34) primary key);create table users_trusted (id serial primary key,btc_addr varchar(34) references users (btc_addr) not null,trust_interval interval not null)create type event_type as enum ('start_work', 'stop_work');create table timelog (id serial primary key,btc_addr varchar(34) references users (btc_addr) not null,log_time timestamp without time zone not null,log_type event_type not null)
import Test.HUnitimport Test.Frameworkimport Test.Framework.Providers.HUnitimport Data.Monoidimport Data.Maybeimport Control.Monadimport Anankeimport Ananke.TimeLogimport Data.Time.ISO8601import qualified Data.Text as TderiveIntervalsTest :: AssertionderiveIntervalsTest = lettestAddrs = catMaybes [ Ananke.btcAddr $ T.pack "123", Ananke.btcAddr $ T.pack "456", Ananke.btcAddr $ T.pack "789" ]starts = catMaybes [ parseISO8601 "2014-01-01T00:08:00Z", parseISO8601 "2014-02-12T00:12:00Z" ]ends = catMaybes [ parseISO8601 "2014-01-01T00:12:00Z", parseISO8601 "2014-02-12T00:18:00Z" ]testLogEntries = doaddr <- testAddrs(start, end) <- zip starts ends[ LogEntry addr start StartWork, LogEntry addr end StopWork ]expected = doaddr <- testAddrs(start, end) <- zip starts ends[ LogInterval addr start end ]in assertEqual "derive log entries" (intervals testLogEntries) expectedmain :: IO ()main = defaultMainWithOpts[testCase "deriveIntervals" deriveIntervalsTest]mempty