ndmitchell / hlint

Haskell source code suggestions
Other
1.45k stars 194 forks source link

Document only running hlint on changed files #1151

Closed MaxGabriel closed 3 years ago

MaxGabriel commented 3 years ago

Hi, our team at work uses hlint, but it can get pretty slow on larger projects with tens of thousands of lines. We came up with this command to only run hlint on files that differ from the master branch on git. Would you want a PR that adds this tip to the README? Feels potentially out of scope, but would have helped us!

{ git diff --diff-filter=d --name-only $(git merge-base HEAD origin/master) -- "***.hs" && git ls-files -o --exclude-standard -- "***.hs"; } | xargs hlint -j=4

It's also helpful for refactoring:

{ git diff --diff-filter=d --name-only $(git merge-base HEAD origin/master) -- "***.hs" && git ls-files -o --exclude-standard -- "***.hs"; } | xargs -I file hlint -j=4 file --refactor --refactor-options="--inplace --step"
ndmitchell commented 3 years ago

If they're useful including them in the readme makes sense. PR welcome! I'd suggest the FAQ section.

As to the slowness, I'd be keen to know how slow using the latest HLint 3.2.1 which disabled one particularly slow hint.

MaxGabriel commented 3 years ago

Good question. I think that specific optimization wouldn't come into play, since we already disabled it in hlint.yaml. This is everything we disable:

- ignore: {name: "Reduce duplication"} # Often pretty spurious/reducing duplication makes the code more confusing
- ignore: {name: "Use fromMaybe"} # Often `fromMaybe` the code more complicated
- ignore: {name: "Replace case with fromMaybe"} # Often `fromMaybe` the code more complicated
- ignore: {name: "Avoid lambda"} # Lambas sometimes help readability. This is a more controversial one.
- ignore: {name: "Redundant do"} # Triggered when using `do` for a one liner. Often a redundant do is nice for consistency though (e.g. so every test starts the same)
- ignore: {name: "Eta reduce"} # (Going from e.g. func arg1 = func "x" "y" arg1 to func = "x" "y"). Generally think this is worse for readability, more confusing for beginners and without the argument name less self-documenting. In some cases it's great (e.g. oldDeprecatedName = newFunctionName) but we can still write those by hand.
- ignore: {name: "Use unwords"} # This function has a terrible name. I'll take intercalate " " any day.
- ignore: {name: "Use .", within: [Handler.Uploads.CheckImage, Mercury.API.Plaid.Esqueleto]} # hlint wants to reorder some of the esqueleto into a non-compiling form
- ignore: {name: "Avoid restricted function", within: [Mercury.ICalendar, TestImport]} # unsafePerformIO is used to streamline FFI access in a safe way
- ignore: {name: "Use list comprehension"} # We don't use these anywhere in our codebase. I don't think it's worth the very minor character savings to have one more construct for beginners to learn.
- ignore: {name: "Use ||"} # using or [a, b, c] is sometimes nicer than a || b || c when a, b, and c are long expressions
- ignore: {name: "Move brackets to avoid $"} # https://mercurytechnologies.slack.com/archives/CPE2X5DMJ/p1586975051135300

But I did run a couple tests:

3.2.1 (HLint v3.2.1, (C) Neil Mitchell 2006-2020):

Run 1:

time hlint src/ test/
66.75 real        65.43 user         1.04 sys

Run 2:

time hlint src/ test/
62.78 real        61.87 user         0.89 sys

HLint v2.2.10, (C) Neil Mitchell 2006-2020

(This is what we currently use—we don't use 8.10 yet so we can't upgrade to 3.x for real is my understanding).

Run 1

81.05 real        80.06 user         0.99 sys

Run 2

83.15 real        82.08 user         1.03 sys

This is for this much code:

cloc src/ test/                                                                                                                                          14:06:46
     866 text files.
     866 unique files.
       5 files ignored.

github.com/AlDanial/cloc v 1.84  T=0.79 s (1086.3 files/s, 168492.7 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Haskell                        828          14552           8787         106761
JSON                            32              3              0           3420
Markdown                         1              8              0             16
-------------------------------------------------------------------------------
SUM:                           861          14563           8787         110197
-------------------------------------------------------------------------------
ndmitchell commented 3 years ago

Disabling a hint has no impact on performance - I generate the hint and then ignore it. It's possible in the future that we might optimise for hints that will be ignored, but since most hints are enabled most of the time, it's never been worth it.

Great to see that HLint 3.2.1 is faster! I'd be curious to see a --verbose run with 3.2.1 if you can, and then just chop out the bit which says which phases took most time, as that will give a hint if there's a big outlier (e.g. one single hint goes crazy on your code), or if it's just a case of a lot of code.

MaxGabriel commented 3 years ago

Sure thing. It looks like everything is almost no time at all (nothing is >= 0.1 seconds), so either the time spent isn't reflected here, or its just all adding up.

I don't think this is a priority for us right now (the solution of only doing files that changed in git is really effective), but in case it is in the future, would you or someone else want to do contracting to optimize hlint based on running it on our codebase?

~/D/M/h/mercury-web-backend> hlint src/ test/ --verbose                 18:32:22
# Initialise of global flags... took 0.00s
# Config of data/hlint.yaml... took 0.09s
# Config of /Users/maximiliantagher/Documents/Mercury/hs/mercury-web-backend/.hlint.yaml... took 0.00s
# Parse of src/App.hs... took 0.01s
# Parse of src/Application.hs... took 0.02s
# Parse of src/Client.hs... took 0.01s
# Parse of src/Foundation.hs... took 0.04s
# Parse of src/Import.hs... took 0.00s
# Parse of src/Logging.hs... took 0.00s
# Parse of src/Metrics.hs... took 0.00s
# Parse of src/Settings.hs... took 0.01s
# Parse of src/Task.hs... took 0.00s
# Parse of src/TaskMain.hs... took 0.01s
# Parse of src/AWS/S3.hs... took 0.00s
# Parse of src/AWS/Types.hs... took 0.00s
# Parse of src/AWS/EC2/InstanceId.hs... took 0.00s
# Parse of src/Client/Concurrency.hs... took 0.00s
# Parse of src/Client/Export.hs... took 0.00s
# Parse of src/Client/HTTP.hs... took 0.01s
# Parse of src/Client/Integration.hs... took 0.01s
# Parse of src/Client/SQL.hs... took 0.01s
# Parse of src/Client/Types.hs... took 0.00s
# Parse of src/Client/APNs/V1.hs... took 0.01s
# Parse of src/Client/Apex/Atlas.hs... took 0.02s
# Parse of src/Client/Apex/ConsistencyChecker.hs... took 0.00s
# Parse of src/Client/Apex/Edocs.hs... took 0.00s
# Parse of src/Client/Apex/Enotices.hs... took 0.00s
# Parse of src/Client/Apex/Equilibrium.hs... took 0.01s
# Parse of src/Client/Apex/HTTP.hs... took 0.01s
src/Client/Apex/HTTP.hs:211:20-69: Suggestion: Use <=<
Found:
  (runParser fromXml =<<) . fromRawXml . BL.toStrict
Perhaps:
  runParser fromXml Control.Monad.<=< (fromRawXml . BL.toStrict)

# Parse of src/Client/Apex/Sentinel.hs... took 0.01s
# Parse of src/Client/Apex/Sketch.hs... took 0.01s
# Parse of src/Client/Apex/Snap.hs... took 0.00s
# Parse of src/Client/Apex/Sql.hs... took 0.01s
src/Client/Apex/Sql.hs:(103,13)-(104,62): Warning: Redundant ^.
Found:
  treasuryMetadata
    ^.
      TransactionMetadataStatus
        `in_` valList [M.Created, M.Pending, M.Sent]
        &&. apexClearingAccount
    ^. ApexClearingAccountId
Perhaps:
  (treasuryMetadata
     ^.
       ((TransactionMetadataStatus
           `in_` valList [M.Created, M.Pending, M.Sent]
           &&. apexClearingAccount)
          . ApexClearingAccountId))

# Parse of src/Client/Apex/StartOfDayWorker.hs... took 0.01s
# Parse of src/Client/Apex/Stubs.hs... took 0.00s
# Parse of src/Client/Apex/Unused.hs... took 0.01s
# Parse of src/Client/Apex/Ale/Dispatch.hs... took 0.00s
# Parse of src/Client/Apex/Ale/EventConsumer.hs... took 0.00s
# Parse of src/Client/Apex/Atlas/Forms.hs... took 0.00s
# Parse of src/Client/Apex/Atlas/Forms/Generate/CreateEntityCorporationCashAccountAgreementForm.hs... took 0.00s
# Parse of src/Client/Apex/Atlas/Forms/Generate/CreateEntityDueDiligenceForm.hs... took 0.00s
# Parse of src/Client/Apex/Atlas/Forms/Generate/CreateEntityLlcAgreementForm.hs... took 0.00s
# Parse of src/Client/Apex/Atlas/Forms/Generate/CreateEntityNewAccountRiaForm.hs... took 0.01s
# Parse of src/Client/Apex/Atlas/Forms/Seed/EntityDueDiligenceForm.hs... took 0.00s
# Parse of src/Client/Apex/Atlas/Forms/Seed/EntityNewAccountRiaForm.hs... took 0.00s
# Parse of src/Client/Apex/Auth/Common.hs... took 0.00s
# Parse of src/Client/Apex/Auth/Endpoints.hs... took 0.00s
# Parse of src/Client/Apex/Auth/Worker.hs... took 0.00s
# Parse of src/Client/Apex/Extracts/ActivityListEndOfDay.hs... took 0.00s
# Parse of src/Client/Apex/Extracts/CashActivity.hs... took 0.00s
# Parse of src/Client/Apex/Extracts/CashAvailable.hs... took 0.00s
# Parse of src/Client/Apex/Extracts/Common.hs... took 0.00s
# Parse of src/Client/Apex/Extracts/Fetch.hs... took 0.00s
# Parse of src/Client/Apex/Extracts/Position.hs... took 0.00s
# Parse of src/Client/Apex/Extracts/PositionStrategy.hs... took 0.00s
# Parse of src/Client/Apex/Extracts/TradeActivity.hs... took 0.00s
# Parse of src/Client/Apex/Types/Ale.hs... took 0.00s
# Parse of src/Client/Apex/Types/Atlas.hs... took 0.07s
# Parse of src/Client/Apex/Types/Auth.hs... took 0.00s
# Parse of src/Client/Apex/Types/Common.hs... took 0.00s
# Parse of src/Client/Apex/Types/Database.hs... took 0.02s
# Parse of src/Client/Apex/Types/Edocs.hs... took 0.01s
# Parse of src/Client/Apex/Types/Enotices.hs... took 0.00s
# Parse of src/Client/Apex/Types/Onboarding.hs... took 0.00s
# Parse of src/Client/Apex/Types/Sketch.hs... took 0.02s
# Parse of src/Client/Apex/Types/Snap.hs... took 0.00s
# Parse of src/Client/Apex/Types/Atlas/Forms.hs... took 0.00s
# Parse of src/Client/Apex/Types/Atlas/Forms/All.hs... took 0.00s
# Parse of src/Client/Apex/Types/Atlas/Forms/EntityAccountUpdateForm.hs... took 0.00s
# Parse of src/Client/Apex/Types/Atlas/Forms/EntityCorporationCashAccountAgreementForm.hs... took 0.00s
# Parse of src/Client/Apex/Types/Atlas/Forms/EntityDueDiligenceForm.hs... took 0.00s
# Parse of src/Client/Apex/Types/Atlas/Forms/EntityLlcAgreementForm.hs... took 0.00s
# Parse of src/Client/Apex/Types/Atlas/Forms/EntityNewAccountRiaForm.hs... took 0.00s
# Parse of src/Client/Apex/Types/Equilibrium/Trades.hs... took 0.02s
# Parse of src/Client/Apex/Types/Sentinel/V1/Transfers.hs... took 0.04s
# Parse of src/Client/Apex/Types/Sentinel/V2/AchRelationships.hs... took 0.01s
# Parse of src/Client/Apex/Types/Sentinel/V2/Types.hs... took 0.06s
# Parse of src/Client/Bank/Feature.hs... took 0.00s
# Parse of src/Client/Bank/Limit.hs... took 0.01s
src/Client/Bank/Limit.hs:309:8-83: Warning: Redundant <$>
Found:
  onboardingApplicationFirstApprovedAt
    =<< entityVal <$> onboardingApplication
Perhaps:
  onboardingApplicationFirstApprovedAt . entityVal
    =<< onboardingApplication

# Parse of src/Client/Bank/Migrate.hs... took 0.02s
# Parse of src/Client/Bank/Primitive.hs... took 0.05s
# Parse of src/Client/Bank/Statements/Fetch.hs... took 0.00s
# Parse of src/Client/Bank/Statements/StatementId.hs... took 0.00s
# Parse of src/Client/Bank/Statements/Types.hs... took 0.00s
# Parse of src/Client/Clearbit/V2018_11_19/Enrichment.hs... took 0.00s
# Parse of src/Client/CrossPartnerSync/Apex.hs... took 0.00s
# Parse of src/Client/CrossPartnerSync/Common.hs... took 0.00s
# Parse of src/Client/CrossPartnerSync/Core.hs... took 0.00s
# Parse of src/Client/CrossPartnerSync/Synapse.hs... took 0.00s
# Parse of src/Client/CurrencyCloud/V2.hs... took 0.00s
# Parse of src/Client/CurrencyCloud/V2/Account.hs... took 0.00s
# Parse of src/Client/CurrencyCloud/V2/Beneficiary.hs... took 0.01s
# Parse of src/Client/CurrencyCloud/V2/Contact.hs... took 0.00s
# Parse of src/Client/CurrencyCloud/V2/Credential.hs... took 0.00s
src/Client/CurrencyCloud/V2/Credential.hs:138:3-33: Warning: Redundant <$>
Found:
  CredentialManager <$> pure tvar
Perhaps:
  pure (CredentialManager tvar)

src/Client/CurrencyCloud/V2/Credential.hs:146:3-33: Warning: Redundant <$>
Found:
  CredentialManager <$> pure tvar
Perhaps:
  pure (CredentialManager tvar)

# Parse of src/Client/CurrencyCloud/V2/HTTP.hs... took 0.00s
# Parse of src/Client/CurrencyCloud/V2/Notification.hs... took 0.00s
# Parse of src/Client/CurrencyCloud/V2/Payment.hs... took 0.00s
# Parse of src/Client/CurrencyCloud/V2/Sql.hs... took 0.00s
# Parse of src/Client/CurrencyCloud/V2/Notification/Conversion.hs... took 0.00s
# Parse of src/Client/CurrencyCloud/V2/Notification/Funding.hs... took 0.00s
# Parse of src/Client/CurrencyCloud/V2/Notification/Payment.hs... took 0.00s
# Parse of src/Client/CurrencyCloud/V2/Notification/Transfer.hs... took 0.00s
# Parse of src/Client/Dialpad/V1.hs... took 0.01s
# Parse of src/Client/Dialpad/V1/Sql.hs... took 0.00s
# Parse of src/Client/Freshsales/V1.hs... took 0.01s
# Parse of src/Client/Front/V2.hs... took 0.01s
src/Client/Front/V2.hs:240:29-76: Warning: Redundant <$>
Found:
  userExtraNote =<< userExtra <$> eitherToMaybe su
Perhaps:
  (userExtraNote . userExtra =<< eitherToMaybe su)

# Parse of src/Client/HubSpot/V1.hs... took 0.01s
src/Client/HubSpot/V1.hs:302:25-72: Warning: Redundant <$>
Found:
  userExtraNote =<< userExtra <$> eitherToMaybe su
Perhaps:
  (userExtraNote . userExtra =<< eitherToMaybe su)

# Parse of src/Client/Lob/VerifyAddress.hs... took 0.01s
# Parse of src/Client/Persona/HTTP.hs... took 0.01s
# Parse of src/Client/Persona/Types.hs... took 0.00s
# Parse of src/Client/Persona/Webhook/Inquiry.hs... took 0.00s
# Parse of src/Client/Segment/V1/Group.hs... took 0.00s
# Parse of src/Client/Segment/V1/HTTP.hs... took 0.00s
# Parse of src/Client/Segment/V1/Identify.hs... took 0.00s
# Parse of src/Client/Segment/V1/Segment.hs... took 0.00s
# Parse of src/Client/Segment/V1/Sql.hs... took 0.00s
# Parse of src/Client/Segment/V1/Types.hs... took 0.00s
# Parse of src/Client/Synapse/Cip14.hs... took 0.00s
# Parse of src/Client/Synapse/Dashboard/Routes.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Address.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Card.hs... took 0.02s
# Parse of src/Client/Synapse/V3/Consistency.hs... took 0.02s
# Parse of src/Client/Synapse/V3/Document.hs... took 0.00s
# Parse of src/Client/Synapse/V3/HTTP.hs... took 0.01s
# Parse of src/Client/Synapse/V3/HighPriorityApprovals.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Integration.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Node.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Oauth.hs... took 0.00s
# Parse of src/Client/Synapse/V3/SQL.hs... took 0.00s
# Parse of src/Client/Synapse/V3/SQLeto.hs... took 0.01s
src/Client/Synapse/V3/SQLeto.hs:(128,72)-(129,63): Warning: Redundant ^.
Found:
  synapseRecipientAchNode
    ^.
      SynapseRecipientAchNodeRecipientPaymentDataId &&. recipientAccount
    ^. RecipientAccountBankAccountId
Perhaps:
  (synapseRecipientAchNode
     ^.
       ((SynapseRecipientAchNodeRecipientPaymentDataId
           &&. recipientAccount)
          . RecipientAccountBankAccountId))

# Parse of src/Client/Synapse/V3/Statements.hs... took 0.01s
# Parse of src/Client/Synapse/V3/Transaction.hs... took 0.02s
# Parse of src/Client/Synapse/V3/User.hs... took 0.06s
src/Client/Synapse/V3/User.hs:214:14-88: Warning: Redundant <$>
Found:
  mkNonEmptyText
    =<< tshow <$> countryToUSTerritory addressWithoutNameCountry
Perhaps:
  mkNonEmptyText . tshow
    =<< countryToUSTerritory addressWithoutNameCountry

# Parse of src/Client/Synapse/V3/Node/Ach.hs... took 0.01s
# Parse of src/Client/Synapse/V3/Node/Check.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Node/Class.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Node/Deposit.hs... took 0.01s
# Parse of src/Client/Synapse/V3/Node/ResponseTypes.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Node/Savings.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Node/Subnet.hs... took 0.01s
# Parse of src/Client/Synapse/V3/Node/Wire.hs... took 0.01s
# Parse of src/Client/Synapse/V3/Transaction/Class.hs... took 0.01s
# Parse of src/Client/Synapse/V3/Transaction/Dispute.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Transaction/Dispute/Types.hs... took 0.01s
# Parse of src/Client/Synapse/V3/Types/Address.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Types/Card.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Types/Common.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Types/Document.hs... took 0.01s
# Parse of src/Client/Synapse/V3/Types/HTTP.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Types/Node.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Types/Statement.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Types/Transaction.hs... took 0.01s
# Parse of src/Client/Synapse/V3/Types/User.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Types/UserPermission.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Webhook/Node.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Webhook/NoteParser.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Webhook/Subscribe.hs... took 0.00s
# Parse of src/Client/Synapse/V3/Webhook/TransactionConsumer.hs... took 0.02s
src/Client/Synapse/V3/Webhook/TransactionConsumer.hs:788:15-95: Warning: Use Just
Found:
  fromMaybe False
    $ synapseTransactionMetadataAmountAllowedToChange synapseMetadata
Perhaps:
  Just True
    == synapseTransactionMetadataAmountAllowedToChange synapseMetadata

# Parse of src/Client/Synapse/V3/Webhook/UserConsumer.hs... took 0.01s
# Parse of src/Client/Synapse/V3/Webhook/WireFeeParser.hs... took 0.00s
# Parse of src/Client/Test/Card.hs... took 0.00s
# Parse of src/Client/Xero/V1/Feed.hs... took 0.01s
# Parse of src/Client/Xero/V1/Statement.hs... took 0.01s
# Parse of src/Client/Xero/V1/Types.hs... took 0.00s
# Parse of src/Consumer/Postgresque.hs... took 0.02s
# Parse of src/Consumer/Types.hs... took 0.01s
# Parse of src/Consumer/Jobs/SendAPIPartnerInviteEmail.hs... took 0.00s
# Parse of src/Consumer/Jobs/SendAPIPartnerWebhook.hs... took 0.00s
# Parse of src/Consumer/Jobs/SendAccountOpenedEmail.hs... took 0.00s
# Parse of src/Consumer/Jobs/SendAdjunctUserApprovedEmail.hs... took 0.00s
# Parse of src/Consumer/Jobs/SendAdminNewBeneficialOwnerEmail.hs... took 0.00s
# Parse of src/Consumer/Jobs/SendGenericEmail.hs... took 0.00s
# Parse of src/Consumer/Jobs/SendInviteEmail.hs... took 0.00s
# Parse of src/Consumer/Jobs/SendRecipientElectronicPaymentEmail.hs... took 0.00s
# Parse of src/Consumer/Jobs/SendTransactionMoneyMonitoring.hs... took 0.01s
# Parse of src/Handler/AlphaCodeExists.hs... took 0.00s
# Parse of src/Handler/Common.hs... took 0.00s
# Parse of src/Handler/Concurrency.hs... took 0.00s
# Parse of src/Handler/CreateOrganization.hs... took 0.01s
# Parse of src/Handler/EncryptedCookie.hs... took 0.00s
# Parse of src/Handler/Home.hs... took 0.00s
# Parse of src/Handler/IP.hs... took 0.00s
# Parse of src/Handler/Metrics.hs... took 0.00s
# Parse of src/Handler/Notifications.hs... took 0.00s
# Parse of src/Handler/Security.hs... took 0.01s
# Parse of src/Handler/TOTPSignupComplete.hs... took 0.00s
# Parse of src/Handler/TOTPSignupStart.hs... took 0.00s
# Parse of src/Handler/TOTPUpdateComplete.hs... took 0.00s
# Parse of src/Handler/TOTPUpdateStart.hs... took 0.00s
# Parse of src/Handler/ThrowException.hs... took 0.00s
# Parse of src/Handler/Util.hs... took 0.00s
# Parse of src/Handler/API/BankingPartner/AuthToken.hs... took 0.00s
# Parse of src/Handler/API/BankingPartner/Transactions.hs... took 0.00s
# Parse of src/Handler/API/BankingPartner/TwoFA.hs... took 0.00s
# Parse of src/Handler/API/BankingPartner/User.hs... took 0.00s
# Parse of src/Handler/API/Clerky/SubmitOnboardingData.hs... took 0.00s
# Parse of src/Handler/API/Finicity/Login.hs... took 0.00s
# Parse of src/Handler/API/Mercury/Accounts.hs... took 0.01s
# Parse of src/Handler/API/Mercury/ApiTokens.hs... took 0.02s
# Parse of src/Handler/API/Mercury/Common.hs... took 0.00s
# Parse of src/Handler/API/Mercury/LookupToken.hs... took 0.00s
# Parse of src/Handler/API/Mercury/Recipients.hs... took 0.01s
# Parse of src/Handler/API/Mercury/Transactions.hs... took 0.01s
# Parse of src/Handler/API/Plaid/AuthToken.hs... took 0.00s
# Parse of src/Handler/API/Plaid/Common.hs... took 0.01s
# Parse of src/Handler/API/Plaid/Transactions.hs... took 0.01s
src/Handler/API/Plaid/Transactions.hs:112:37-57: Suggestion: Avoid lambda using `infix`
Found:
  (\ p -> p >>= readMay)
Perhaps:
  (>>= readMay)

src/Handler/API/Plaid/Transactions.hs:117:37-57: Suggestion: Avoid lambda using `infix`
Found:
  (\ p -> p >>= readMay)
Perhaps:
  (>>= readMay)

# Parse of src/Handler/API/Plaid/TwoFA.hs... took 0.00s
# Parse of src/Handler/API/Plaid/User.hs... took 0.01s
# Parse of src/Handler/Admin/AdminOmniSearch.hs... took 0.00s
# Parse of src/Handler/Admin/AlphaCodes.hs... took 0.00s
# Parse of src/Handler/Admin/Brex.hs... took 0.00s
# Parse of src/Handler/Admin/Cards.hs... took 0.01s
# Parse of src/Handler/Admin/CloseOrganization.hs... took 0.00s
# Parse of src/Handler/Admin/Manage.hs... took 0.00s
# Parse of src/Handler/Admin/Onboarding.hs... took 0.00s
# Parse of src/Handler/Admin/Organization.hs... took 0.00s
# Parse of src/Handler/Admin/OrganizationAccounts.hs... took 0.00s
# Parse of src/Handler/Admin/OrganizationStatus.hs... took 0.00s
# Parse of src/Handler/Admin/OrganizationSummary.hs... took 0.00s
# Parse of src/Handler/Admin/OrganizationToggleInternationalFundraiser.hs... took 0.00s
# Parse of src/Handler/Admin/OrganizationToggleTeaRoom.hs... took 0.00s
# Parse of src/Handler/Admin/OrganizationToggleTopTuna.hs... took 0.00s
# Parse of src/Handler/Admin/OrganizationTransactions.hs... took 0.03s
# Parse of src/Handler/Admin/OrganizationUser.hs... took 0.00s
# Parse of src/Handler/Admin/PPP.hs... took 0.02s
# Parse of src/Handler/Admin/Postgresque.hs... took 0.00s
# Parse of src/Handler/Admin/SearchForUser.hs... took 0.00s
# Parse of src/Handler/Admin/Statement.hs... took 0.00s
# Parse of src/Handler/Admin/Support.hs... took 0.00s
# Parse of src/Handler/Admin/ToggleShipCardsToOrg.hs... took 0.00s
# Parse of src/Handler/Admin/UpdateAdminOnboardingNote.hs... took 0.00s
# Parse of src/Handler/Admin/User.hs... took 0.00s
# Parse of src/Handler/Admin/Onboarding/About.hs... took 0.00s
# Parse of src/Handler/Admin/Onboarding/BeneficialOwnerGenerateShareLink.hs... took 0.00s
# Parse of src/Handler/Admin/Onboarding/BeneficialOwnerIdReuploadReceived.hs... took 0.00s
# Parse of src/Handler/Admin/Onboarding/BeneficialOwnerIndex.hs... took 0.00s
# Parse of src/Handler/Admin/Onboarding/BusinessDetailsRequest.hs... took 0.00s
# Parse of src/Handler/Admin/Onboarding/FlagBeneficialOwnerForIdReupload.hs... took 0.00s
# Parse of src/Handler/Admin/Onboarding/FlagOrganizationForDocReupload.hs... took 0.00s
# Parse of src/Handler/Admin/Onboarding/GetData.hs... took 0.01s
# Parse of src/Handler/Admin/Onboarding/MoveBack.hs... took 0.00s
# Parse of src/Handler/Admin/Onboarding/OnboardingRequests.hs... took 0.00s
# Parse of src/Handler/Admin/Onboarding/Purge.hs... took 0.00s
# Parse of src/Handler/Admin/Onboarding/Reject.hs... took 0.00s
# Parse of src/Handler/Admin/Onboarding/Reservation.hs... took 0.00s
# Parse of src/Handler/Admin/Onboarding/ReuploadBeneficialOwnerIdentityDocument.hs... took 0.00s
# Parse of src/Handler/Admin/Onboarding/SetData.hs... took 0.01s
# Parse of src/Handler/Admin/Onboarding/Submit.hs... took 0.01s
# Parse of src/Handler/Admin/Onboarding/GetData/Esqueleto.hs... took 0.01s
# Parse of src/Handler/Admin/Onboarding/OnboardingRequests/Automated.hs... took 0.00s
# Parse of src/Handler/Admin/Onboarding/OnboardingRequests/BusinessDetailsRequest.hs... took 0.00s
# Parse of src/Handler/Admin/Onboarding/OnboardingRequests/IdentityVerificationRequest.hs... took 0.00s
# Parse of src/Handler/Admin/Onboarding/OnboardingRequests/Types.hs... took 0.00s
# Parse of src/Handler/Admin/OrganizationTransactions/EsqueletoExperimental.hs... took 0.00s
# Parse of src/Handler/Admin/Treasury/Alerts.hs... took 0.00s
# Parse of src/Handler/Admin/Treasury/Onboarding.hs... took 0.00s
# Parse of src/Handler/Admin/Treasury/Proposals.hs... took 0.01s
# Parse of src/Handler/Admin/Treasury/Sketch.hs... took 0.00s
# Parse of src/Handler/Admin/Treasury/Onboarding/GetFormData.hs... took 0.00s
# Parse of src/Handler/Admin/Treasury/Onboarding/SetFormData.hs... took 0.00s
# Parse of src/Handler/Authentication/Biometrics.hs... took 0.00s
# Parse of src/Handler/Authentication/CheckCallsign.hs... took 0.00s
# Parse of src/Handler/Authentication/CreateMFAResetCodes.hs... took 0.00s
# Parse of src/Handler/Authentication/Sessions.hs... took 0.01s
# Parse of src/Handler/Authentication/Signup.hs... took 0.01s
# Parse of src/Handler/Authentication/Email/Change.hs... took 0.00s
# Parse of src/Handler/Authentication/OAuth/Integration.hs... took 0.00s
src/Handler/Authentication/OAuth/Integration.hs:117:24-81: Warning: Redundant <$>
Found:
  getTemporaryCredential oauth =<< appHttpManager <$> getApp
Perhaps:
  getTemporaryCredential oauth . appHttpManager =<< getApp

# Parse of src/Handler/Authentication/OAuth/V1.hs... took 0.00s
# Parse of src/Handler/Authentication/Password/Change.hs... took 0.00s
# Parse of src/Handler/Authentication/Password/CheckResetCode.hs... took 0.00s
# Parse of src/Handler/Authentication/Password/Forgot.hs... took 0.00s
# Parse of src/Handler/Authentication/Password/Pwned.hs... took 0.00s
# Parse of src/Handler/Authentication/Password/Reset.hs... took 0.00s
# Parse of src/Handler/Authentication/VerifyEmail/Resend.hs... took 0.00s
# Parse of src/Handler/Authentication/VerifyEmail/Verify.hs... took 0.00s
# Parse of src/Handler/Banking/AccountGraphData.hs... took 0.00s
# Parse of src/Handler/Banking/AddRecipient.hs... took 0.03s
# Parse of src/Handler/Banking/CancelPayment.hs... took 0.00s
# Parse of src/Handler/Banking/CreateCheckingAccount.hs... took 0.00s
# Parse of src/Handler/Banking/DebitCards.hs... took 0.01s
# Parse of src/Handler/Banking/DeleteRecipient.hs... took 0.00s
# Parse of src/Handler/Banking/DismissFailedTransaction.hs... took 0.00s
# Parse of src/Handler/Banking/EditAccountNickname.hs... took 0.00s
# Parse of src/Handler/Banking/EditRecipient.hs... took 0.00s
# Parse of src/Handler/Banking/Feature.hs... took 0.00s
# Parse of src/Handler/Banking/GetBankAccountTransactions.hs... took 0.00s
# Parse of src/Handler/Banking/GetInitialData.hs... took 0.01s
# Parse of src/Handler/Banking/GetOrganizationDashboardOverview.hs... took 0.00s
# Parse of src/Handler/Banking/GetPaymentCardTransactions.hs... took 0.00s
# Parse of src/Handler/Banking/GetPayments.hs... took 0.00s
# Parse of src/Handler/Banking/Limit.hs... took 0.01s
# Parse of src/Handler/Banking/QuickbooksExport.hs... took 0.00s
# Parse of src/Handler/Banking/SearchTransactions.hs... took 0.00s
src/Handler/Banking/SearchTransactions.hs:22:8-41: Warning: Redundant fmap
Found:
  fmap cs mPayloadT >>= decodeStrict
Perhaps:
  mPayloadT >>= decodeStrict . cs

# Parse of src/Handler/Banking/SendMoney.hs... took 0.02s
# Parse of src/Handler/Banking/SendMoneyReceipt.hs... took 0.02s
# Parse of src/Handler/Banking/TransferMoney.hs... took 0.01s
src/Handler/Banking/TransferMoney.hs:(167,11)-(168,39): Warning: Redundant <$>
Found:
  TransferMoneyResponse <$> pure mercuryAccountData
Perhaps:
  pure (TransferMoneyResponse mercuryAccountData)

# Parse of src/Handler/Banking/UnlinkAccount.hs... took 0.00s
# Parse of src/Handler/Banking/UpdateTransaction.hs... took 0.00s
# Parse of src/Handler/Banking/UpdateTransactionParty.hs... took 0.00s
# Parse of src/Handler/Banking/WireDetails.hs... took 0.00s
# Parse of src/Handler/Banking/Accounts/CloseAccount.hs... took 0.00s
# Parse of src/Handler/Banking/Accounts/Letters.hs... took 0.00s
# Parse of src/Handler/Banking/GetInitialData/Esqueleto.hs... took 0.00s
# Parse of src/Handler/Banking/RoutingNumber/GetRoutingNumber.hs... took 0.00s
# Parse of src/Handler/Banking/RoutingNumber/Types.hs... took 0.00s
# Parse of src/Handler/Banking/Statements/GetStatement.hs... took 0.00s
# Parse of src/Handler/Banking/Statements/ListStatements.hs... took 0.01s
# Parse of src/Handler/CurrencyCloud/V2/Notification.hs... took 0.00s
# Parse of src/Handler/CurrencyCloud/V2/Notification/Payment.hs... took 0.00s
# Parse of src/Handler/Dialpad/Webhook.hs... took 0.00s
# Parse of src/Handler/Front/Webhook.hs... took 0.00s
# Parse of src/Handler/Onboarding/About.hs... took 0.00s
# Parse of src/Handler/Onboarding/BeneficialOwner.hs... took 0.00s
# Parse of src/Handler/Onboarding/BusinessDetailsRequest.hs... took 0.00s
# Parse of src/Handler/Onboarding/BusinessNames.hs... took 0.00s
# Parse of src/Handler/Onboarding/ConfirmAllowedIndustry.hs... took 0.00s
# Parse of src/Handler/Onboarding/ContactDetails.hs... took 0.00s
# Parse of src/Handler/Onboarding/ExpectedServices.hs... took 0.00s
# Parse of src/Handler/Onboarding/FormationDetails.hs... took 0.00s
# Parse of src/Handler/Onboarding/GetData.hs... took 0.00s
# Parse of src/Handler/Onboarding/GetSummary.hs... took 0.00s
# Parse of src/Handler/Onboarding/IdentityVerificationRequest.hs... took 0.00s
# Parse of src/Handler/Onboarding/Investors.hs... took 0.00s
# Parse of src/Handler/Onboarding/OnboardingRequests.hs... took 0.00s
# Parse of src/Handler/Onboarding/Submit.hs... took 0.01s
# Parse of src/Handler/Onboarding/Sync.hs... took 0.00s
# Parse of src/Handler/Onboarding/BeneficialOwner/Create.hs... took 0.00s
# Parse of src/Handler/Onboarding/BeneficialOwner/Delete.hs... took 0.00s
# Parse of src/Handler/Onboarding/BeneficialOwner/NonUser/Esqueleto.hs... took 0.00s
# Parse of src/Handler/Onboarding/BeneficialOwner/NonUser/Info.hs... took 0.00s
# Parse of src/Handler/Onboarding/BeneficialOwner/NonUser/Link.hs... took 0.00s
# Parse of src/Handler/Onboarding/BeneficialOwner/NonUser/Update.hs... took 0.00s
# Parse of src/Handler/Onboarding/OnboardingRequests/BusinessDetailsRequest.hs... took 0.00s
# Parse of src/Handler/Onboarding/OnboardingRequests/IdentityVerificationRequest.hs... took 0.00s
# Parse of src/Handler/Onboarding/Purge/Common.hs... took 0.00s
# Parse of src/Handler/Onboarding/Purge/Organization.hs... took 0.00s
# Parse of src/Handler/Onboarding/Purge/User.hs... took 0.00s
# Parse of src/Handler/PPP/Application.hs... took 0.00s
# Parse of src/Handler/PPP/FileUpload.hs... took 0.00s
# Parse of src/Handler/Persona/Webhook.hs... took 0.00s
# Parse of src/Handler/Plaid/ExchangePublicToken.hs... took 0.03s
# Parse of src/Handler/Plaid/GetFinancialInstitutions.hs... took 0.00s
# Parse of src/Handler/Plaid/RetrieveAuth.hs... took 0.00s
# Parse of src/Handler/Plaid/RetrieveBalance.hs... took 0.00s
# Parse of src/Handler/Plaid/RetrieveIdentity.hs... took 0.01s
# Parse of src/Handler/Plaid/RetrieveTransactions.hs... took 0.00s
# Parse of src/Handler/PostOnboarding/AddFunds.hs... took 0.00s
# Parse of src/Handler/PostOnboarding/Address.hs... took 0.00s
# Parse of src/Handler/PostOnboarding/DebitCards.hs... took 0.00s
# Parse of src/Handler/PostOnboarding/GetPostOnboardingData.hs... took 0.00s
# Parse of src/Handler/PostOnboarding/SaveTeam.hs... took 0.00s
# Parse of src/Handler/PushNotifications/AddToken.hs... took 0.00s
# Parse of src/Handler/Settings/NotificationPreferences.hs... took 0.01s
# Parse of src/Handler/Synapse/Clean.hs... took 0.00s
# Parse of src/Handler/Synapse/Webhook.hs... took 0.01s
# Parse of src/Handler/Team/Invites.hs... took 0.01s
src/Handler/Team/Invites.hs:251:14-55: Warning: Use Just
Found:
  fromMaybe False inviteParamsCanAddAccounts
Perhaps:
  Just True == inviteParamsCanAddAccounts

src/Handler/Team/Invites.hs:252:14-54: Warning: Use Just
Found:
  fromMaybe False inviteParamsCanChangeTeam
Perhaps:
  Just True == inviteParamsCanChangeTeam

src/Handler/Team/Invites.hs:254:14-56: Warning: Use Just
Found:
  fromMaybe False inviteParamsCanViewPayments
Perhaps:
  Just True == inviteParamsCanViewPayments

src/Handler/Team/Invites.hs:255:14-60: Warning: Use Just
Found:
  fromMaybe False inviteParamsCanResetTeammate2fa
Perhaps:
  Just True == inviteParamsCanResetTeammate2fa

src/Handler/Team/Invites.hs:256:14-56: Warning: Use Just
Found:
  fromMaybe False inviteParamsCanAddApiTokens
Perhaps:
  Just True == inviteParamsCanAddApiTokens

# Parse of src/Handler/Team/RemoveUser.hs... took 0.00s
# Parse of src/Handler/Team/UpdatePermissions.hs... took 0.00s
# Parse of src/Handler/Team/InvitedUsers/BeneficialOwnerData.hs... took 0.00s
# Parse of src/Handler/Treasury/Onboarding.hs... took 0.01s
# Parse of src/Handler/Treasury/Treasury.hs... took 0.01s
# Parse of src/Handler/Treasury/Onboarding/BeneficialOwner.hs... took 0.01s
# Parse of src/Handler/Treasury/Onboarding/Types.hs... took 0.01s
# Parse of src/Handler/Uploads/BusinessNameDocument.hs... took 0.00s
# Parse of src/Handler/Uploads/CheckImage.hs... took 0.02s
# Parse of src/Handler/Uploads/ConvertImage.hs... took 0.00s
# Parse of src/Handler/Uploads/Core.hs... took 0.01s
# Parse of src/Handler/Uploads/EinDocument.hs... took 0.00s
# Parse of src/Handler/Uploads/EntityFormation.hs... took 0.00s
# Parse of src/Handler/Uploads/Identification.hs... took 0.00s
# Parse of src/Handler/Uploads/Types.hs... took 0.00s
# Parse of src/Handler/User/ShippingAddress.hs... took 0.00s
# Parse of src/Handler/Util/AppHelpers.hs... took 0.00s
# Parse of src/Handler/Util/Cookie.hs... took 0.00s
src/Handler/Util/Cookie.hs:37:3-74: Warning: Redundant <$>
Found:
  parseMaybe parser
    =<< toLower . decodeUtf8 <$> Wai.requestHeaderHost req
Perhaps:
  parseMaybe parser . toLower . decodeUtf8
    =<< Wai.requestHeaderHost req

# Parse of src/Handler/Util/JSONError.hs... took 0.00s
# Parse of src/Handler/Util/JSONParsing.hs... took 0.00s
# Parse of src/Import/Handler.hs... took 0.00s
# Parse of src/Import/NoFoundation.hs... took 0.00s
# Parse of src/Import/PreModel.hs... took 0.00s
# Parse of src/Import/TotpCommon.hs... took 0.00s
# Parse of src/Import/Typescript.hs... took 0.00s
# Parse of src/Mailer/Mailer.hs... took 0.00s
# Parse of src/Mailer/Subscription.hs... took 0.00s
src/Mailer/Subscription.hs:63:26-54: Warning: Use Just
Found:
  fromMaybe True userSubscribed
Perhaps:
  Just False /= userSubscribed

# Parse of src/Mailer/Validate.hs... took 0.00s
# Parse of src/Mailer/Admin/AdminAdded.hs... took 0.00s
# Parse of src/Mailer/Admin/NewBeneficialOwner.hs... took 0.00s
# Parse of src/Mailer/Admin/Onboarding.hs... took 0.00s
# Parse of src/Mailer/Authentication/ChangedPassword.hs... took 0.00s
# Parse of src/Mailer/Authentication/ForgotPassword.hs... took 0.00s
# Parse of src/Mailer/Authentication/UsedMFAResetCode.hs... took 0.00s
# Parse of src/Mailer/Authentication/VerifyEmail.hs... took 0.00s
# Parse of src/Mailer/BadWires/BadWires.hs... took 0.00s
# Parse of src/Mailer/Banking/BrexUnderwriting.hs... took 0.00s
# Parse of src/Mailer/Banking/Common.hs... took 0.00s
# Parse of src/Mailer/Banking/RecipientCheckPayment.hs... took 0.00s
# Parse of src/Mailer/Banking/RecipientElectronicPayment.hs... took 0.00s
# Parse of src/Mailer/Banking/SendDebitCardFrozen.hs... took 0.00s
# Parse of src/Mailer/Banking/SendLowBalance.hs... took 0.00s
# Parse of src/Mailer/Banking/SendStaleCheck.hs... took 0.00s
# Parse of src/Mailer/Banking/SendTransactionFailed.hs... took 0.01s
# Parse of src/Mailer/Banking/SendTransactionRequiresDetailedPurpose.hs... took 0.00s
# Parse of src/Mailer/Banking/SendTransactionStarted.hs... took 0.01s
src/Mailer/Banking/SendTransactionStarted.hs:(265,24)-(270,32): Warning: Use Just
Found:
  fromMaybe True
    $ case amount of
        CreditAmount amountDollars
          -> do pure
                  $ positiveDollarToDollar amountDollars >= minIncoming thresholds
        DebitAmount amountDollars
          -> do pure
                  $ positiveDollarToDollar amountDollars >= minOutgoing thresholds
        ZeroAmount -> pure False
Perhaps:
  Just False
    /=
      (case amount of
         CreditAmount amountDollars
           -> do pure
                   $ positiveDollarToDollar amountDollars >= minIncoming thresholds
         DebitAmount amountDollars
           -> do pure
                   $ positiveDollarToDollar amountDollars >= minOutgoing thresholds
         ZeroAmount -> pure False)

# Parse of src/Mailer/Layout/Notice.hs... took 0.00s
# Parse of src/Mailer/Onboarding/AccountApproved.hs... took 0.00s
# Parse of src/Mailer/Onboarding/AdjunctUserApproved.hs... took 0.00s
# Parse of src/Mailer/Onboarding/BeneficialOwner.hs... took 0.00s
# Parse of src/Mailer/Onboarding/BeneficialOwnersCompletedSharedForm.hs... took 0.00s
# Parse of src/Mailer/Onboarding/DebitCardShipped.hs... took 0.00s
# Parse of src/Mailer/Onboarding/SendAPIPartnerInvite.hs... took 0.00s
# Parse of src/Mailer/Onboarding/SendInvite.hs... took 0.00s
# Parse of src/Mailer/Treasury/ApexLargeTrades.hs... took 0.00s
# Parse of src/Mercury/AddressUtils.hs... took 0.00s
# Parse of src/Mercury/Addresses.hs... took 0.00s
# Parse of src/Mercury/AesonUtils.hs... took 0.01s
# Parse of src/Mercury/ApplicativeUtils.hs... took 0.00s
# Parse of src/Mercury/BeneficialOwners.hs... took 0.00s
# Parse of src/Mercury/Casing.hs... took 0.00s
# Parse of src/Mercury/Cryptable.hs... took 0.01s
# Parse of src/Mercury/DailyRecords.hs... took 0.00s
# Parse of src/Mercury/DayUtils.hs... took 0.00s
# Parse of src/Mercury/Display.hs... took 0.00s
# Parse of src/Mercury/Errors.hs... took 0.00s
# Parse of src/Mercury/EsqueletoUtils.hs... took 0.00s
# Parse of src/Mercury/FakeData.hs... took 0.04s
# Parse of src/Mercury/FederalHolidays.hs... took 0.00s
# Parse of src/Mercury/GithubLink.hs... took 0.00s
# Parse of src/Mercury/ICalendar.hs... took 0.00s
# Parse of src/Mercury/Onboarding.hs... took 0.00s
# Parse of src/Mercury/OrganizationAddresses.hs... took 0.00s
src/Mercury/OrganizationAddresses.hs:125:20-78: Warning: Use Just
Found:
  fromMaybe False (overrideDeliverability editAddressPayload)
Perhaps:
  (Just True == overrideDeliverability editAddressPayload)

# Parse of src/Mercury/Organizations.hs... took 0.01s
# Parse of src/Mercury/PasswordReset.hs... took 0.00s
# Parse of src/Mercury/PersistentUtils.hs... took 0.01s
# Parse of src/Mercury/SicknessScore.hs... took 0.01s
# Parse of src/Mercury/Slack.hs... took 0.01s
# Parse of src/Mercury/StmUtils.hs... took 0.00s
# Parse of src/Mercury/SwiftUtils.hs... took 0.00s
# Parse of src/Mercury/TupleUtils.hs... took 0.00s
# Parse of src/Mercury/Users.hs... took 0.00s
# Parse of src/Mercury/Validation.hs... took 0.00s
# Parse of src/Mercury/VerifyEmail.hs... took 0.00s
# Parse of src/Mercury/XmlbfUtils.hs... took 0.00s
# Parse of src/Mercury/API/Common.hs... took 0.00s
# Parse of src/Mercury/API/Clerky/ExternalOnboardingData.hs... took 0.00s
# Parse of src/Mercury/API/External/Esqueleto.hs... took 0.00s
# Parse of src/Mercury/API/External/Types.hs... took 0.01s
# Parse of src/Mercury/API/Plaid/Esqueleto.hs... took 0.00s
src/Mercury/API/Plaid/Esqueleto.hs:(66,15)-(68,95): Warning: Redundant ^.
Found:
  settledTrx &&. transactionMetadata
    ^.
      TransactionMetadataPostedAt >=. (val $ Just startDate)
        &&. transactionMetadata
    ^. TransactionMetadataPostedAt <=. (val $ Just endDate)
Perhaps:
  (settledTrx &&. transactionMetadata)
    ^.
      ((TransactionMetadataPostedAt >=. (val $ Just startDate)
          &&. transactionMetadata)
         . (TransactionMetadataPostedAt <=. (val $ Just endDate)))

src/Mercury/API/Plaid/Esqueleto.hs:(70,21)-(71,93): Warning: Redundant ^.
Found:
  transactionMetadata
    ^.
      TransactionMetadataCreatedAt >=. val startDate
        &&. transactionMetadata
    ^. TransactionMetadataCreatedAt <=. val endDate
Perhaps:
  transactionMetadata
    ^.
      ((TransactionMetadataCreatedAt >=. val startDate
          &&. transactionMetadata)
         . (TransactionMetadataCreatedAt <=. val endDate))

# Parse of src/Mercury/Admin/AuditTrail.hs... took 0.00s
# Parse of src/Mercury/Admin/AuditTrail/Sql.hs... took 0.00s
# Parse of src/Mercury/Admin/BeneficialOwners/Esqueleto.hs... took 0.00s
# Parse of src/Mercury/Authentication/AlphaCodes.hs... took 0.00s
# Parse of src/Mercury/Authentication/Passwords.hs... took 0.00s
# Parse of src/Mercury/Authentication/PermanentCookieIdentifier.hs... took 0.00s
# Parse of src/Mercury/Authentication/RememberedDevices.hs... took 0.00s
# Parse of src/Mercury/Authentication/UserIpAddress.hs... took 0.00s
# Parse of src/Mercury/Authentication/MFAReset/Core.hs... took 0.00s
# Parse of src/Mercury/Authentication/MFAReset/DB.hs... took 0.00s
# Parse of src/Mercury/Authentication/OAuth/V1/RSA.hs... took 0.00s
# Parse of src/Mercury/Authentication/OAuth/V1/Types.hs... took 0.00s
# Parse of src/Mercury/Authentication/OAuth/V1/Xero.hs... took 0.01s
src/Mercury/Authentication/OAuth/V1/Xero.hs:51:27-84: Warning: Redundant <$>
Found:
  readMay =<< decodeUtf8 <$> lookup "oauth_expires_in" creds
Perhaps:
  readMay . decodeUtf8 =<< lookup "oauth_expires_in" creds

src/Mercury/Authentication/OAuth/V1/Xero.hs:171:15-68: Warning: Redundant <$>
Found:
  getAccessToken oauth req =<< appHttpManager <$> getApp
Perhaps:
  getAccessToken oauth req . appHttpManager =<< getApp

# Parse of src/Mercury/Authentication/Sessions/CookieKeys.hs... took 0.00s
# Parse of src/Mercury/Authentication/Sessions/Interface.hs... took 0.00s
# Parse of src/Mercury/Authentication/Sessions/Server/Core.hs... took 0.00s
# Parse of src/Mercury/Authentication/Sessions/Server/DB.hs... took 0.00s
# Parse of src/Mercury/Banking/BankNameFromRoutingNumber.hs... took 0.00s
# Parse of src/Mercury/Banking/Common.hs... took 0.03s
# Parse of src/Mercury/Banking/OrganizationDashboardOverview.hs... took 0.00s
# Parse of src/Mercury/Banking/Quickbooks.hs... took 0.00s
# Parse of src/Mercury/Banking/ScheduledPayment.hs... took 0.00s
# Parse of src/Mercury/Banking/SearchTransactions.hs... took 0.01s
src/Mercury/Banking/SearchTransactions.hs:304:20-120: Suggestion: Use maybe
Found:
  map
    (toWhere_ metadata party counterparty debitCardPayment)
    (fromMaybe [] (searchTerm filterPayload))
Perhaps:
  maybe
    [] (map (toWhere_ metadata party counterparty debitCardPayment))
    (searchTerm filterPayload)

# Parse of src/Mercury/Banking/Sql.hs... took 0.04s
src/Mercury/Banking/Sql.hs:(90,9)-(91,55): Warning: Redundant ^.
Found:
  plaidItem
    ^. PlaidItemOrganizationId `in_` valList orgIdList &&. plaidAccount
    ^. PlaidAccountMarkedDeleted
Perhaps:
  (plaidItem
     ^.
       ((PlaidItemOrganizationId `in_` valList orgIdList &&. plaidAccount)
          . PlaidAccountMarkedDeleted))

src/Mercury/Banking/Sql.hs:(115,9)-(116,46): Warning: Redundant ^.
Found:
  mercuryAccount
    ^.
      MercuryAccountOrganizationId `in_` valList orgIdList
        &&. bankAccount
    ^. BankAccountStatus
Perhaps:
  (mercuryAccount
     ^.
       ((MercuryAccountOrganizationId `in_` valList orgIdList
           &&. bankAccount)
          . BankAccountStatus))

src/Mercury/Banking/Sql.hs:(126,9)-(127,46): Warning: Redundant ^.
Found:
  mercuryAccount
    ^.
      MercuryAccountOrganizationId `in_` valList orgIdList
        &&. bankAccount
    ^. BankAccountStatus
Perhaps:
  (mercuryAccount
     ^.
       ((MercuryAccountOrganizationId `in_` valList orgIdList
           &&. bankAccount)
          . BankAccountStatus))

src/Mercury/Banking/Sql.hs:(285,9)-(286,46): Warning: Redundant ^.
Found:
  externalAccount
    ^.
      ExternalAccountOrganizationId `in_` valList orgIdList
        &&. bankAccount
    ^. BankAccountStatus
Perhaps:
  (externalAccount
     ^.
       ((ExternalAccountOrganizationId `in_` valList orgIdList
           &&. bankAccount)
          . BankAccountStatus))

src/Mercury/Banking/Sql.hs:(379,54)-(384,149): Warning: Redundant ^.
Found:
  val ExternalAccountKind &&. transactionParty
    ^.
      TransactionPartyOrganizationId `in_` valList orgIdList
        &&. plaidAccount
    ^.
      PlaidAccountMarkedDeleted !=. val True
        &&.
          coalesceDefault
            [plaidAccount ^. PlaidAccountAccountType]
            (val [compileNonEmptyText|depository|])
        !=. val [compileNonEmptyText|credit|]
Perhaps:
  ((val ExternalAccountKind &&. transactionParty)
     ^.
       ((TransactionPartyOrganizationId `in_` valList orgIdList
           &&. plaidAccount)
          . (PlaidAccountMarkedDeleted !=. val True
               &&.
                 coalesceDefault
                   [plaidAccount ^. PlaidAccountAccountType]
                   (val [compileNonEmptyText|depository|])
               !=. val [compileNonEmptyText|credit|])))

src/Mercury/Banking/Sql.hs:(589,9)-(591,42): Warning: Redundant ^.
Found:
  (orgUser ^. OrganizationUserId) `in_` valList orgUserIdList
    &&. debitCard
    ^. DebitCardStatus `in_` valList acceptableStatuses &&. debitCard
    ^. DebitCardUserId
Perhaps:
  (((orgUser ^. OrganizationUserId) `in_` valList orgUserIdList
      &&. debitCard)
     ^.
       ((DebitCardStatus `in_` valList acceptableStatuses &&. debitCard)
          . DebitCardUserId))

src/Mercury/Banking/Sql.hs:(591,48)-(592,72): Warning: Redundant ^.
Found:
  orgUser ^. OrganizationUserUserId &&. debitCard
    ^. DebitCardRealm `in_` valList acceptableRealms
Perhaps:
  (orgUser
     ^.
       ((OrganizationUserUserId &&. debitCard)
          . (DebitCardRealm `in_` valList acceptableRealms)))

src/Mercury/Banking/Sql.hs:(732,9)-(733,100): Warning: Redundant ^.
Found:
  mercuryAccount
    ^.
      MercuryAccountOrganizationId `in_` valList orgIdList &&. debitCard
    ^.
      DebitCardStatus
        `notIn` valList [Card.StatusCancelled, Card.StatusLocked]
Perhaps:
  (mercuryAccount
     ^.
       ((MercuryAccountOrganizationId `in_` valList orgIdList
           &&. debitCard)
          . (DebitCardStatus
               `notIn` valList [Card.StatusCancelled, Card.StatusLocked])))

src/Mercury/Banking/Sql.hs:1479:32-140: Warning: Redundant ^.
Found:
  mercuryAccount
    ^. MercuryAccountAvailableBalance >. lowBalanceNotification
    ^. LowBalanceNotificationThreshold
Perhaps:
  mercuryAccount
    ^.
      ((MercuryAccountAvailableBalance >. lowBalanceNotification)
         . LowBalanceNotificationThreshold)

# Parse of src/Mercury/Banking/UserSecurityLogging.hs... took 0.00s
# Parse of src/Mercury/Banking/Types/Accounts.hs... took 0.00s
# Parse of src/Mercury/Banking/Types/Cards.hs... took 0.01s
# Parse of src/Mercury/Banking/Types/Core.hs... took 0.03s
# Parse of src/Mercury/Banking/Types/ExternalAccounts.hs... took 0.00s
# Parse of src/Mercury/Banking/Types/Organizations.hs... took 0.00s
# Parse of src/Mercury/Banking/Types/Recipients.hs... took 0.00s
# Parse of src/Mercury/Banking/Types/Transactions.hs... took 0.00s
# Parse of src/Mercury/Banking/Types/Transfers.hs... took 0.00s
# Parse of src/Mercury/BannedRecipients/BanList.hs... took 0.00s
# Parse of src/Mercury/BannedRecipients/Handler.hs... took 0.00s
# Parse of src/Mercury/Brex/AccountData.hs... took 0.01s
# Parse of src/Mercury/CountrySpecific/Chile.hs... took 0.00s
# Parse of src/Mercury/CountrySpecific/Colombia.hs... took 0.00s
# Parse of src/Mercury/CountrySpecific/Singapore.hs... took 0.00s
# Parse of src/Mercury/Data/Char.hs... took 0.00s
# Parse of src/Mercury/Database/Exceptions.hs... took 0.00s
# Parse of src/Mercury/Database/Idempotency.hs... took 0.00s
# Parse of src/Mercury/Database/SafeDelete.hs... took 0.00s
# Parse of src/Mercury/Database/Persist/DeriveEnum.hs... took 0.00s
# Parse of src/Mercury/Frontend/Routes.hs... took 0.00s
# Parse of src/Mercury/IOS/Alerts.hs... took 0.00s
# Parse of src/Mercury/IOS/Generate.hs... took 0.01s
# Parse of src/Mercury/Image/Convert.hs... took 0.01s
# Parse of src/Mercury/Image/Metadata.hs... took 0.00s
# Parse of src/Mercury/Metrics/Helpers.hs... took 0.00s
# Parse of src/Mercury/Network/Logging.hs... took 0.01s
# Parse of src/Mercury/Network/SFTP.hs... took 0.00s
# Parse of src/Mercury/Network/Utils.hs... took 0.00s
# Parse of src/Mercury/Network/Bugsnag/Core.hs... took 0.00s
# Parse of src/Mercury/Network/Bugsnag/DB.hs... took 0.00s
# Parse of src/Mercury/Network/Bugsnag/Handler.hs... took 0.00s
# Parse of src/Mercury/Network/VGS/Manager.hs... took 0.00s
# Parse of src/Mercury/Network/Wai/Middleware/Cors.hs... took 0.00s
# Parse of src/Mercury/Network/Wai/Middleware/HostCheck.hs... took 0.00s
# Parse of src/Mercury/Network/Wai/Middleware/Metrics.hs... took 0.00s
# Parse of src/Mercury/Network/Wai/Middleware/OriginCheck.hs... took 0.00s
# Parse of src/Mercury/Network/Wai/Middleware/SkipMiddlewareWhen.hs... took 0.00s
# Parse of src/Mercury/Onboarding/BeneficialOwnerIncremental.hs... took 0.00s
# Parse of src/Mercury/Onboarding/BusinessDetailsRequest.hs... took 0.00s
# Parse of src/Mercury/Onboarding/FileMetadata.hs... took 0.01s
# Parse of src/Mercury/Onboarding/Sql.hs... took 0.01s
src/Mercury/Onboarding/Sql.hs:185:66-100: Suggestion: Use <=<
Found:
  (mkNonEmptyText =<<) . _benAddress1
Perhaps:
  mkNonEmptyText Control.Monad.<=< _benAddress1

src/Mercury/Onboarding/Sql.hs:186:66-100: Suggestion: Use <=<
Found:
  (mkNonEmptyText =<<) . _benAddress2
Perhaps:
  mkNonEmptyText Control.Monad.<=< _benAddress2

src/Mercury/Onboarding/Sql.hs:187:62-92: Suggestion: Use <=<
Found:
  (mkNonEmptyText =<<) . _benCity
Perhaps:
  mkNonEmptyText Control.Monad.<=< _benCity

src/Mercury/Onboarding/Sql.hs:189:68-104: Suggestion: Use <=<
Found:
  (mkNonEmptyText =<<) . _benPostalCode
Perhaps:
  mkNonEmptyText Control.Monad.<=< _benPostalCode

# Parse of src/Mercury/Onboarding/BusinessDetailsRequest/Types.hs... took 0.00s
# Parse of src/Mercury/Onboarding/IdentityVerificationRequest/Sql.hs... took 0.00s
# Parse of src/Mercury/Onboarding/IdentityVerificationRequest/Types.hs... took 0.00s
# Parse of src/Mercury/Onboarding/Persona/Sql.hs... took 0.00s
# Parse of src/Mercury/PDF/AccountClosedLetter.hs... took 0.00s
# Parse of src/Mercury/PDF/BankLetter.hs... took 0.00s
# Parse of src/Mercury/PDF/Core.hs... took 0.00s
# Parse of src/Mercury/PDF/InternationalWireRecipientAgreement.hs... took 0.00s
# Parse of src/Mercury/PDF/OutgoingWireInstructions.hs... took 0.00s
# Parse of src/Mercury/PDF/Puppeteer.hs... took 0.00s
# Parse of src/Mercury/PDF/WireDetails.hs... took 0.00s
src/Mercury/PDF/WireDetails.hs:49:18-65: Suggestion: Avoid lambda using `infix`
Found:
  (\ c -> CharSet.member c validFilenameCharacters)
Perhaps:
  (`CharSet.member` validFilenameCharacters)

# Parse of src/Mercury/PPP/DatabaseTypes.hs... took 0.00s
# Parse of src/Mercury/PPP/Sql.hs... took 0.00s
# Parse of src/Mercury/Plaid/HistoricalBalances.hs... took 0.00s
# Parse of src/Mercury/Plaid/UpdatePlaidAccounts.hs... took 0.00s
# Parse of src/Mercury/Plaid/HTTP/CreatePublicToken.hs... took 0.00s
# Parse of src/Mercury/Plaid/HTTP/ExchangePublicToken.hs... took 0.00s
# Parse of src/Mercury/Plaid/HTTP/GetAllCategories.hs... took 0.00s
# Parse of src/Mercury/Plaid/HTTP/GetFinancialInstitutions.hs... took 0.00s
# Parse of src/Mercury/Plaid/HTTP/RetrieveAuth.hs... took 0.00s
# Parse of src/Mercury/Plaid/HTTP/RetrieveBalance.hs... took 0.00s
# Parse of src/Mercury/Plaid/HTTP/RetrieveIdentity.hs... took 0.00s
# Parse of src/Mercury/Plaid/HTTP/RetrieveItem.hs... took 0.00s
# Parse of src/Mercury/Plaid/HTTP/RetrieveTransactions.hs... took 0.00s
# Parse of src/Mercury/Plaid/HTTP/WebhookNotifications.hs... took 0.00s
# Parse of src/Mercury/Plaid/Types/Account.hs... took 0.00s
# Parse of src/Mercury/Plaid/Types/Core.hs... took 0.01s
# Parse of src/Mercury/Plaid/Types/Institution.hs... took 0.00s
# Parse of src/Mercury/Plaid/Types/Item.hs... took 0.00s
# Parse of src/Mercury/Plaid/Types/Transaction.hs... took 0.00s
# Parse of src/Mercury/Plaid/Utils/HTTP.hs... took 0.00s
# Parse of src/Mercury/PostOnboarding/CompletionStatus.hs... took 0.00s
# Parse of src/Mercury/PostOnboarding/Esqueleto.hs... took 0.00s
# Parse of src/Mercury/PostOnboarding/Sql.hs... took 0.00s
# Parse of src/Mercury/Purpose/DB.hs... took 0.00s
# Parse of src/Mercury/Purpose/Handler.hs... took 0.00s
# Parse of src/Mercury/Purpose/Proxy.hs... took 0.00s
# Parse of src/Mercury/Purpose/Types.hs... took 0.00s
# Parse of src/Mercury/SicknessScore/Types.hs... took 0.00s
# Parse of src/Mercury/Statement/Generate.hs... took 0.01s
src/Mercury/Statement/Generate.hs:31:18-33: Suggestion: Avoid lambda using `infix`
Found:
  (\ c -> c /= ' ')
Perhaps:
  (/= ' ')

# Parse of src/Mercury/Statement/GenerateMercuryBackend.hs... took 0.00s
# Parse of src/Mercury/Statement/GenerateSynapseBackend.hs... took 0.01s
# Parse of src/Mercury/Statement/Sql.hs... took 0.00s
# Parse of src/Mercury/Statement/StatementData.hs... took 0.00s
# Parse of src/Mercury/Team/Esqueleto.hs... took 0.00s
# Parse of src/Mercury/Team/Invites.hs... took 0.00s
# Parse of src/Mercury/Treasury/RebalanceWorker.hs... took 0.00s
# Parse of src/Mercury/Treasury/Rebalancer.hs... took 0.03s
# Parse of src/Mercury/Treasury/Return.hs... took 0.00s
# Parse of src/Mercury/Treasury/ReturnCalculation.hs... took 0.00s
# Parse of src/Mercury/Treasury/Sql.hs... took 0.00s
# Parse of src/Mercury/Treasury/Statements.hs... took 0.00s
# Parse of src/Mercury/Treasury/Types.hs... took 0.00s
# Parse of src/Mercury/Treasury/Yield.hs... took 0.00s
# Parse of src/Mercury/Treasury/Onboarding/FrontendTypes.hs... took 0.00s
# Parse of src/Mercury/Treasury/Onboarding/Types.hs... took 0.00s
# Parse of src/Mercury/Typescript/Orphans.hs... took 0.00s
# Parse of src/Mercury/Typescript/Generate/Core.hs... took 0.00s
# Parse of src/Mercury/Typescript/Generate/Generate.hs... took 0.03s
# Parse of src/Mercury/Warp/Bugsnag.hs... took 0.00s
# Parse of src/Mercury/Yesod/ErrorHandler.hs... took 0.00s
# Parse of src/Mercury/Yesod/Middleware/Bugsnag.hs... took 0.00s
# Parse of src/Mercury/Yesod/Middleware/Csrf.hs... took 0.00s
# Parse of src/Mercury/Yesod/Middleware/ServerSessions.hs... took 0.00s
# Parse of src/Mercury/Yesod/Middleware/UTF8Check.hs... took 0.00s
# Parse of src/Mercury/Yesod/Routes/Generator.hs... took 0.00s
# Parse of src/Mercury/Yesod/Routes/Generator/Core.hs... took 0.00s
# Parse of src/Mercury/Yesod/Routes/Generator/Typescript.hs... took 0.00s
# Parse of src/Mercury/Yesod/Routes/Metrics/Function.hs... took 0.00s
# Parse of src/Mercury/Yesod/Routes/Metrics/TH.hs... took 0.00s
# Parse of src/Model/Country.hs... took 0.01s
# Parse of src/Model/CurrencyCloud.hs... took 0.00s
# Parse of src/Model/CustomTypes.hs... took 0.03s
# Parse of src/Model/Dialpad.hs... took 0.00s
# Parse of src/Model/IOS.hs... took 0.00s
# Parse of src/Model/MFAReset.hs... took 0.00s
# Parse of src/Model/Numeric.hs... took 0.01s
# Parse of src/Model/Onboarding.hs... took 0.01s
src/Model/Onboarding.hs:73:12-67: Suggestion: Avoid lambda using `infix`
Found:
  (\ c -> CharSet.member c invalidIdentificationCharacters)
Perhaps:
  (`CharSet.member` invalidIdentificationCharacters)

# Parse of src/Model/Organization.hs... took 0.00s
# Parse of src/Model/PurposeCode.hs... took 0.00s
# Parse of src/Model/Security.hs... took 0.00s
# Parse of src/Model/USStates.hs... took 0.00s
# Parse of src/Model/UUID.hs... took 0.00s
# Parse of src/Model/CountrySpecific/Australia.hs... took 0.00s
# Parse of src/Model/CountrySpecific/Canada.hs... took 0.00s
# Parse of src/Model/CountrySpecific/India.hs... took 0.00s
# Parse of src/Model/CountrySpecific/Philippines.hs... took 0.00s
# Parse of src/Model/CountrySpecific/Russia.hs... took 0.00s
# Parse of src/Model/CountrySpecific/SouthAfrica.hs... took 0.00s
# Parse of src/Model/CountrySpecific/Uruguay.hs... took 0.00s
# Parse of src/Model/OAuth/V1.hs... took 0.00s
# Parse of src/PersistentModels/Brex.hs... took 0.00s
# Parse of src/PersistentModels/CurrencyCloud.hs... took 0.00s
# Parse of src/PersistentModels/Dialpad.hs... took 0.00s
# Parse of src/PersistentModels/Migrate.hs... took 0.00s
# Parse of src/PersistentModels/OAuth.hs... took 0.00s
# Parse of src/PersistentModels/Persona.hs... took 0.00s
# Parse of src/PersistentModels/Plaid.hs... took 0.00s
# Parse of src/PersistentModels/Xero.hs... took 0.00s
# Parse of src/PersistentModels/Apex/Core.hs... took 0.00s
# Parse of src/PersistentModels/Mercury/Bank.hs... took 0.00s
# Parse of src/PersistentModels/Mercury/Core.hs... took 0.00s
# Parse of src/PersistentModels/Mercury/Depository.hs... took 0.00s
# Parse of src/PersistentModels/Mercury/IOS.hs... took 0.00s
# Parse of src/PersistentModels/Mercury/Notifications.hs... took 0.00s
# Parse of src/PersistentModels/Mercury/Onboarding.hs... took 0.00s
# Parse of src/PersistentModels/Mercury/OnboardingRequests.hs... took 0.00s
# Parse of src/PersistentModels/Mercury/PPP.hs... took 0.00s
# Parse of src/PersistentModels/Mercury/Security.hs... took 0.00s
# Parse of src/PersistentModels/Mercury/Treasury.hs... took 0.00s
# Parse of src/PersistentModels/Synapse/Banking.hs... took 0.00s
# Parse of src/PersistentModels/Synapse/Basic.hs... took 0.00s
# Parse of src/PersistentModels/Synapse/GeneralUser.hs... took 0.00s
# Parse of src/PersistentModels/Synapse/Onboarding.hs... took 0.00s
# Parse of src/Stubs/Http.hs... took 0.00s
# Parse of src/Stubs/Stubs.hs... took 0.00s
# Parse of src/Stubs/Types.hs... took 0.00s
# Parse of src/Stubs/Util.hs... took 0.00s
# Parse of src/Tasks/BackfillSicknessScores.hs... took 0.00s
# Parse of src/Tasks/CheckBalanceConsistency.hs... took 0.00s
# Parse of src/Tasks/CheckDatabaseAssumptions.hs... took 0.01s
src/Tasks/CheckDatabaseAssumptions.hs:313:14-132: Warning: Redundant ^.
Found:
  beneficialOwner
    ^. OnboardingBeneficialOwnerOrganizationId !=. apexBeneficialOwner
    ^. ApexBeneficialOwnerOrganizationId
Perhaps:
  (beneficialOwner
     ^.
       ((OnboardingBeneficialOwnerOrganizationId !=. apexBeneficialOwner)
          . ApexBeneficialOwnerOrganizationId))

src/Tasks/CheckDatabaseAssumptions.hs:321:14-132: Warning: Redundant ^.
Found:
  apexAuthorizedSigner
    ^. ApexAuthorizedSignerOrganizationId !=. apexBeneficialOwner
    ^. ApexBeneficialOwnerOrganizationId
Perhaps:
  (apexAuthorizedSigner
     ^.
       ((ApexAuthorizedSignerOrganizationId !=. apexBeneficialOwner)
          . ApexBeneficialOwnerOrganizationId))

src/Tasks/CheckDatabaseAssumptions.hs:329:14-140: Warning: Redundant ^.
Found:
  apexCorporateResolution
    ^. ApexCorporateResolutionOrganizationId !=. apexAuthorizedSigner
    ^. ApexAuthorizedSignerOrganizationId
Perhaps:
  (apexCorporateResolution
     ^.
       ((ApexCorporateResolutionOrganizationId !=. apexAuthorizedSigner)
          . ApexAuthorizedSignerOrganizationId))

src/Tasks/CheckDatabaseAssumptions.hs:337:14-126: Warning: Redundant ^.
Found:
  apexLlcAgreement
    ^. ApexLlcAgreementOrganizationId !=. apexAuthorizedSigner
    ^. ApexAuthorizedSignerOrganizationId
Perhaps:
  (apexLlcAgreement
     ^.
       ((ApexLlcAgreementOrganizationId !=. apexAuthorizedSigner)
          . ApexAuthorizedSignerOrganizationId))

# Parse of src/Tasks/CheckLowBalance.hs... took 0.00s
# Parse of src/Tasks/CheckStaleChecks.hs... took 0.00s
# Parse of src/Tasks/CleanTransactionHistory.hs... took 0.00s
# Parse of src/Tasks/DebitCardSpend.hs... took 0.00s
# Parse of src/Tasks/DecryptSsn.hs... took 0.00s
# Parse of src/Tasks/DeleteExpiredAdminOnboardingReservations.hs... took 0.00s
# Parse of src/Tasks/GenerateInternationalPurposeCodes.hs... took 0.00s
# Parse of src/Tasks/GenerateInvestorData.hs... took 0.00s
# Parse of src/Tasks/RequestSynapseApproval.hs... took 0.00s
# Parse of src/Tasks/SendBrexEmails.hs... took 0.00s
# Parse of src/Tasks/SendSynapseWireList.hs... took 0.00s
src/Tasks/SendSynapseWireList.hs:77:17-127: Warning: Use maybe
Found:
  genericRunDB . synapseWireDataQuery . fromMaybe now
    $ synapseWireEmailCreatedAt . entityVal <$> mostRecentEmail
Perhaps:
  (genericRunDB . synapseWireDataQuery)
    (maybe now (synapseWireEmailCreatedAt . entityVal) mostRecentEmail)

# Parse of src/Tasks/StuckSynapseCheckDeposits.hs... took 0.00s
# Parse of src/Tasks/SubscribeToDialpadWebhooks.hs... took 0.00s
# Parse of test/FakeDataSpec.hs... took 0.00s
# Parse of test/Gen.hs... took 0.01s
# Parse of test/HspecExtensions.hs... took 0.00s
# Parse of test/Main.hs... took 0.00s
# Parse of test/Spec.hs... took 0.00s
# Parse of test/TestImport.hs... took 0.04s
# Parse of test/Client/ExportSpec.hs... took 0.00s
# Parse of test/Client/Apex/AleSpec.hs... took 0.00s
# Parse of test/Client/Apex/AtlasSpec.hs... took 0.00s
# Parse of test/Client/Apex/AuthSpec.hs... took 0.00s
# Parse of test/Client/Apex/EdocsSpec.hs... took 0.02s
# Parse of test/Client/Apex/EquilibriumSpec.hs... took 0.00s
# Parse of test/Client/Apex/ExtractsSpec.hs... took 0.01s
# Parse of test/Client/Apex/SentinelSpec.hs... took 0.00s
# Parse of test/Client/Apex/SketchSpec.hs... took 0.00s
# Parse of test/Client/Apex/Atlas/FormsSpec.hs... took 0.00s
# Parse of test/Client/Apex/Atlas/Stubs.hs... took 0.00s
# Parse of test/Client/CrossPartnerSync/CoreSpec.hs... took 0.00s
# Parse of test/Client/Lob/VerifyAddressSpec.hs... took 0.00s
# Parse of test/Client/Persona/PersonaSpec.hs... took 0.00s
# Parse of test/Client/Segment/V1/GroupSpec.hs... took 0.00s
# Parse of test/Client/Segment/V1/SegmentSpec.hs... took 0.00s
# Parse of test/Client/Synapse/V3/CardSpec.hs... took 0.01s
# Parse of test/Client/Synapse/V3/ConsistencySpec.hs... took 0.00s
# Parse of test/Client/Synapse/V3/NodeSpec.hs... took 0.00s
# Parse of test/Client/Synapse/V3/SQLetoSpec.hs... took 0.00s
# Parse of test/Client/Synapse/V3/StatementSpec.hs... took 0.00s
# Parse of test/Client/Synapse/V3/UserSpec.hs... took 0.01s
# Parse of test/Client/Synapse/V3/Node/ClassSpec.hs... took 0.00s
# Parse of test/Client/Synapse/V3/Transaction/ClassSpec.hs... took 0.00s
# Parse of test/Client/Synapse/V3/Transaction/TransactionDisputeSpec.hs... took 0.00s
# Parse of test/Client/Synapse/V3/Types/CommonSpec.hs... took 0.00s
# Parse of test/Client/Synapse/V3/Webhook/NodeSpec.hs... took 0.00s
# Parse of test/Client/Synapse/V3/Webhook/NoteParserSpec.hs... took 0.00s
# Parse of test/Client/Synapse/V3/Webhook/NullSpec.hs... took 0.00s
# Parse of test/Client/Synapse/V3/Webhook/SubnetConsumerSpec.hs... took 0.00s
# Parse of test/Client/Synapse/V3/Webhook/TransactionConsumerSpec.hs... took 0.02s
# Parse of test/Client/Synapse/V3/Webhook/UserConsumerSpec.hs... took 0.00s
# Parse of test/Config/YamlSpec.hs... took 0.00s
# Parse of test/Consumer/PostgresqueSpec.hs... took 0.01s
# Parse of test/Consumer/Jobs/SendTransactionMoneyMonitoringSpec.hs... took 0.00s
# Parse of test/Database/AssumptionCheckerSpec.hs... took 0.00s
# Parse of test/Database/EnumsSpec.hs... took 0.00s
# Parse of test/Database/PersistentUtilsSpec.hs... took 0.00s
# Parse of test/Handler/AlphaCodeExistsSpec.hs... took 0.00s
# Parse of test/Handler/CommonSpec.hs... took 0.00s
# Parse of test/Handler/FoundationSpec.hs... took 0.00s
# Parse of test/Handler/HomeSpec.hs... took 0.00s
# Parse of test/Handler/SecuritySpec.hs... took 0.01s
# Parse of test/Handler/TOTPSignupCompleteSpec.hs... took 0.00s
# Parse of test/Handler/TOTPSignupStartSpec.hs... took 0.00s
# Parse of test/Handler/TOTPUpdateCompleteSpec.hs... took 0.00s
# Parse of test/Handler/TOTPUpdateStartSpec.hs... took 0.00s
# Parse of test/Handler/API/Finicity/LoginSpec.hs... took 0.00s
# Parse of test/Handler/API/Intuit/TransactionsSpec.hs... took 0.00s
# Parse of test/Handler/API/Mercury/AccountsSpec.hs... took 0.00s
# Parse of test/Handler/API/Mercury/ApiTokensSpec.hs... took 0.01s
# Parse of test/Handler/API/Mercury/AuthSpec.hs... took 0.00s
# Parse of test/Handler/API/Mercury/RecipientsSpec.hs... took 0.01s
# Parse of test/Handler/API/Mercury/TransactionsSpec.hs... took 0.03s
# Parse of test/Handler/API/Plaid/AuthTokenSpec.hs... took 0.00s
# Parse of test/Handler/API/Plaid/TransactionsSpec.hs... took 0.01s
# Parse of test/Handler/API/Plaid/TwoFASpec.hs... took 0.00s
# Parse of test/Handler/API/Plaid/UserSpec.hs... took 0.00s
# Parse of test/Handler/Admin/AlphaCodesSpec.hs... took 0.00s
# Parse of test/Handler/Admin/CardsSpec.hs... took 0.00s
# Parse of test/Handler/Admin/ManageSpec.hs... took 0.00s
# Parse of test/Handler/Admin/OrganizationLockdownSpec.hs... took 0.00s
# Parse of test/Handler/Admin/OrganizationSpec.hs... took 0.00s
# Parse of test/Handler/Admin/OrganizationStatusSpec.hs... took 0.00s
# Parse of test/Handler/Admin/OrganizationTransactionsSpec.hs... took 0.01s
# Parse of test/Handler/Admin/SupportSpec.hs... took 0.00s
# Parse of test/Handler/Admin/UserSpec.hs... took 0.00s
# Parse of test/Handler/Admin/Onboarding/AboutSpec.hs... took 0.00s
# Parse of test/Handler/Admin/Onboarding/BeneficialOwnerIdReuploadReceivedSpec.hs... took 0.00s
# Parse of test/Handler/Admin/Onboarding/BusinessDetailsRequestSpec.hs... took 0.00s
# Parse of test/Handler/Admin/Onboarding/FlagBeneficialOwnerForIdReuploadSpec.hs... took 0.00s
# Parse of test/Handler/Admin/Onboarding/GetDataSpec.hs... took 0.02s
# Parse of test/Handler/Admin/Onboarding/OnboardingRequestsSpec.hs... took 0.01s
# Parse of test/Handler/Admin/Onboarding/RejectSpec.hs... took 0.00s
# Parse of test/Handler/Admin/Onboarding/SetDataSpec.hs... took 0.00s
# Parse of test/Handler/Admin/Treasury/OnboardingSpec.hs... took 0.00s
# Parse of test/Handler/Authentication/PermanentCookieIdentifierSpec.hs... took 0.00s
# Parse of test/Handler/Authentication/SessionSpec.hs... took 0.01s
# Parse of test/Handler/Authentication/SignupSpec.hs... took 0.01s
# Parse of test/Handler/Authentication/UserIpAddressSpec.hs... took 0.00s
# Parse of test/Handler/Authentication/VerifyEmailSpec.hs... took 0.00s
# Parse of test/Handler/Authentication/MFAReset/CreateCodesSpec.hs... took 0.00s
# Parse of test/Handler/Authentication/Password/ChangeSpec.hs... took 0.00s
# Parse of test/Handler/Authentication/Password/ForgotSpec.hs... took 0.00s
# Parse of test/Handler/Authentication/Password/ResetSpec.hs... took 0.00s
# Parse of test/Handler/Banking/AccountGraphDataSpec.hs... took 0.00s
# Parse of test/Handler/Banking/AddRecipientSpec.hs... took 0.01s
# Parse of test/Handler/Banking/BannedSwiftCodeSpec.hs... took 0.00s
# Parse of test/Handler/Banking/CancelPaymentSpec.hs... took 0.00s
# Parse of test/Handler/Banking/CheckDepositSpec.hs... took 0.00s
# Parse of test/Handler/Banking/DebitCardsSpec.hs... took 0.01s
# Parse of test/Handler/Banking/DismissFailedTransactionSpec.hs... took 0.00s
# Parse of test/Handler/Banking/EditRecipientSpec.hs... took 0.00s
# Parse of test/Handler/Banking/GetInitialDataSpec.hs... took 0.01s
# Parse of test/Handler/Banking/MercuryAccountBalancesSpec.hs... took 0.00s
# Parse of test/Handler/Banking/OrganizationDashboardOverviewSpec.hs... took 0.00s
# Parse of test/Handler/Banking/QuickbooksExportSpec.hs... took 0.00s
# Parse of test/Handler/Banking/RoutingNumberSpec.hs... took 0.00s
# Parse of test/Handler/Banking/SearchTransactionsSpec.hs... took 0.00s
# Parse of test/Handler/Banking/SendMoneySpec.hs... took 0.04s
# Parse of test/Handler/Banking/TransferMoneySpec.hs... took 0.01s
# Parse of test/Handler/Banking/UpdateTransactionSpec.hs... took 0.00s
# Parse of test/Handler/Banking/Accounts/CloseAccountSpec.hs... took 0.00s
# Parse of test/Handler/CurrencyCloud/V2/Notification/PaymentSpec.hs... took 0.00s
# Parse of test/Handler/Dialpad/WebhookSpec.hs... took 0.00s
# Parse of test/Handler/Onboarding/BusinessDetailsRequestSpec.hs... took 0.01s
# Parse of test/Handler/Onboarding/EndToEndSpec.hs... took 0.01s
# Parse of test/Handler/Onboarding/OnboardingRequestsSpec.hs... took 0.00s
# Parse of test/Handler/Onboarding/OnboardingSpec.hs... took 0.01s
# Parse of test/Handler/Onboarding/PurgeUserSpec.hs... took 0.00s
# Parse of test/Handler/Onboarding/ShadowbanSpec.hs... took 0.00s
# Parse of test/Handler/Onboarding/SubmitSpec.hs... took 0.01s
# Parse of test/Handler/Persona/WebhookSpec.hs... took 0.01s
# Parse of test/Handler/Plaid/ExchangePublicTokenSpec.hs... took 0.00s
# Parse of test/Handler/Plaid/WebhookSpec.hs... took 0.00s
# Parse of test/Handler/PostOnboarding/AddFundsSpec.hs... took 0.00s
# Parse of test/Handler/PostOnboarding/AddressSpec.hs... took 0.00s
# Parse of test/Handler/PostOnboarding/AttemptCompletionSpec.hs... took 0.00s
# Parse of test/Handler/PostOnboarding/DebitCardsSpec.hs... took 0.00s
# Parse of test/Handler/PostOnboarding/GetPostOnboardingDataSpec.hs... took 0.00s
# Parse of test/Handler/PostOnboarding/SaveTeamSpec.hs... took 0.00s
# Parse of test/Handler/Settings/NotificationPreferencesSpec.hs... took 0.00s
# Parse of test/Handler/Team/InvitesSpec.hs... took 0.01s
# Parse of test/Handler/Team/RemoveUserSpec.hs... took 0.00s
# Parse of test/Handler/Team/UpdatePermissionsSpec.hs... took 0.00s
# Parse of test/Handler/Team/InvitedUsers/BeneficialOwnerDataSpec.hs... took 0.00s
# Parse of test/Handler/Uploads/UploadSpec.hs... took 0.00s
# Parse of test/Mailer/Banking/SendDebitCardFrozenSpec.hs... took 0.00s
# Parse of test/Mailer/Banking/SendLowBalanceSpec.hs... took 0.00s
# Parse of test/Mailer/Banking/SendTransactionFailedSpec.hs... took 0.01s
# Parse of test/Mailer/Banking/SendTransactionRequiresDetailedPurposeSpec.hs... took 0.00s
# Parse of test/Mailer/Banking/SendTransactionStaleCheckSpec.hs... took 0.00s
# Parse of test/Mailer/Banking/SendTransactionStartedSpec.hs... took 0.00s
# Parse of test/Mailer/Onboarding/DebitCardShippedSpec.hs... took 0.00s
# Parse of test/Mercury/BusinessDaysSpec.hs... took 0.00s
# Parse of test/Mercury/ICalendarSpec.hs... took 0.00s
# Parse of test/Mercury/SicknessScoreSpec.hs... took 0.02s
# Parse of test/Mercury/XmlbfUtilsSpec.hs... took 0.00s
# Parse of test/Mercury/Banking/CommonSpec.hs... took 0.00s
# Parse of test/Mercury/Banking/SqlSpec.hs... took 0.01s
# Parse of test/Mercury/Banking/Brex/AccountDataSpec.hs... took 0.00s
# Parse of test/Mercury/Database/EsqueletoUtilsSpec.hs... took 0.00s
# Parse of test/Mercury/Database/IdempotencySpec.hs... took 0.00s
# Parse of test/Mercury/Database/TransactionMetadataHistorySpec.hs... took 0.00s
# Parse of test/Mercury/Onboarding/BusinessDetailsRequestSpec.hs... took 0.00s
# Parse of test/Mercury/Onboarding/FileMetadataSpec.hs... took 0.00s
# Parse of test/Mercury/PDF/ReceiptSpec.hs... took 0.00s
# Parse of test/Mercury/PDF/StatementSpec.hs... took 0.01s
# Parse of test/Mercury/PDF/WireDetailsSpec.hs... took 0.00s
# Parse of test/Mercury/Treasury/BalanceSpec.hs... took 0.00s
# Parse of test/Mercury/Treasury/ReturnSpec.hs... took 0.00s
# Parse of test/Mercury/Treasury/TradesSpec.hs... took 0.01s
# Parse of test/Mercury/Treasury/YieldSpec.hs... took 0.00s
# Parse of test/Model/CountrySpecific/RussiaSpec.hs... took 0.00s
# Parse of test/Plaid/InsertPlaidIdentitySpec.hs... took 0.00s
# Parse of test/Plaid/TokenExchangeHandlerSpec.hs... took 0.00s
# Parse of test/Property/BankingSpec.hs... took 0.00s
# Parse of test/Property/OnboardingSpec.hs... took 0.00s
# Parse of test/Property/PlaidInstitutionsSpec.hs... took 0.00s
# Parse of test/Property/Property.hs... took 0.00s
# Parse of test/Property/TOTPSpec.hs... took 0.00s
# Parse of test/Property/Synapse/NodeSpec.hs... took 0.00s
# Parse of test/Stubs/Import.hs... took 0.00s
# Parse of test/Stubs/Lob.hs... took 0.00s
# Parse of test/Stubs/Persona.hs... took 0.00s
# Parse of test/Stubs/Synapse/Address.hs... took 0.00s
# Parse of test/Tasks/CheckStaleChecksSpec.hs... took 0.00s
# Parse of test/Tasks/DialpadSubscriptionSpec.hs... took 0.00s
# Parse of test/Tasks/LowBalanceCheckSpec.hs... took 0.00s
# Parse of test/Tasks/RequestSynapseApprovalSpec.hs... took 0.00s
# Parse of test/Tasks/SendSynapseWireEmailSpec.hs... took 0.00s
# Parse of test/Unit/BugsnagSpec.hs... took 0.00s
# Parse of test/Unit/BusinessDaysSpec.hs... took 0.00s
# Parse of test/Unit/CasingSpec.hs... took 0.00s
# Parse of test/Unit/CustomTypesSpec.hs... took 0.00s
# Parse of test/Unit/HumanFormattingSpec.hs... took 0.00s
# Parse of test/Unit/NullableGeneratedSpec.hs... took 0.00s
# Parse of test/Unit/OnboardingSpec.hs... took 0.00s
# Parse of test/Unit/TOTPSpec.hs... took 0.00s
50 hints
(1) ~/D/M/h/mercury-web-backend> hlint --version                                       18:33:34
HLint v3.2.1, (C) Neil Mitchell 2006-2020
~/D/M/h/mercury-web-backend>                                                           18:34:53
ndmitchell commented 3 years ago

If you still are interested, --timing with the latest HLint 3.2.1 might give interesting results. That groups things by time spent in each hint as well.

MaxGabriel commented 3 years ago
49 hints
Timing Initialise
  0.00s global flags
  0.00s TOTAL

Timing Config
  0.09s data/hlint.yaml
  0.01s /Users/maximiliantagher/Documents/Mercury/hs/mercury-web-backend/.hlint.yaml
  0.10s TOTAL

Timing Parse
  0.06s src/Client/Apex/Types/Atlas.hs
  0.05s src/Mercury/Banking/Sql.hs
  0.05s src/Client/Bank/Primitive.hs
  0.05s src/Client/Apex/Types/Sentinel/V2/Types.hs
  0.05s src/Client/Synapse/V3/User.hs
  0.04s src/Foundation.hs
  0.04s test/Handler/Banking/SendMoneySpec.hs
  0.03s test/TestImport.hs
  0.03s src/Mercury/Banking/Common.hs
  2.40s Other items (814)
  2.81s TOTAL

Timing Hint
  39.68s Match apply
  2.90s Pattern
  2.82s Bracket
  2.58s List
  1.65s Extensions
  0.89s Lambda
  0.51s ListRec
  0.47s Monad
  0.21s Unsafe
  0.15s Other items (6)
  51.86s TOTAL

Timing TOTAL
  51.86s Hint
  2.81s Parse
  0.10s Config
  0.00s Initialise
  54.78s TOTAL

Took 1m02s
ndmitchell commented 3 years ago

Thanks for the info. We know there's lots of things to optimise in Match apply, so that seems like a reasonable avenue for future work. Glad to see there's little else though - the more concentrated the easier it is to improve.