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 | 
