{-# LANGUAGE FlexibleContexts #-} module Configurator ( convert_newtype_list ) where import Data.Configurator.Types ( Configured, Value( List ), convert ) -- | Configurator helper function. We often want to parse a list of -- \"special\" strings; that is, a list of strings with a little -- more type safett. For example, if we want to read a list of IP -- addresses and a list of usernames, we don't want to confuse the -- two. So, we might wrap them in \"Addresses\" and \"Usernames\" -- newtypes. But then Configurator doesn't know how to parse them -- any more! This function takes the newtype constructor and the -- value and does the obvious thing. -- -- ==== _Examples_ -- -- >>> import Data.Configurator () -- Get predefined 'Configured' instances. -- >>> import Data.Text ( pack ) -- >>> import Data.Configurator.Types ( Value( String ) ) -- >>> newtype Foo = Foo [String] deriving (Show) -- >>> let s1 = String (pack "foo1") -- >>> let s2 = String (pack "foo2") -- >>> let config = List [s1, s2] -- >>> convert_newtype_list Foo config -- Just (Foo ["foo1","foo2"]) -- convert_newtype_list :: Configured b => ([b] -> a) -> Value -> Maybe a convert_newtype_list ctor (List xs) = fmap ctor (mapM convert xs) convert_newtype_list _ _ = Nothing