identicon
Flexible generation of identicons
https://github.com/mrkkrp/identicon
LTS Haskell 22.33: | 0.2.3 |
Stackage Nightly 2024-09-07: | 0.2.3 |
Latest on Hackage: | 0.2.3 |
identicon-0.2.3@sha256:9ad2e006fc51842d2542d06ac79479f802d22ae1c32b4f7b943594bbdb30c4d5,2350
Module documentation for 0.2.3
Identicon
The package implements a flexible framework for generation of identicons on top of Juicy Pixels.
Quick start
To use the package you usually need the following imports and language extensions:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
import Codec.Picture -- JuicyPixels
import Data.ByteString (ByteString) -- we use strict byte strings
import Data.Proxy
import Data.Word (Word8)
import Graphics.Identicon -- core definitions
import Graphics.Identicon.Primitive -- some visual primitives
You first write a type that represents the total number of bytes your identicon consumes and the number of distinct visual components it has (they are called “layers” in the terminology of the package):
type MyIcon = Identicon 12 :+ Consumer 4 :+ Consumer 4 :+ Consumer 4
Here we have an identicon that needs 12 bytes to be generated. It has three consumers that take 4 bytes each and generate layers, i.e. visual objects (circles, squares, etc.).
The second step is to write implementation of every layer. We can use the
primitives available out-of-the-box, they live in the
Graphics.Identicon.Primitive
module:
myImpl :: Implementation MyIcon
myImpl = Identicon :+ a :+ a :+ a
where
a :: Word8 -> Word8 -> Word8 -> Word8 -> Layer
a r g b n =
rsym $ onGrid 3 3 n $
gradientXY (edge . mid) black (PixelRGB8 r g b)
Every byte is available to the layer-generating function as a distinct
Word8
argument. The type system makes sure that:
-
you consume exactly as many bytes as you promised in the type of your identicon;
-
you have as many layers as you have described in the type of your identicon;
-
every function in your implementation has a correct signature (i.e. it takes as many
Word8
s as promised and produces aLayer
in the end).
Mixing of layers and generation is handled by the library like this:
-- | Here is the function that generates your identicons. It's usually
-- convenient to wrap the 'renderIdenticon' function that comes with the
-- library.
genMyIdenticon ::
-- | Identicon width
Int ->
-- | Identicon height
Int ->
-- | Input (some sort of hash or something)
ByteString ->
-- | Identicon, unless 'ByteString' is too short
Maybe (Image PixelRGB8)
genMyIdenticon = renderIdenticon (Proxy :: Proxy MyIcon) myImpl
For more information head straight to the Haddocks. BTW, I have written a blog post about the package where I demonstrate some pictures generated with it.
Related packages
The following packages are designed to be used with identicon
:
Contribution
Issues, bugs, and questions may be reported in the GitHub issue tracker for this project.
Pull requests are also welcome.
License
Copyright © 2016–present Mark Karpov
Distributed under BSD 3 clause license.
Changes
Identicon 0.2.3
- Maintenance release with newer dependencies.
Identicon 0.2.2
- Improved documentation and metadata.
Identicon 0.2.1
- Added
Semigroup
andMonoid
instances forLayer
.
Identicon 0.2.0
-
Added benchmarks.
-
Renamed
applyWords
toapplyBytes
(the method of type classApplyBytes
).
Identicon 0.1.0
- Initial release.