configuration-tools-0.6.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

data LeftMonoidalUpdate a Source #

Update a value by appending on the left. Under normal circumstances you'll never use this type directly but only its FromJSON instance. See the leftMonoidalUpdate for an example.

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) → first 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"

    first f = either (Left . f) Right

pLeftSemigroupalUpdate :: Semigroup a => Parser a -> MParser a Source #

Like pLeftMonoidalUpdate, but works for Semigroups instead. Using this parser requires the input to have at least one copy (say, for flags that can be passed multiple times).

data RightMonoidalUpdate a Source #

Update a value by appending on the right. Under normal circumstances you'll never use this type directly but only its FromJSON instance. See the leftMonoidalUpdate for an example.

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.

pRightSemigroupalUpdate :: Semigroup a => Parser a -> MParser a Source #

Like pRightMonoidalUpdate, but works for Semigroups instead. Using this parser requires the input to have at least one copy (say, for flags that can be passed multiple times).