Copyright | Copyright © 2015 PivotCloud Inc. |
---|---|
License | MIT |
Maintainer | Lars Kuhtz <lkuhtz@pivotmail.com> |
Stability | experimental |
Safe Haskell | None |
Language | Haskell2010 |
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
- data LeftMonoidalUpdate a
- leftMonoidalUpdate :: Iso (LeftMonoidalUpdate a) (LeftMonoidalUpdate b) a b
- fromLeftMonoidalUpdate :: Iso a b (LeftMonoidalUpdate a) (LeftMonoidalUpdate b)
- pLeftMonoidalUpdate :: Monoid a => Parser a -> MParser a
- pLeftSemigroupalUpdate :: Semigroup a => Parser a -> MParser a
- data RightMonoidalUpdate a
- rightMonoidalUpdate :: Iso (RightMonoidalUpdate a) (RightMonoidalUpdate b) a b
- fromRightMonoidalUpdate :: Iso a b (RightMonoidalUpdate a) (RightMonoidalUpdate b)
- pRightMonoidalUpdate :: Monoid a => Parser a -> MParser a
- pRightSemigroupalUpdate :: Semigroup a => Parser a -> MParser a
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.
Instances
Semigroup a => Semigroup (LeftMonoidalUpdate a) Source # | |
Defined in Configuration.Utils.Monoid (<>) :: LeftMonoidalUpdate a -> LeftMonoidalUpdate a -> LeftMonoidalUpdate a # sconcat :: NonEmpty (LeftMonoidalUpdate a) -> LeftMonoidalUpdate a # stimes :: Integral b => b -> LeftMonoidalUpdate a -> LeftMonoidalUpdate a # | |
Monoid a => Monoid (LeftMonoidalUpdate a) Source # | |
Defined in Configuration.Utils.Monoid mempty :: LeftMonoidalUpdate a # mappend :: LeftMonoidalUpdate a -> LeftMonoidalUpdate a -> LeftMonoidalUpdate a # mconcat :: [LeftMonoidalUpdate a] -> LeftMonoidalUpdate a # | |
(FromJSON a, Monoid a) => FromJSON (LeftMonoidalUpdate a -> LeftMonoidalUpdate a) Source # | |
Defined in Configuration.Utils.Monoid parseJSON :: Value -> Parser (LeftMonoidalUpdate a -> LeftMonoidalUpdate a) # parseJSONList :: Value -> Parser [LeftMonoidalUpdate a -> LeftMonoidalUpdate a] # |
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 Semigroup
s 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.
Instances
Semigroup a => Semigroup (RightMonoidalUpdate a) Source # | |
Defined in Configuration.Utils.Monoid (<>) :: RightMonoidalUpdate a -> RightMonoidalUpdate a -> RightMonoidalUpdate a # sconcat :: NonEmpty (RightMonoidalUpdate a) -> RightMonoidalUpdate a # stimes :: Integral b => b -> RightMonoidalUpdate a -> RightMonoidalUpdate a # | |
Monoid a => Monoid (RightMonoidalUpdate a) Source # | |
Defined in Configuration.Utils.Monoid mempty :: RightMonoidalUpdate a # mappend :: RightMonoidalUpdate a -> RightMonoidalUpdate a -> RightMonoidalUpdate a # mconcat :: [RightMonoidalUpdate a] -> RightMonoidalUpdate a # | |
(FromJSON a, Monoid a) => FromJSON (RightMonoidalUpdate a -> RightMonoidalUpdate a) Source # | |
Defined in Configuration.Utils.Monoid parseJSON :: Value -> Parser (RightMonoidalUpdate a -> RightMonoidalUpdate a) # parseJSONList :: Value -> Parser [RightMonoidalUpdate a -> RightMonoidalUpdate a] # |
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 Semigroup
s instead. Using this
parser requires the input to have at least one copy (say, for flags that can
be passed multiple times).