[Haskell-cafe] where to put general-purpose utility functions

David Fox ddssff at gmail.com
Sun Jan 22 19:10:30 CET 2012


I try to create a workflow for this sort of thing.  I create a package
with a name like set-extra, with one module Data.Set.Extra and an
alternative Data.Set module that exports both the old Data.Set and the
symbols in Data.Set.Extra.  Then I email the maintainers of the
Containers package with a suggestion.  After a while I upload
set-extra to hackage if I need to use set-extra in another hackage
package.

On Sat, Jan 21, 2012 at 12:20 PM, Joey Hess <joey at kitenet.net> wrote:
> I'm finding a rather unusual problem as I write haskell..
>
> Unlike every other language I've used, large portions of my haskell code
> are turning out to be general-purpose, reusable code. Fully 20% of the
> haskell code I've written for git-annex is general purpose. Now, I came out
> of a decade of perl with maybe 1% reusable code. So I'm sure this is a
> credit to haskell, and not to me.
>
> My problem now is that as I start new projects, I want to have my haskell
> utility functions available, and copying them around is not ideal. So, put
> them on hackage. But where, exactly? It already has several grab bag utility
> libraries. The only one with much traction is MissingH. Using the others
> makes a program have an unusual dependency, which while only a cabal
> install away, would make work for distributions that want to package the
> program. I've ruled out using a couple on that basis. Doesn't encourage me
> to add another one.
>
> My 2000+ lines of reusable code are a grab-bag of generic utility
> functions. Looking them over (see Appendix), I could try to get portions
> into existing libraries on hackage, but it's unlikely I'd find a home
> for most of them, so I'm still left with this problem of what to do.
>
> I wonder if the model used for xmonad-contrib, of a big library package,
> that is very open to additions from contributors, would be helpful here?
>
> John, any interest in moving MissingH in this direction? I get the
> impression it's not otherwise changing much lately, and parts of it are
> becoming naturally obsolete, maybe this could inject some life into it.
> Any other thoughts you have on grab-bag utility libraries on hackage
> also appreciated.
>
> ----
>
> Appendix: A sample of a a few of the better functions from my utility library.
>
>  Some quite generic monadic control functions, few of them truely unique:
>
>  whenM :: Monad m => m Bool -> m () -> m ()   -- also >>?
>  unlessM :: Monad m => m Bool -> m () -> m () -- also >>!
>  firstM :: Monad m => (a -> m Bool) -> [a] -> m (Maybe a)
>
>  A module that exports functions conflicting with partial
>  functions in the Prelude, to avoid them being accidentially
>  used. And provides some alternatives (which overlap somewhat with Safe):
>
>  headMaybe :: [a] -> Maybe a
>  readMaybe :: Read a => String -> Maybe a
>  beginning :: [a] -> [a]
>
>  Various path manipulation functions such as:
>
>  dirContains :: FilePath -> FilePath -> Bool
>  dotfile :: FilePath -> Bool
>  absPath :: FilePath -> IO FilePath
>
>  Other stuff:
>
>  separate :: (a -> Bool) -> [a] -> ([a], [a])
>  catchMaybeIO :: IO a -> IO (Maybe a)
>  readSize :: [Unit] -> String -> Maybe ByteSize -- parses "100 kb" etc
>  format :: Format -> Variables -> String
>  findPubKeys :: String -> IO GpgKeyIds
>  boolSystem :: FilePath -> [CommandParam] -> IO Bool
>  withTempFile :: Template -> (FilePath -> Handle -> IO a) -> IO a
>
> --
> see shy jo
>
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>



More information about the Haskell-Cafe mailing list