Monoid package:configuration-tools

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.
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.
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.
This is the same as from leftMonoidalUpdate but doesn't depend on the lens Library.
This is the same as from rightMonoidalUpdate but doesn't depend on the lens Library.
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
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
Update a value by appending on the right. See pLeftMonoidalUpdate for an usage example.
Update a value by appending on the right. See leftMonoidalUpdate for an usage example.