penny-lib-0.2.0.0: Penny/Copper/Entry.hs
module Penny.Copper.Entry (entry, render) where
import Control.Applicative ((<$>), (<*>))
import Control.Monad ( void )
import qualified Data.Text as X
import Text.Parsec ( char, string, optional, (<|>), (<?>) )
import Text.Parsec.Text ( Parser )
import Penny.Copper.Amount (amount)
import qualified Penny.Copper.Amount as A
import qualified Penny.Copper.Qty as Q
import Penny.Copper.Util (lexeme)
import qualified Penny.Lincoln as L
drCr :: Parser L.DrCr
drCr = let
dr = do
void (char 'D' <|> char 'd')
void (char 'r') <|> void (string "ebit")
return L.Debit
cr = do
void (char 'C' <|> char 'c')
void (optional (char 'r' >> optional (string "edit")))
return L.Credit
in dr <|> cr
entry :: Q.RadGroup -> Parser (L.Entry, L.Format)
entry rg = f <$> lexeme drCr <*> amount rg <?> e where
f dc (am, fmt) = (L.Entry dc am, fmt)
e = "entry"
render ::
(Q.GroupingSpec, Q.GroupingSpec)
-> Q.RadGroup
-> L.Format
-> L.Entry
-> Maybe X.Text
render gs rg f (L.Entry dc a) = do
amt <- A.render gs rg f a
let dcTxt = X.pack $ case dc of
L.Debit -> "Dr"
L.Credit -> "Cr"
return $ X.append (X.snoc dcTxt ' ') amt