polyvariadic: Creation and application of polyvariadic functions

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain] [Publish]

Creation and application of polyvariadic functions, see the docs for usage and examples

[Skip to Readme]


Change log ChangeLog.md
Dependencies base (>=4.7 && <4.11), containers (>=0.1 && <0.6), semigroups (>=0.18 && <0.19) [details]
License BSD-3-Clause
Copyright (C) Francesco Gazzetta 2017
Author Francesco Gazzetta
Maintainer francygazz@gmail.com
Category Data
Home page https://github.com/fgaz/polyvariadic
Source repo head: git clone git://github.com/fgaz/polyvariadic.git
Uploaded by fgaz at 2017-12-19T17:37:40Z




Maintainer's Corner

For package maintainers and hackage trustees

Readme for polyvariadic-

[back to package description]


Creation and application of polyvariadic functions

Build Status Hackage

For example, the classic printf:

{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
import Data.Function.Polyvariadic
import Data.Accumulator

magicChar = '%'
notMagicChar = (/= magicChar)

data PrintfAccum = PrintfAccum { done :: String, todo :: String }

instance Show x => Accumulator PrintfAccum x where
  accumulate x (PrintfAccum done (_:todo)) = PrintfAccum
                                              (done ++ show x ++ takeWhile notMagicChar todo)
                                              (dropWhile notMagicChar todo)
  accumulate _ acc = acc

printf' str = polyvariadic
               (PrintfAccum (takeWhile notMagicChar str) (dropWhile notMagicChar str))
>>> printf' "aaa%bbb%ccc%ddd" "TEST" 123 True