configuration-tools-0.3.1: Tools for specifying and parsing configurations

CopyrightCopyright © 2015 PivotCloud Inc.
LicenseMIT
MaintainerLars Kuhtz <lkuhtz@pivotmail.com>
Stabilityexperimental
Safe HaskellNone
LanguageHaskell2010

Configuration.Utils.Monoid

Description

The distinction between appending on the left and appending on the right is important for monoids that are sensitive to ordering such as List. It is also of relevance for monoids with set semantics with non-extensional equality such as HashMap.

Synopsis

Documentation

leftMonoidalUpdate :: Iso (LeftMonoidalUpdate a) (LeftMonoidalUpdate b) a b Source #

Update a value by appending on the left.

newtype RoutingTable = RoutingTable { _routingTableMap ∷ HashMap T.Text T.Text }

$(makeLenses ''RoutingTable)

instance FromJSON (RoutingTable → RoutingTable) where
    parseJSON = withObject "RoutingTable" $ \o → id
        <$< routingTableMap . from leftMonoidalUpdate %.: "route_map" % o

fromLeftMonoidalUpdate :: Iso a b (LeftMonoidalUpdate a) (LeftMonoidalUpdate b) Source #

This is the same as from leftMonoidalUpdate but doesn't depend on the lens Library.

pLeftMonoidalUpdate :: Monoid a => Parser a -> MParser a Source #

Update a value by appending on the left.

newtype RoutingTable = RoutingTable { _routingTableMap ∷ HashMap T.Text T.Text }

$(makeLenses ''RoutingTable)

pRoutingTable ∷ MParser RoutingTable
pRoutingTable = routingTableMap %:: pLeftMonoidalUpdate pRoute
  where
    pRoute = option (eitherReader readRoute)
        % long "route"
        <> help "add a route to the routing table; the APIROUTE part must not contain a colon character"
        <> metavar "APIROUTE:APIURL"

    readRoute s = case break (== ':') s of
        (a,':':b) → fmapL T.unpack $ do
            validateNonEmpty "APIROUTE" a
            validateHttpOrHttpsUrl "APIURL" b
            return $ HM.singleton (T.pack a) (T.pack b)
        _ → Left "missing colon between APIROUTE and APIURL"

    fmapL f = either (Left . f) Right

rightMonoidalUpdate :: Iso (RightMonoidalUpdate a) (RightMonoidalUpdate b) a b Source #

Update a value by appending on the right. See leftMonoidalUpdate for an usage example.

fromRightMonoidalUpdate :: Iso a b (RightMonoidalUpdate a) (RightMonoidalUpdate b) Source #

This is the same as from rightMonoidalUpdate but doesn't depend on the lens Library.

pRightMonoidalUpdate :: Monoid a => Parser a -> MParser a Source #

Update a value by appending on the right. See pLeftMonoidalUpdate for an usage example.