Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/mrkkrp/identicon
Flexible generation of identicons in Haskell
https://github.com/mrkkrp/identicon
haskell identicon
Last synced: 10 days ago
JSON representation
Flexible generation of identicons in Haskell
- Host: GitHub
- URL: https://github.com/mrkkrp/identicon
- Owner: mrkkrp
- License: other
- Created: 2015-12-12T19:16:00.000Z (almost 9 years ago)
- Default Branch: master
- Last Pushed: 2024-06-15T18:29:38.000Z (5 months ago)
- Last Synced: 2024-10-13T10:32:15.793Z (24 days ago)
- Topics: haskell, identicon
- Language: Haskell
- Size: 166 KB
- Stars: 16
- Watchers: 4
- Forks: 1
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE.md
Awesome Lists containing this project
README
# Identicon
[![License BSD3](https://img.shields.io/badge/license-BSD3-brightgreen.svg)](http://opensource.org/licenses/BSD-3-Clause)
[![Hackage](https://img.shields.io/hackage/v/identicon.svg?style=flat)](https://hackage.haskell.org/package/identicon)
[![Stackage Nightly](http://stackage.org/package/identicon/badge/nightly)](http://stackage.org/nightly/package/identicon)
[![Stackage LTS](http://stackage.org/package/identicon/badge/lts)](http://stackage.org/lts/package/identicon)
![CI](https://github.com/mrkkrp/identicon/workflows/CI/badge.svg?branch=master)The package implements a flexible framework for generation of identicons on
top of [Juicy Pixels](https://hackage.haskell.org/package/JuicyPixels).## Quick start
To use the package you usually need the following imports and language
extensions:```haskell
{-# 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):```haskell
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:```haskell
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 a `Layer` in the end).Mixing of layers and generation is handled by the library like this:
```haskell
-- | 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](https://markkarpov.com/post/the-identicon-package.html) about
the package where I demonstrate some pictures generated with it.## Related packages
The following packages are designed to be used with `identicon`:
* [`identicon-style-squares`](https://hackage.haskell.org/package/identicon-style-squares)
## Contribution
Issues, bugs, and questions may be reported in [the GitHub issue tracker for
this project](https://github.com/mrkkrp/identicon/issues).Pull requests are also welcome.
## License
Copyright © 2016–present Mark Karpov
Distributed under BSD 3 clause license.