diff --git a/.circleci/config.yml b/.circleci/config.yml index eb25728..0276ee5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -33,21 +33,12 @@ workflows: cabal-build-extra: --write-ghc-environment-files=ghc8.4.4+ cabal-test-extra: --test-show-details=direct --test-options='+RTS -g1' - - haskell/build-with-binary-cache: - name: GHC 8.10.2 - executor: haskell/ghc-8_10_2 - context: haskell-ci - binary-cache-uri: ${BINARY_CACHE_URI-"http://hw-binary-cache-us-west-2-a.s3-website-us-west-2.amazonaws.com/archive"} - cabal-build-extra: --write-ghc-environment-files=ghc8.4.4+ - cabal-test-extra: --test-show-details=direct --test-options='+RTS -g1' - - merge-point/merge-point: name: Build Ok requires: - GHC 8.4.4 - GHC 8.6.5 - GHC 8.8.3 - - GHC 8.10.2 - github/release-cabal: name: GitHub Release diff --git a/.github/workflows/haskell.yml b/.github/workflows/haskell.yml index 9ddbd2e..c87c784 100644 --- a/.github/workflows/haskell.yml +++ b/.github/workflows/haskell.yml @@ -1,33 +1,85 @@ -# This is a basic workflow to help you get started with Actions +name: Haskell -name: CI +defaults: + run: + shell: bash -# Controls when the action will run. Triggers the workflow on push or pull request -# events but only for the master branch -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] +on: [push] -# A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: - # This workflow contains a single job called "build" build: - # The type of runner that the job will run on - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} + + strategy: + fail-fast: false + matrix: + ghc: ["8.8.4", "8.6.5", "8.8.3", "8.10.2"] + os: [ubuntu-latest] - # Steps represent a sequence of tasks that will be executed as part of the job steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v2 + with: + submodules: true + - uses: actions/setup-haskell@v1 + id: setup-haskell + with: + ghc-version: ${{ matrix.ghc }} + + - name: Configure + run: cabal configure --write-ghc-environment-files=ghc8.4.4+ + + - name: Restore cabal cache + uses: haskell-works/cabal-cache-action@v1 + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + BINARY_CACHE_REGION: ${{ secrets.BINARY_CACHE_REGION }} + BINARY_CACHE_THREADS: ${{ secrets.BINARY_CACHE_THREADS }} + BINARY_CACHE_URI: ${{ secrets.BINARY_CACHE_URI }} + with: + args: | + sync-from-archive \ + --threads "$BINARY_CACHE_THREADS" \ + --archive-uri "$BINARY_CACHE_URI" \ + --region "$BINARY_CACHE_REGION" \ + --store-path "${{ steps.setup-haskell.outputs.cabal-store }}" + + - name: Build + run: cabal build all + + - name: Save cabal cache + uses: haskell-works/cabal-cache-action@v1 + if: ${{ always() }} + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + BINARY_CACHE_REGION: ${{ secrets.BINARY_CACHE_REGION }} + BINARY_CACHE_THREADS: ${{ secrets.BINARY_CACHE_THREADS }} + BINARY_CACHE_URI: ${{ secrets.BINARY_CACHE_URI }} + with: + args: | + sync-to-archive \ + --threads "$BINARY_CACHE_THREADS" \ + --archive-uri "$BINARY_CACHE_URI" \ + --region "$BINARY_CACHE_REGION" \ + --store-path "${{ steps.setup-haskell.outputs.cabal-store }}" - # Runs a single command using the runners shell - - name: Run a one-line script - run: echo Hello, world! + - name: Build + run: cabal test all --test-show-details=direct - # Runs a set of commands using the runners shell - - name: Run a multi-line script - run: | - echo Add other actions to build, - echo test, and deploy your project. + - name: Save cabal cache + uses: haskell-works/cabal-cache-action@v1 + if: ${{ always() }} + env: + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + BINARY_CACHE_REGION: ${{ secrets.BINARY_CACHE_REGION }} + BINARY_CACHE_THREADS: ${{ secrets.BINARY_CACHE_THREADS }} + BINARY_CACHE_URI: ${{ secrets.BINARY_CACHE_URI }} + with: + args: | + sync-to-archive \ + --threads "$BINARY_CACHE_THREADS" \ + --archive-uri "$BINARY_CACHE_URI" \ + --region "$BINARY_CACHE_REGION" \ + --store-path "${{ steps.setup-haskell.outputs.cabal-store }}" diff --git a/app/App/Commands.hs b/app/App/Commands.hs index 4e503c9..4fe0a97 100644 --- a/app/App/Commands.hs +++ b/app/App/Commands.hs @@ -6,6 +6,8 @@ import App.Commands.CreateIndex import App.Commands.Demo import Options.Applicative +{- HLINT ignore "Monoid law, left identity" -} + commands :: Parser (IO ()) commands = commandsGeneral diff --git a/app/App/Commands/Count.hs b/app/App/Commands/Count.hs index 8729c61..71d999e 100644 --- a/app/App/Commands/Count.hs +++ b/app/App/Commands/Count.hs @@ -32,10 +32,7 @@ import qualified HaskellWorks.Data.Json.Standard.Cursor.Fast as JCF import qualified System.IO.MMap as IO siblings :: GenericCursor BSI.ByteString CsPoppy1 (RM.RangeMin CsPoppy1) -> [GenericCursor BSI.ByteString CsPoppy1 (RM.RangeMin CsPoppy1)] -siblings c = c:cs - where cs = case nextSibling c of - Just d -> siblings d - Nothing -> [] +siblings c = c:maybe [] siblings (nextSibling c) runCount :: Z.CountOptions -> IO () runCount opts = do diff --git a/app/App/Commands/CreateIndex.hs b/app/App/Commands/CreateIndex.hs index e2ef8bf..c8aca9d 100644 --- a/app/App/Commands/CreateIndex.hs +++ b/app/App/Commands/CreateIndex.hs @@ -32,8 +32,8 @@ import qualified System.Exit import qualified System.IO as IO import qualified System.IO.MMap as IO -{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-} -{-# ANN module ("HLint: ignore Redundant do" :: String) #-} +{- HLINT ignore "Reduce duplication" -} +{- HLINT ignore "Redundant do" -} runCreateIndexStandard :: Z.CreateIndexOptions -> IO () runCreateIndexStandard opts = do diff --git a/app/App/Commands/Demo.hs b/app/App/Commands/Demo.hs index cb1847f..708d654 100644 --- a/app/App/Commands/Demo.hs +++ b/app/App/Commands/Demo.hs @@ -34,6 +34,8 @@ import qualified Options.Applicative as OA import qualified System.IO as IO import qualified System.IO.MMap as IO +{- HLINT ignore "Reduce duplication" -} + runDemo :: Z.DemoOptions -> IO () runDemo opts = do let filePath = opts ^. the @"filePath" diff --git a/bench/Main.hs b/bench/Main.hs index cd3e58f..3435f3d 100644 --- a/bench/Main.hs +++ b/bench/Main.hs @@ -6,5 +6,5 @@ import Criterion.Main main :: IO () main = do - benchmarks <- fmap mconcat $ sequence $ mempty + benchmarks <- mconcat <$> sequence mempty defaultMain benchmarks diff --git a/examples/Example4.hs b/examples/Example4.hs index 5c948f4..31fe119 100644 --- a/examples/Example4.hs +++ b/examples/Example4.hs @@ -18,6 +18,8 @@ import HaskellWorks.Data.MQuery.Micro import qualified Data.DList as DL +{- HLINT ignore "Reduce duplication" -} + example :: IO () example = do !cursor <- loadPartial "corpus/bench/78mb.json" diff --git a/src/HaskellWorks/Data/Json/FromValue.hs b/src/HaskellWorks/Data/Json/FromValue.hs index a89da90..5edf981 100644 --- a/src/HaskellWorks/Data/Json/FromValue.hs +++ b/src/HaskellWorks/Data/Json/FromValue.hs @@ -1,5 +1,4 @@ -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE TypeSynonymInstances #-} +{-# LANGUAGE FlexibleInstances #-} module HaskellWorks.Data.Json.FromValue where diff --git a/src/HaskellWorks/Data/Json/Internal/Standard/Token/Tokenize.hs b/src/HaskellWorks/Data/Json/Internal/Standard/Token/Tokenize.hs index f32fbd4..eea2888 100644 --- a/src/HaskellWorks/Data/Json/Internal/Standard/Token/Tokenize.hs +++ b/src/HaskellWorks/Data/Json/Internal/Standard/Token/Tokenize.hs @@ -2,7 +2,6 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE TypeSynonymInstances #-} module HaskellWorks.Data.Json.Internal.Standard.Token.Tokenize ( IsChar(..) @@ -25,6 +24,8 @@ import qualified Data.Attoparsec.Types as T import qualified Data.ByteString as BS import qualified HaskellWorks.Data.Parser as P +{- HLINT ignore "Reduce duplication" -} + hexDigitNumeric :: P.Parser t u => T.Parser t Int hexDigitNumeric = do c <- P.satisfyChar (\c -> '0' <= c && c <= '9') diff --git a/src/HaskellWorks/Data/Json/Internal/Value.hs b/src/HaskellWorks/Data/Json/Internal/Value.hs index b3f1a43..ceecc5f 100644 --- a/src/HaskellWorks/Data/Json/Internal/Value.hs +++ b/src/HaskellWorks/Data/Json/Internal/Value.hs @@ -1,6 +1,5 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} diff --git a/src/HaskellWorks/Data/Json/PartialValue.hs b/src/HaskellWorks/Data/Json/PartialValue.hs index 23fb05a..2a63f3c 100644 --- a/src/HaskellWorks/Data/Json/PartialValue.hs +++ b/src/HaskellWorks/Data/Json/PartialValue.hs @@ -1,6 +1,5 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} diff --git a/src/HaskellWorks/Data/Json/Query.hs b/src/HaskellWorks/Data/Json/Query.hs index 6e3a7d7..f1f41af 100644 --- a/src/HaskellWorks/Data/Json/Query.hs +++ b/src/HaskellWorks/Data/Json/Query.hs @@ -1,6 +1,5 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} diff --git a/src/HaskellWorks/Data/Json/Value.hs b/src/HaskellWorks/Data/Json/Value.hs index f80db6a..1846247 100644 --- a/src/HaskellWorks/Data/Json/Value.hs +++ b/src/HaskellWorks/Data/Json/Value.hs @@ -1,5 +1,4 @@ {-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} diff --git a/test/HaskellWorks/Data/Json/LightJsonSpec.hs b/test/HaskellWorks/Data/Json/LightJsonSpec.hs index d368c6a..ae1b820 100644 --- a/test/HaskellWorks/Data/Json/LightJsonSpec.hs +++ b/test/HaskellWorks/Data/Json/LightJsonSpec.hs @@ -1,7 +1,5 @@ -{-# LANGUAGE ExplicitForAll #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE NoMonomorphismRestriction #-} {-# LANGUAGE OverloadedStrings #-} @@ -36,9 +34,9 @@ import qualified HaskellWorks.Data.Json.Standard.Cursor.Fast as FAST import qualified HaskellWorks.Data.Json.Standard.Cursor.Slow as SLOW import qualified HaskellWorks.Data.TreeCursor as TC -{-# ANN module ("HLint: ignore Redundant do" :: String) #-} -{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-} -{-# ANN module ("HLint: ignore Redundant bracket" :: String) #-} +{- HLINT ignore "Reduce duplication" -} +{- HLINT ignore "Redundant bracket" -} +{- HLINT ignore "Redundant do" -} fc = TC.firstChild ns = TC.nextSibling diff --git a/test/HaskellWorks/Data/Json/Simple/CursorSpec.hs b/test/HaskellWorks/Data/Json/Simple/CursorSpec.hs index 03f4e75..39e5cfe 100644 --- a/test/HaskellWorks/Data/Json/Simple/CursorSpec.hs +++ b/test/HaskellWorks/Data/Json/Simple/CursorSpec.hs @@ -1,7 +1,5 @@ -{-# LANGUAGE ExplicitForAll #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE NoMonomorphismRestriction #-} {-# LANGUAGE OverloadedStrings #-} @@ -24,9 +22,9 @@ import qualified HaskellWorks.Data.Json.Simple.Cursor.Fast as FAST import qualified HaskellWorks.Data.Json.Simple.Value as V import qualified HaskellWorks.Data.TreeCursor as TC -{-# ANN module ("HLint: ignore Redundant do" :: String) #-} -{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-} -{-# ANN module ("HLint: ignore Redundant bracket" :: String) #-} +{- HLINT ignore "Reduce duplication" -} +{- HLINT ignore "Redundant bracket" -} +{- HLINT ignore "Redundant do" -} fc = TC.firstChild ns = TC.nextSibling diff --git a/test/HaskellWorks/Data/Json/Standard/CursorSpec.hs b/test/HaskellWorks/Data/Json/Standard/CursorSpec.hs index c6aabf6..e1f02d3 100644 --- a/test/HaskellWorks/Data/Json/Standard/CursorSpec.hs +++ b/test/HaskellWorks/Data/Json/Standard/CursorSpec.hs @@ -1,7 +1,5 @@ -{-# LANGUAGE ExplicitForAll #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE NoMonomorphismRestriction #-} {-# LANGUAGE OverloadedStrings #-} @@ -17,9 +15,9 @@ import Test.Hspec import qualified HaskellWorks.Data.Json.Standard.Cursor.Fast as FAST import qualified HaskellWorks.Data.Json.Standard.Cursor.Slow as SLOW -{-# ANN module ("HLint: ignore Redundant do" :: String) #-} -{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-} -{-# ANN module ("HLint: ignore Redundant bracket" :: String) #-} +{- HLINT ignore "Reduce duplication" -} +{- HLINT ignore "Redundant bracket" -} +{- HLINT ignore "Redundant do" -} spec :: Spec spec = describe "HaskellWorks.Data.Json.Succinct.CursorSpec" $ do diff --git a/test/HaskellWorks/Data/Json/Standard/GenCursorTest.hs b/test/HaskellWorks/Data/Json/Standard/GenCursorTest.hs index 8a9f306..fef2c8d 100644 --- a/test/HaskellWorks/Data/Json/Standard/GenCursorTest.hs +++ b/test/HaskellWorks/Data/Json/Standard/GenCursorTest.hs @@ -1,7 +1,5 @@ -{-# LANGUAGE ExplicitForAll #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE NoMonomorphismRestriction #-} {-# LANGUAGE OverloadedStrings #-} @@ -28,9 +26,9 @@ import Test.Hspec import qualified Data.ByteString as BS import qualified HaskellWorks.Data.TreeCursor as TC -{-# ANN module ("HLint: ignore Redundant do" :: String) #-} -{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-} -{-# ANN module ("HLint: ignore Redundant bracket" :: String) #-} +{- HLINT ignore "Reduce duplication" -} +{- HLINT ignore "Redundant bracket" -} +{- HLINT ignore "Redundant do" -} fc = TC.firstChild ns = TC.nextSibling diff --git a/test/HaskellWorks/Data/Json/Token/TokenizeSpec.hs b/test/HaskellWorks/Data/Json/Token/TokenizeSpec.hs index f3f3e4b..9d453e6 100644 --- a/test/HaskellWorks/Data/Json/Token/TokenizeSpec.hs +++ b/test/HaskellWorks/Data/Json/Token/TokenizeSpec.hs @@ -10,7 +10,7 @@ import Test.Hspec import qualified Data.Attoparsec.ByteString.Char8 as BC -{-# ANN module ("HLint: ignore Redundant do" :: String) #-} +{- HLINT ignore "Redundant do" -} parseJsonToken' :: ByteString -> Either String (JsonToken String Double) parseJsonToken' = BC.parseOnly parseJsonToken diff --git a/test/HaskellWorks/Data/Json/TypeSpec.hs b/test/HaskellWorks/Data/Json/TypeSpec.hs index 5679ad2..091a2ea 100644 --- a/test/HaskellWorks/Data/Json/TypeSpec.hs +++ b/test/HaskellWorks/Data/Json/TypeSpec.hs @@ -1,7 +1,5 @@ -{-# LANGUAGE ExplicitForAll #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE NoMonomorphismRestriction #-} {-# LANGUAGE OverloadedStrings #-} @@ -28,9 +26,9 @@ import qualified HaskellWorks.Data.Json.Standard.Cursor.Fast as FAST import qualified HaskellWorks.Data.Json.Standard.Cursor.Slow as SLOW import qualified HaskellWorks.Data.TreeCursor as TC -{-# ANN module ("HLint: ignore Redundant do" :: String) #-} -{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-} -{-# ANN module ("HLint: ignore Redundant bracket" :: String) #-} +{- HLINT ignore "Reduce duplication" -} +{- HLINT ignore "Redundant bracket" -} +{- HLINT ignore "Redundant do" -} fc = TC.firstChild ns = TC.nextSibling @@ -41,11 +39,7 @@ spec = describe "HaskellWorks.Data.Json.Succinct.CursorSpec" $ do genSpec "CsPoppy" FAST.fromString genSpec :: forall t u. - ( Eq t - , Show t - , Select1 t - , Eq u - , Show u + ( Select1 t , Rank0 u , Rank1 u , BalancedParens u diff --git a/test/HaskellWorks/Data/Json/ValueSpec.hs b/test/HaskellWorks/Data/Json/ValueSpec.hs index 36d762a..77ef4db 100644 --- a/test/HaskellWorks/Data/Json/ValueSpec.hs +++ b/test/HaskellWorks/Data/Json/ValueSpec.hs @@ -1,7 +1,5 @@ -{-# LANGUAGE ExplicitForAll #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE InstanceSigs #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE NoMonomorphismRestriction #-} {-# LANGUAGE OverloadedStrings #-} @@ -30,9 +28,9 @@ import qualified HaskellWorks.Data.Json.Standard.Cursor.Fast as FAST import qualified HaskellWorks.Data.Json.Standard.Cursor.Slow as SLOW import qualified HaskellWorks.Data.TreeCursor as TC -{-# ANN module ("HLint: ignore Redundant do" :: String) #-} -{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-} -{-# ANN module ("HLint: ignore Redundant bracket" :: String) #-} +{- HLINT ignore "Reduce duplication" -} +{- HLINT ignore "Redundant bracket" -} +{- HLINT ignore "Redundant do" -} fc = TC.firstChild ns = TC.nextSibling