MyNixOS website logo
Description

GHC Plugin for non-empty lists.

GHC Plugin for compile-time transformation of list literals to NonEmpty lists.

{-# OPTIONS_GHC -fplugin=GhcPluginNonEmpty #-}import Data.List.NonEmpty (NonEmpty)
portsToListen :: NonEmpty Int
portsToListen = [8000, 8080, 8081]

See README.md for more details.

ghc-plugin-non-empty

GitHub CI Hackage MPL-2.0 license

GHC Compiler Plugin for automatically converting list literals to the NonEmpty type from the Data.List.NonEmpty module in base.

This plugin checks statically defined list literals and transforms them into NonEmpty lists during compile time. In other words, it provides compile-time guarantees for non-emptiness checks and allows the following expression to type-check:

portsToListen :: NonEmpty Int
portsToListen = [8000, 8080, 8081]

Compare to usage without the plugin:

portsToListen :: NonEmpty Int
portsToListen = 8000 :| [8080, 8081]

ℹ️ DISCLAIMER:ghc-plugin-non-empty is developed and maintained in free time by volunteers. The development may continue for decades or may stop tomorrow. You can use GitHub Sponsorship to support the development of this project.

How to use?

ghc-plugin-non-empty is compatible with the following GHC versions — supported versions

In order to start using ghc-plugin-non-empty in your project, you'll need to set it up with these steps:

  1. Add the dependency on ghc-plugin-non-empty in your project's .cabal file. For this, you should modify the build-depends section according to the below section:

    build-depends:
      , base                 ^>= LATEST_SUPPORTED_BASE
      , ghc-plugin-non-empty ^>= LATEST_VERSION
    
  2. To use this package, refer to the below example.

    {-# OPTIONS_GHC -fplugin=GhcPluginNonEmpty #-}
    
    module Main (main) where
    
    import Data.List.NonEmpty (NonEmpty)
    
    exampleList :: NonEmpty Int
    exampleList = [100, 5, 74]
    
    main :: IO ()
    main = print exampleList
    

For contributors

Check CONTRIBUTING.md for contributing guidelines.

To build the project and run the tests, use cabal:

cabal build all
cabal test --enable-tests --test-show-details=direct
Metadata

Version

0.0.0.0

License

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows