diff options
-rw-r--r-- | provider/posts/beuteltier-2.lhs | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/provider/posts/beuteltier-2.lhs b/provider/posts/beuteltier-2.lhs index bca4c86..d5e0294 100644 --- a/provider/posts/beuteltier-2.lhs +++ b/provider/posts/beuteltier-2.lhs | |||
@@ -53,6 +53,9 @@ mostly of the canonical invocations of | |||
53 | > import Data.Map (Map) | 53 | > import Data.Map (Map) |
54 | > import qualified Data.Map as Map | 54 | > import qualified Data.Map as Map |
55 | > | 55 | > |
56 | > import Data.Set (Set) | ||
57 | > import qualified Data.Set as Set | ||
58 | > | ||
56 | > import Data.Hashable (Hashable(..), hashUsing) | 59 | > import Data.Hashable (Hashable(..), hashUsing) |
57 | > | 60 | > |
58 | > import Data.Monoid ((<>)) | 61 | > import Data.Monoid ((<>)) |
@@ -66,10 +69,10 @@ Quite often we find ourselves in the position that we want to alter some small p | |||
66 | complicated structure. We would therefore like to write the following: | 69 | complicated structure. We would therefore like to write the following: |
67 | 70 | ||
68 | ~~~ {.haskell .numberLines} | 71 | ~~~ {.haskell .numberLines} |
69 | updateFoo :: Monad m => Foo -> m Foo | 72 | updateFoo :: Foo -> Monad Foo |
70 | updateFoo = alter $ do | 73 | updateFoo x = alter x $ do |
71 | bar <~ constructNewBarInM | 74 | bar <~ (constructNewBar :: Monad Bar) |
72 | buz .= makeConstantBuz | 75 | buz .= (makeConstantBuz :: Buz) |
73 | ~~~ | 76 | ~~~ |
74 | 77 | ||
75 | The definitions below allow us not only to do so, but also provide some convenience | 78 | The definitions below allow us not only to do so, but also provide some convenience |
@@ -113,7 +116,7 @@ Sometimes we just really want to translate an `ObjectGen` to an `Object`. | |||
113 | > oMeta .= return (obj ^. oMeta') | 116 | > oMeta .= return (obj ^. oMeta') |
114 | 117 | ||
115 | We expect implementations of `insert` to perform what we call nubbing. That is removal of | 118 | We expect implementations of `insert` to perform what we call nubbing. That is removal of |
116 | 'Object's that are, in some sense, `Equivalent` to the new one we´re currently | 119 | `Object`s that are, in some sense, `Equivalent` to the new one we´re currently |
117 | inserting. Thus we provide a definition of what we mean, when we say `Equivalent`. | 120 | inserting. Thus we provide a definition of what we mean, when we say `Equivalent`. |
118 | 121 | ||
119 | > class Equivalent a where | 122 | > class Equivalent a where |
@@ -150,6 +153,9 @@ all objects sharing a hash to determine true equivalency. | |||
150 | > -- | Two 'Object's´ hashes are a first indication of whether they are 'Equivalent' | 153 | > -- | Two 'Object's´ hashes are a first indication of whether they are 'Equivalent' |
151 | > instance Hashable Object where | 154 | > instance Hashable Object where |
152 | > hashWithSalt = hashUsing $ \a -> (a ^. oMeta', Map.keys $ content a) | 155 | > hashWithSalt = hashUsing $ \a -> (a ^. oMeta', Map.keys $ content a) |
156 | > | ||
157 | > instance Hashable MetaData where | ||
158 | > hashWithSalt = hashUsing $ Set.toList . (^. mTags) | ||
153 | > | 159 | > |
154 | > content :: Object -> Map SubObjectName (Maybe SubObject) | 160 | > content :: Object -> Map SubObjectName (Maybe SubObject) |
155 | > content obj = promised obj <> actual obj | 161 | > content obj = promised obj <> actual obj |