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