name: Haskell Cabal

on:
  push:
    branches: [master]
  pull_request:
    branches: [master]
    types: [opened, synchronize]

permissions: {}

jobs:
  test:
    name: CI
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false # don't cancel other jobs if one fails
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
        ghc: [9.2.8, 9.4.8, 9.6.5, 9.8.2, 9.10.1]
    steps:
      - name: Checkout code
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        with:
          persist-credentials: false

      - name: Setup Haskell Compiler (cabal)
        id: setup-haskell
        uses: haskell-actions/setup@dd344bc1cec854a369df8814ce17ef337d6e6170 # v2.7.6
        with:
          ghc-version: ${{ matrix.ghc }}

      - name: Cache dist-newstyle
        uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2
        with:
          path: dist-newstyle
          key: dist-newstyle-${{ matrix.os }}-${{ matrix.ghc }}-${{ hashFiles('**/*.cabal') }}-${{ hashFiles('src*') }}
          restore-keys: |
            dist-newstyle-${{ matrix.os }}-${{ matrix.ghc }}-${{ hashFiles('**/*.cabal') }}-
            dist-newstyle-${{ matrix.os }}-${{ matrix.ghc }}-

      - name: Cache ~/.cabal/store
        uses: actions/cache@6849a6489940f00c2f30c0fb92c6274307ccb58a # v4.1.2
        with:
          path: ${{ steps.setup-haskell.outputs.cabal-store }}
          key: cabal-store-${{ matrix.os }}-${{ matrix.ghc }}-${{ hashFiles('**/*.cabal') }}
          restore-keys: cabal-store-${{ matrix.os }}-${{ matrix.ghc }}-

      - name: Configure to run tests and benchmarks
        run: cabal configure --enable-tests --enable-benchmarks

      - name: Build code
        run: cabal build

      - name: Test code
        run: cabal test

      - name: Benchmark code
        run: cabal bench

      - name: Generate documentation
        run: cabal haddock all