feat(users/Profpatsch/MyPrelude): add Arg

Change-Id: I218562c924489ff9cba783dc88ecb8e777c8aac3
Reviewed-on: https://cl.tvl.fyi/c/depot/+/11656
Reviewed-by: Profpatsch <mail@profpatsch.de>
Autosubmit: Profpatsch <mail@profpatsch.de>
Tested-by: BuildkiteCI
This commit is contained in:
Profpatsch 2024-05-13 16:02:05 +02:00 committed by clbot
parent 53163de836
commit 5ea5dff597
3 changed files with 36 additions and 0 deletions

View file

@ -7,6 +7,7 @@ pkgs.haskellPackages.mkDerivation {
src = depot.users.Profpatsch.exactSource ./. [ src = depot.users.Profpatsch.exactSource ./. [
./my-prelude.cabal ./my-prelude.cabal
./src/Aeson.hs ./src/Aeson.hs
./src/Arg.hs
./src/AtLeast.hs ./src/AtLeast.hs
./src/MyPrelude.hs ./src/MyPrelude.hs
./src/Test.hs ./src/Test.hs

View file

@ -59,6 +59,7 @@ library
exposed-modules: exposed-modules:
MyPrelude MyPrelude
Aeson Aeson
Arg
AtLeast AtLeast
Test Test
Postgres.Decoder Postgres.Decoder

View file

@ -0,0 +1,34 @@
module Arg where
import Data.String (IsString)
import GHC.Exts (IsList)
import GHC.TypeLits (Symbol)
-- | Wrap a function argument into this helper to give it a better description for the caller without disturbing the callsite too much.
--
-- This has instances for IsString and Num, meaning if the caller is usually a string or number literal, it should Just Work.
--
-- e.g.
--
-- @
-- myFoo :: Arg "used as the name in error message" Text -> IO ()
-- myFoo (Arg name) = …
-- @
--
-- Will display the description in the inferred type of the callsite.
--
-- Due to IsString you can call @myFoo@ like
--
-- @myFoo "name in error"@
--
-- This is mostly intended for literals, if you want to wrap arbitrary data, use @Label@.
newtype Arg (description :: Symbol) a = Arg {unArg :: a}
deriving newtype
( Show,
Eq,
IsString,
IsList,
Num,
Monoid,
Semigroup
)