packages feed

exchangealgebra-0.6.0.0: test/compat-clients/NewPath.hs

{-# LANGUAGE TypeFamilies #-}

module NewPath where

import qualified Data.List.NonEmpty
import qualified ExchangeAlgebra as Umbrella
import ExchangeAlgebra.Algebra.Core (Alg(Zero, (:@)), Redundant((.+)), ( .@ ))
import qualified ExchangeAlgebra.Algebra.Core as Core
import qualified ExchangeAlgebra.Algebra.Base as Base
import ExchangeAlgebra.Algebra.Base (Hat(Not), HatBase((:<)))
import ExchangeAlgebra.Accounting.Account (AccountTitles(Cash, Sales))
import qualified ExchangeAlgebra.Accounting.Exchange as Exchange
import qualified ExchangeAlgebra.Accounting.Account as Account
import qualified ExchangeAlgebra.Algebra.Element as Element
import qualified ExchangeAlgebra.Algebra.Transfer.Rule as Rule
import qualified ExchangeAlgebra.Accounting.Closing as Closing
import qualified ExchangeAlgebra.Journal.Core as Journal
import qualified ExchangeAlgebra.Algebra.Posting as Posting
import qualified ExchangeAlgebra.Algebra.Value as Value
import qualified ExchangeAlgebra.Accounting.Entries as Entries
import qualified ExchangeAlgebra.Accounting.TrialBalance as TrialBalance
import qualified ExchangeAlgebra.Accounting.Statements as Statements
import qualified ExchangeAlgebra.Accounting.Consolidation as Consolidation
import qualified ExchangeAlgebra.IO.Input as Input
import qualified ExchangeAlgebra.IO.Input.Csv as InputCsv
import qualified ExchangeAlgebra.IO.Input.Assist as Assist
import qualified ExchangeAlgebra.IO.Output.Csv as OutputCsv
import qualified ExchangeAlgebra.IO.Output as Output
import qualified ExchangeAlgebra.IO.Output.Statements as OutputStatements

import qualified ExchangeAlgebra.Simulation.Network as Network
import qualified ExchangeAlgebra.Simulation.Network.Flows as NetworkFlows
import qualified ExchangeAlgebra.Simulation.Network.Csv as NetworkCsv
import qualified ExchangeAlgebra.Simulation.Network.Journal as NetworkJournal
import qualified ExchangeAlgebra.Simulation.Analysis as Analysis
import qualified ExchangeAlgebra.Simulation.Optimize as Optimize
import qualified ExchangeAlgebra.Simulation.Optimize.Annealing as Annealing
import qualified ExchangeAlgebra.Simulation.Optimize.GA as GA
import qualified ExchangeAlgebra.Simulation.Output as SimulationOutput

import qualified ExchangeAlgebra.Accounting.Transaction as Transaction
import qualified ExchangeAlgebra.Accounting.Equivalence as Equivalence
import qualified ExchangeAlgebra.IO.Input.Admission as Admission

type ClientBasePart = Base.BasePart (HatBase AccountTitles)

oldExpression :: Alg Double (HatBase AccountTitles)
oldExpression = 1 .@ Not :< Cash .+ 1 .@ Not :< Sales

oldConstructor :: Alg Double (HatBase AccountTitles) -> Bool
oldConstructor Zero = True
oldConstructor (_ :@ _ :< _) = True
oldConstructor _ = False

oldClassMethod :: Bool
oldClassMethod = Umbrella.balance oldExpression

exchangeClient :: Bool
exchangeClient = Exchange.balance oldExpression

journalClient :: Journal.Journal String Double (HatBase AccountTitles)
journalClient = oldExpression Journal..| "client"

journalExchangeClient :: Bool
journalExchangeClient = Exchange.balance journalClient

postingClient :: Either Posting.PostedError (Posting.Posted Double)
postingClient = Posting.posted 1

coreClient :: Double
coreClient = Core.norm oldExpression

valueClient :: Value.MoneyDecimal -> Value.MoneyDecimal
valueClient = id

elementClient :: Bool
elementClient = Element.matchesQuery Cash Cash

-- | Use the public closing entry point with the new algebra and account paths.
closingClient :: Either (Rule.TransferApplyError Double (HatBase AccountTitles))
                        (Alg Double (HatBase AccountTitles))
closingClient = Closing.closingEntries oldExpression

entriesClient :: Alg Double (HatBase AccountTitles)
entriesClient = Entries.reversingEntry oldExpression

trialBalanceClient :: TrialBalance.AccountBalance Double
trialBalanceClient = TrialBalance.balanceFor Cash
    (TrialBalance.accountBalances oldExpression)

statementsClient :: Maybe Statements.DerivedMetric
statementsClient = Statements.metricForLegacyTitle Cash

consolidationClient
    :: Consolidation.WorksheetInput String String Double
    -> Either (Data.List.NonEmpty.NonEmpty
                   (Consolidation.WorksheetError String String Double))
              (Consolidation.ValidatedWorksheet String String Double)
consolidationClient = Consolidation.validateConsolidationWorksheet

inputFacadeClient :: Either Input.ConvError Account.Side
inputFacadeClient = Input.parseSide mempty

checkedClient :: Bool
checkedClient = either (const False) (const True) (Input.checkedEntry
    [(Account.Debit, Cash, 1 :: Double), (Account.Credit, Sales, 1 :: Double)])

csvClient = OutputCsv.csvTranspose

outputFacadeClient = Output.csvTranspose

inputCsvClient = InputCsv.splitTrim

assistClient :: Int
assistClient = length Assist.allAccountInfos

outputClient = OutputStatements.accountLedgerRowsJournal [Cash] journalClient

networkClient :: Network.TradeNetwork Int
networkClient = Network.completeNetwork [1, 2]

networkFlowClient :: NetworkFlows.TaxRate
networkFlowClient = NetworkFlows.TaxRate 1 10

networkCsvClient = NetworkCsv.readEdgeCsv

networkJournalClient = NetworkJournal.sigmaEdges networkClient (\_ _ -> journalClient)

analysisClient = Analysis.leontiefInverse

optimizeClient :: Optimize.Direction
optimizeClient = Optimize.Minimize

annealingClient :: Annealing.Annealing Double
annealingClient = Annealing.Annealing

gaClient :: GA.GA
gaClient = GA.GA

simulationOutputClient
    :: SimulationOutput.Header -> SimulationOutput.Header
simulationOutputClient = id

-- | Use the shared key type and its check through the new accounting path.
transactionClient :: Transaction.TxKey -> Bool
transactionClient = Transaction.isBlankKey

-- | Compare complete transaction maps through the new accounting path.
equivalenceClient :: Bool
equivalenceClient = Equivalence.isEquivalentUpTo Equivalence.PostingMultiset mempty mempty

-- | Admit a journal through the new input path.
admissionClient :: Journal.Journal String Value.MoneyDecimal (HatBase AccountTitles)
                -> Either (Admission.AdmissionFailure String (HatBase AccountTitles))
                          (Admission.Admitted String (HatBase AccountTitles))
admissionClient = Admission.admit