{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE PackageImports #-} {-# LANGUAGE TypeFamilies #-} module Ledger.Commodity.Parse where import Control.Applicative import Control.Lens import "mtl" Control.Monad.State.Class import qualified Data.IntMap.Strict as IntMap import Data.Semigroup import qualified Data.Text as T import Data.Text.Lazy (Text, unpack) --import qualified Data.Text.Lazy as TL import Ledger.Balance import Ledger.Commodity --import Text.Parser.Char --import Text.Parser.Combinators import Text.Trifecta.Parser import Text.Trifecta.Result parseBalance :: (MonadState CommodityMap m, Functor m, a ~ Rational) => Text -> m (Either BalanceError (Balance a)) parseBalance str = case parseString balanceParser mempty (unpack str) of Success (b, c) -> do len <- IntMap.size <$> use commodities commodities.at len .= Just c return . Right $ b Failure e -> return . Left $ BalanceParseError (T.pack (show e)) balanceParser :: a ~ Rational => Parser (Balance a, CommodityInfo) balanceParser = undefined