Fingerprint the 'Buuka' and use it as context
This commit is contained in:
@ -9,35 +9,44 @@ module Data.Buuka
|
||||
|
||||
, insert
|
||||
, elements
|
||||
, fingerprint
|
||||
)
|
||||
where
|
||||
|
||||
import Database.Migrations
|
||||
|
||||
import Data.Aeson
|
||||
import Data.Bits
|
||||
(finiteBitSize, shiftR, (.&.))
|
||||
import Data.Hashable
|
||||
(Hashable, hash)
|
||||
import GHC.Generics
|
||||
(Generic)
|
||||
|
||||
import Control.Monad.Reader
|
||||
import Control.Monad.State
|
||||
|
||||
import Data.ByteString
|
||||
(ByteString)
|
||||
import qualified Data.ByteString as B
|
||||
|
||||
newtype URL = URL String
|
||||
deriving stock (Show, Eq, Generic, Ord)
|
||||
deriving newtype (ToJSON, FromJSON, FromJSONKey, ToJSONKey)
|
||||
deriving newtype (ToJSON, FromJSON, FromJSONKey, ToJSONKey, Hashable)
|
||||
|
||||
data BuukaEntry
|
||||
= BuukaEntry { url :: URL
|
||||
, title :: Maybe String
|
||||
}
|
||||
deriving stock (Show, Eq, Generic)
|
||||
deriving anyclass (ToJSON, FromJSON)
|
||||
deriving anyclass (ToJSON, FromJSON, Hashable)
|
||||
|
||||
instance SafeJSON BuukaEntry where
|
||||
type Version BuukaEntry = 0
|
||||
|
||||
newtype Buuka = Buuka [BuukaEntry]
|
||||
deriving stock (Show, Eq)
|
||||
deriving newtype (Semigroup, Monoid, FromJSON, ToJSON)
|
||||
deriving newtype (Semigroup, Monoid, FromJSON, ToJSON, Hashable)
|
||||
|
||||
insert :: BuukaEntry -> Buuka -> Buuka
|
||||
insert e (Buuka b) = Buuka (e : b)
|
||||
@ -45,6 +54,14 @@ insert e (Buuka b) = Buuka (e : b)
|
||||
elements :: Buuka -> [BuukaEntry]
|
||||
elements (Buuka b) = b
|
||||
|
||||
-- | Create a (non-cryptographic) hash out of the 'Buuka'
|
||||
fingerprint :: Buuka -> ByteString
|
||||
fingerprint = toBS . hash
|
||||
where
|
||||
toBS x =
|
||||
let bs = finiteBitSize x
|
||||
in B.pack [fromIntegral ((x `shiftR` s) .&. 255) | s <- [0..bs - 1]]
|
||||
|
||||
instance SafeJSON Buuka where
|
||||
type Version Buuka = 0
|
||||
|
||||
|
Reference in New Issue
Block a user