| Copyright | Copyright © 2015 PivotCloud, Inc. |
|---|---|
| License | MIT |
| Maintainer | Lars Kuhtz <lkuhtz@pivotmail.com> |
| Stability | experimental |
| Safe Haskell | None |
| Language | Haskell2010 |
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.
- data LeftMonoidalUpdate α
- leftMonoidalUpdate :: Iso (LeftMonoidalUpdate α) (LeftMonoidalUpdate β) α β
- fromLeftMonoidalUpdate :: Iso α β (LeftMonoidalUpdate α) (LeftMonoidalUpdate β)
- pLeftMonoidalUpdate :: Monoid α => Parser α -> MParser α
- data RightMonoidalUpdate α
- rightMonoidalUpdate :: Iso (RightMonoidalUpdate α) (RightMonoidalUpdate β) α β
- fromRightMonoidalUpdate :: Iso α β (RightMonoidalUpdate α) (RightMonoidalUpdate β)
- pRightMonoidalUpdate :: Monoid α => Parser α -> MParser α
Documentation
data LeftMonoidalUpdate α 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.
Instances
| Monoid α => Monoid (LeftMonoidalUpdate α) | |
| (FromJSON α, Monoid α) => FromJSON (LeftMonoidalUpdate α -> LeftMonoidalUpdate α) |
leftMonoidalUpdate :: Iso (LeftMonoidalUpdate α) (LeftMonoidalUpdate β) α β 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" % ofromLeftMonoidalUpdate :: Iso α β (LeftMonoidalUpdate α) (LeftMonoidalUpdate β) Source
This is the same as from leftMonoidalUpdate but doesn't depend on
the lens Library.
pLeftMonoidalUpdate :: Monoid α => Parser α -> MParser α 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) Rightdata RightMonoidalUpdate α 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.
Instances
| Monoid α => Monoid (RightMonoidalUpdate α) | |
| (FromJSON α, Monoid α) => FromJSON (RightMonoidalUpdate α -> RightMonoidalUpdate α) |
rightMonoidalUpdate :: Iso (RightMonoidalUpdate α) (RightMonoidalUpdate β) α β Source
Update a value by appending on the right. See leftMonoidalUpdate for
an usage example.
fromRightMonoidalUpdate :: Iso α β (RightMonoidalUpdate α) (RightMonoidalUpdate β) Source
This is the same as from rightMonoidalUpdate but doesn't depend on
the lens Library.
pRightMonoidalUpdate :: Monoid α => Parser α -> MParser α Source
Update a value by appending on the right. See pLeftMonoidalUpdate
for an usage example.