{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE TypeApplications #-}

-- |
-- Module      : Data.Char.Braille
-- Description : A module used to render Braille characters in unicode.
-- Maintainer  : hapytexeu+gh@gmail.com
-- Stability   : experimental
-- Portability : POSIX
--
-- Unicode has a Braille segment for Braille with six dot cells, and a segment for Braille with eight dot cells, this module aims to make it more convenient to render such characters.
module Data.Char.Braille
  ( -- * Datastructures to store the state of the Braille character.
    Braille6 (Braille6, top, middle, bottom),
    Braille (Braille, row1, row2, row3, row4),

    -- * Converting 'Braille6' to 'Braille'
    toBraille,
    toBraille',

    -- * Rendering Braille characters.
    braille6,
    braille,

    -- * Converting a character to 'Braille'
    fromBraille6,
    fromBraille6',
    fromBraille,
    fromBraille',
  )
where

import Control.DeepSeq (NFData, NFData1)
import Data.Bits (shiftL, shiftR, testBit, (.&.), (.|.))
import Data.Bool (bool)
import Data.Char (chr, ord)
import Data.Char.Block (Row (Row))
import Data.Char.Core (MirrorHorizontal (mirrorHorizontal), MirrorVertical (mirrorVertical), UnicodeCharacter (fromUnicodeChar, fromUnicodeChar', isInCharRange, toUnicodeChar), UnicodeText (isInTextRange), generateIsInTextRange')
import Data.Data (Data)
import Data.Functor.Classes (Eq1 (liftEq), Ord1 (liftCompare))
import Data.Hashable (Hashable)
import Data.Hashable.Lifted (Hashable1)
#if __GLASGOW_HASKELL__ < 803
import Data.Semigroup((<>))
#endif

import GHC.Generics (Generic, Generic1)
import Test.QuickCheck.Arbitrary (Arbitrary (arbitrary), Arbitrary1 (liftArbitrary), arbitrary1)

-- | A datastructure to render Braille patterns with six dots cells.
data Braille6 a = Braille6
  { -- | The state of the top row of the Braille character.
    forall a. Braille6 a -> Row a
top :: Row a,
    -- | The state of the middle row of the Braille character.
    forall a. Braille6 a -> Row a
middle :: Row a,
    -- | The state of the bottom row of the Braille character.
    forall a. Braille6 a -> Row a
bottom :: Row a
  }
  deriving (Braille6 a
forall a. a -> a -> Bounded a
forall a. Bounded a => Braille6 a
maxBound :: Braille6 a
$cmaxBound :: forall a. Bounded a => Braille6 a
minBound :: Braille6 a
$cminBound :: forall a. Bounded a => Braille6 a
Bounded, Braille6 a -> DataType
Braille6 a -> Constr
forall {a}. Data a => Typeable (Braille6 a)
forall a. Data a => Braille6 a -> DataType
forall a. Data a => Braille6 a -> Constr
forall a.
Data a =>
(forall b. Data b => b -> b) -> Braille6 a -> Braille6 a
forall a u.
Data a =>
Int -> (forall d. Data d => d -> u) -> Braille6 a -> u
forall a u.
Data a =>
(forall d. Data d => d -> u) -> Braille6 a -> [u]
forall a r r'.
Data a =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Braille6 a -> r
forall a r r'.
Data a =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Braille6 a -> r
forall a (m :: * -> *).
(Data a, Monad m) =>
(forall d. Data d => d -> m d) -> Braille6 a -> m (Braille6 a)
forall a (m :: * -> *).
(Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Braille6 a -> m (Braille6 a)
forall a (c :: * -> *).
Data a =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Braille6 a)
forall a (c :: * -> *).
Data a =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Braille6 a -> c (Braille6 a)
forall a (t :: * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (Braille6 a))
forall a (t :: * -> * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Braille6 a))
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Braille6 a)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Braille6 a -> c (Braille6 a)
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (Braille6 a))
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Braille6 a -> m (Braille6 a)
$cgmapMo :: forall a (m :: * -> *).
(Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Braille6 a -> m (Braille6 a)
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Braille6 a -> m (Braille6 a)
$cgmapMp :: forall a (m :: * -> *).
(Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Braille6 a -> m (Braille6 a)
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Braille6 a -> m (Braille6 a)
$cgmapM :: forall a (m :: * -> *).
(Data a, Monad m) =>
(forall d. Data d => d -> m d) -> Braille6 a -> m (Braille6 a)
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Braille6 a -> u
$cgmapQi :: forall a u.
Data a =>
Int -> (forall d. Data d => d -> u) -> Braille6 a -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> Braille6 a -> [u]
$cgmapQ :: forall a u.
Data a =>
(forall d. Data d => d -> u) -> Braille6 a -> [u]
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Braille6 a -> r
$cgmapQr :: forall a r r'.
Data a =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Braille6 a -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Braille6 a -> r
$cgmapQl :: forall a r r'.
Data a =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Braille6 a -> r
gmapT :: (forall b. Data b => b -> b) -> Braille6 a -> Braille6 a
$cgmapT :: forall a.
Data a =>
(forall b. Data b => b -> b) -> Braille6 a -> Braille6 a
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Braille6 a))
$cdataCast2 :: forall a (t :: * -> * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Braille6 a))
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (Braille6 a))
$cdataCast1 :: forall a (t :: * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (Braille6 a))
dataTypeOf :: Braille6 a -> DataType
$cdataTypeOf :: forall a. Data a => Braille6 a -> DataType
toConstr :: Braille6 a -> Constr
$ctoConstr :: forall a. Data a => Braille6 a -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Braille6 a)
$cgunfold :: forall a (c :: * -> *).
Data a =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Braille6 a)
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Braille6 a -> c (Braille6 a)
$cgfoldl :: forall a (c :: * -> *).
Data a =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Braille6 a -> c (Braille6 a)
Data, Braille6 a -> Braille6 a -> Bool
forall a. Eq a => Braille6 a -> Braille6 a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Braille6 a -> Braille6 a -> Bool
$c/= :: forall a. Eq a => Braille6 a -> Braille6 a -> Bool
== :: Braille6 a -> Braille6 a -> Bool
$c== :: forall a. Eq a => Braille6 a -> Braille6 a -> Bool
Eq, forall a. Eq a => a -> Braille6 a -> Bool
forall a. Num a => Braille6 a -> a
forall a. Ord a => Braille6 a -> a
forall m. Monoid m => Braille6 m -> m
forall a. Braille6 a -> Bool
forall a. Braille6 a -> Int
forall a. Braille6 a -> [a]
forall a. (a -> a -> a) -> Braille6 a -> a
forall m a. Monoid m => (a -> m) -> Braille6 a -> m
forall b a. (b -> a -> b) -> b -> Braille6 a -> b
forall a b. (a -> b -> b) -> b -> Braille6 a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: forall a. Num a => Braille6 a -> a
$cproduct :: forall a. Num a => Braille6 a -> a
sum :: forall a. Num a => Braille6 a -> a
$csum :: forall a. Num a => Braille6 a -> a
minimum :: forall a. Ord a => Braille6 a -> a
$cminimum :: forall a. Ord a => Braille6 a -> a
maximum :: forall a. Ord a => Braille6 a -> a
$cmaximum :: forall a. Ord a => Braille6 a -> a
elem :: forall a. Eq a => a -> Braille6 a -> Bool
$celem :: forall a. Eq a => a -> Braille6 a -> Bool
length :: forall a. Braille6 a -> Int
$clength :: forall a. Braille6 a -> Int
null :: forall a. Braille6 a -> Bool
$cnull :: forall a. Braille6 a -> Bool
toList :: forall a. Braille6 a -> [a]
$ctoList :: forall a. Braille6 a -> [a]
foldl1 :: forall a. (a -> a -> a) -> Braille6 a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> Braille6 a -> a
foldr1 :: forall a. (a -> a -> a) -> Braille6 a -> a
$cfoldr1 :: forall a. (a -> a -> a) -> Braille6 a -> a
foldl' :: forall b a. (b -> a -> b) -> b -> Braille6 a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> Braille6 a -> b
foldl :: forall b a. (b -> a -> b) -> b -> Braille6 a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> Braille6 a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> Braille6 a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> Braille6 a -> b
foldr :: forall a b. (a -> b -> b) -> b -> Braille6 a -> b
$cfoldr :: forall a b. (a -> b -> b) -> b -> Braille6 a -> b
foldMap' :: forall m a. Monoid m => (a -> m) -> Braille6 a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> Braille6 a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> Braille6 a -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> Braille6 a -> m
fold :: forall m. Monoid m => Braille6 m -> m
$cfold :: forall m. Monoid m => Braille6 m -> m
Foldable, forall a b. a -> Braille6 b -> Braille6 a
forall a b. (a -> b) -> Braille6 a -> Braille6 b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> Braille6 b -> Braille6 a
$c<$ :: forall a b. a -> Braille6 b -> Braille6 a
fmap :: forall a b. (a -> b) -> Braille6 a -> Braille6 b
$cfmap :: forall a b. (a -> b) -> Braille6 a -> Braille6 b
Functor, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Braille6 a) x -> Braille6 a
forall a x. Braille6 a -> Rep (Braille6 a) x
$cto :: forall a x. Rep (Braille6 a) x -> Braille6 a
$cfrom :: forall a x. Braille6 a -> Rep (Braille6 a) x
Generic, forall a. Rep1 Braille6 a -> Braille6 a
forall a. Braille6 a -> Rep1 Braille6 a
forall k (f :: k -> *).
(forall (a :: k). f a -> Rep1 f a)
-> (forall (a :: k). Rep1 f a -> f a) -> Generic1 f
$cto1 :: forall a. Rep1 Braille6 a -> Braille6 a
$cfrom1 :: forall a. Braille6 a -> Rep1 Braille6 a
Generic1, Braille6 a -> Braille6 a -> Bool
Braille6 a -> Braille6 a -> Ordering
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {a}. Ord a => Eq (Braille6 a)
forall a. Ord a => Braille6 a -> Braille6 a -> Bool
forall a. Ord a => Braille6 a -> Braille6 a -> Ordering
forall a. Ord a => Braille6 a -> Braille6 a -> Braille6 a
min :: Braille6 a -> Braille6 a -> Braille6 a
$cmin :: forall a. Ord a => Braille6 a -> Braille6 a -> Braille6 a
max :: Braille6 a -> Braille6 a -> Braille6 a
$cmax :: forall a. Ord a => Braille6 a -> Braille6 a -> Braille6 a
>= :: Braille6 a -> Braille6 a -> Bool
$c>= :: forall a. Ord a => Braille6 a -> Braille6 a -> Bool
> :: Braille6 a -> Braille6 a -> Bool
$c> :: forall a. Ord a => Braille6 a -> Braille6 a -> Bool
<= :: Braille6 a -> Braille6 a -> Bool
$c<= :: forall a. Ord a => Braille6 a -> Braille6 a -> Bool
< :: Braille6 a -> Braille6 a -> Bool
$c< :: forall a. Ord a => Braille6 a -> Braille6 a -> Bool
compare :: Braille6 a -> Braille6 a -> Ordering
$ccompare :: forall a. Ord a => Braille6 a -> Braille6 a -> Ordering
Ord, ReadPrec [Braille6 a]
ReadPrec (Braille6 a)
ReadS [Braille6 a]
forall a. Read a => ReadPrec [Braille6 a]
forall a. Read a => ReadPrec (Braille6 a)
forall a. Read a => Int -> ReadS (Braille6 a)
forall a. Read a => ReadS [Braille6 a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Braille6 a]
$creadListPrec :: forall a. Read a => ReadPrec [Braille6 a]
readPrec :: ReadPrec (Braille6 a)
$creadPrec :: forall a. Read a => ReadPrec (Braille6 a)
readList :: ReadS [Braille6 a]
$creadList :: forall a. Read a => ReadS [Braille6 a]
readsPrec :: Int -> ReadS (Braille6 a)
$creadsPrec :: forall a. Read a => Int -> ReadS (Braille6 a)
Read, Int -> Braille6 a -> ShowS
forall a. Show a => Int -> Braille6 a -> ShowS
forall a. Show a => [Braille6 a] -> ShowS
forall a. Show a => Braille6 a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Braille6 a] -> ShowS
$cshowList :: forall a. Show a => [Braille6 a] -> ShowS
show :: Braille6 a -> String
$cshow :: forall a. Show a => Braille6 a -> String
showsPrec :: Int -> Braille6 a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Braille6 a -> ShowS
Show, Functor Braille6
Foldable Braille6
forall (t :: * -> *).
Functor t
-> Foldable t
-> (forall (f :: * -> *) a b.
    Applicative f =>
    (a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a. Monad m => Braille6 (m a) -> m (Braille6 a)
forall (f :: * -> *) a.
Applicative f =>
Braille6 (f a) -> f (Braille6 a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Braille6 a -> m (Braille6 b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Braille6 a -> f (Braille6 b)
sequence :: forall (m :: * -> *) a. Monad m => Braille6 (m a) -> m (Braille6 a)
$csequence :: forall (m :: * -> *) a. Monad m => Braille6 (m a) -> m (Braille6 a)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Braille6 a -> m (Braille6 b)
$cmapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Braille6 a -> m (Braille6 b)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
Braille6 (f a) -> f (Braille6 a)
$csequenceA :: forall (f :: * -> *) a.
Applicative f =>
Braille6 (f a) -> f (Braille6 a)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Braille6 a -> f (Braille6 b)
$ctraverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Braille6 a -> f (Braille6 b)
Traversable)

instance Eq1 Braille6 where
  liftEq :: forall a b. (a -> b -> Bool) -> Braille6 a -> Braille6 b -> Bool
liftEq a -> b -> Bool
cmp ~(Braille6 Row a
ta Row a
ma Row a
ba) ~(Braille6 Row b
tb Row b
mb Row b
bb) = Row a -> Row b -> Bool
cmp' Row a
ta Row b
tb Bool -> Bool -> Bool
&& Row a -> Row b -> Bool
cmp' Row a
ma Row b
mb Bool -> Bool -> Bool
&& Row a -> Row b -> Bool
cmp' Row a
ba Row b
bb
    where
      cmp' :: Row a -> Row b -> Bool
cmp' = forall (f :: * -> *) a b.
Eq1 f =>
(a -> b -> Bool) -> f a -> f b -> Bool
liftEq a -> b -> Bool
cmp

instance Hashable1 Braille6

instance Hashable a => Hashable (Braille6 a)

instance MirrorHorizontal (Braille6 a) where
  mirrorHorizontal :: Braille6 a -> Braille6 a
mirrorHorizontal (Braille6 Row a
a Row a
b Row a
c) = forall a. Row a -> Row a -> Row a -> Braille6 a
Braille6 Row a
c Row a
b Row a
a

instance MirrorVertical (Braille6 a) where
  mirrorVertical :: Braille6 a -> Braille6 a
mirrorVertical (Braille6 Row a
a Row a
b Row a
c) = forall a. Row a -> Row a -> Row a -> Braille6 a
Braille6 (forall a. MirrorVertical a => a -> a
mirrorVertical Row a
a) (forall a. MirrorVertical a => a -> a
mirrorVertical Row a
b) (forall a. MirrorVertical a => a -> a
mirrorVertical Row a
c)

instance NFData a => NFData (Braille6 a)

instance NFData1 Braille6

instance Ord1 Braille6 where
  liftCompare :: forall a b.
(a -> b -> Ordering) -> Braille6 a -> Braille6 b -> Ordering
liftCompare a -> b -> Ordering
cmp ~(Braille6 Row a
ta Row a
ma Row a
ba) ~(Braille6 Row b
tb Row b
mb Row b
bb) = Row a -> Row b -> Ordering
cmp' Row a
ta Row b
tb forall a. Semigroup a => a -> a -> a
<> Row a -> Row b -> Ordering
cmp' Row a
ma Row b
mb forall a. Semigroup a => a -> a -> a
<> Row a -> Row b -> Ordering
cmp' Row a
ba Row b
bb
    where
      cmp' :: Row a -> Row b -> Ordering
cmp' = forall (f :: * -> *) a b.
Ord1 f =>
(a -> b -> Ordering) -> f a -> f b -> Ordering
liftCompare a -> b -> Ordering
cmp

-- | A datastructure to render Braille patterns with eight dots cells.
data Braille a = Braille
  { -- | The state of the top row of the Braille character.
    forall a. Braille a -> Row a
row1 :: Row a,
    -- | The state of the second row of the Braille character.
    forall a. Braille a -> Row a
row2 :: Row a,
    -- | The state of the third row of the Braille character.
    forall a. Braille a -> Row a
row3 :: Row a,
    -- | The state of the bottom row of the Braille character.
    forall a. Braille a -> Row a
row4 :: Row a
  }
  deriving (Braille a
forall a. a -> a -> Bounded a
forall a. Bounded a => Braille a
maxBound :: Braille a
$cmaxBound :: forall a. Bounded a => Braille a
minBound :: Braille a
$cminBound :: forall a. Bounded a => Braille a
Bounded, Braille a -> DataType
Braille a -> Constr
forall {a}. Data a => Typeable (Braille a)
forall a. Data a => Braille a -> DataType
forall a. Data a => Braille a -> Constr
forall a.
Data a =>
(forall b. Data b => b -> b) -> Braille a -> Braille a
forall a u.
Data a =>
Int -> (forall d. Data d => d -> u) -> Braille a -> u
forall a u.
Data a =>
(forall d. Data d => d -> u) -> Braille a -> [u]
forall a r r'.
Data a =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Braille a -> r
forall a r r'.
Data a =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Braille a -> r
forall a (m :: * -> *).
(Data a, Monad m) =>
(forall d. Data d => d -> m d) -> Braille a -> m (Braille a)
forall a (m :: * -> *).
(Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Braille a -> m (Braille a)
forall a (c :: * -> *).
Data a =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Braille a)
forall a (c :: * -> *).
Data a =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Braille a -> c (Braille a)
forall a (t :: * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (Braille a))
forall a (t :: * -> * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Braille a))
forall a.
Typeable a
-> (forall (c :: * -> *).
    (forall d b. Data d => c (d -> b) -> d -> c b)
    -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Braille a)
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Braille a -> c (Braille a)
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (Braille a))
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Braille a -> m (Braille a)
$cgmapMo :: forall a (m :: * -> *).
(Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Braille a -> m (Braille a)
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> Braille a -> m (Braille a)
$cgmapMp :: forall a (m :: * -> *).
(Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> Braille a -> m (Braille a)
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> Braille a -> m (Braille a)
$cgmapM :: forall a (m :: * -> *).
(Data a, Monad m) =>
(forall d. Data d => d -> m d) -> Braille a -> m (Braille a)
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Braille a -> u
$cgmapQi :: forall a u.
Data a =>
Int -> (forall d. Data d => d -> u) -> Braille a -> u
gmapQ :: forall u. (forall d. Data d => d -> u) -> Braille a -> [u]
$cgmapQ :: forall a u.
Data a =>
(forall d. Data d => d -> u) -> Braille a -> [u]
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Braille a -> r
$cgmapQr :: forall a r r'.
Data a =>
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> Braille a -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Braille a -> r
$cgmapQl :: forall a r r'.
Data a =>
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> Braille a -> r
gmapT :: (forall b. Data b => b -> b) -> Braille a -> Braille a
$cgmapT :: forall a.
Data a =>
(forall b. Data b => b -> b) -> Braille a -> Braille a
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Braille a))
$cdataCast2 :: forall a (t :: * -> * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c (Braille a))
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c (Braille a))
$cdataCast1 :: forall a (t :: * -> *) (c :: * -> *).
(Data a, Typeable t) =>
(forall d. Data d => c (t d)) -> Maybe (c (Braille a))
dataTypeOf :: Braille a -> DataType
$cdataTypeOf :: forall a. Data a => Braille a -> DataType
toConstr :: Braille a -> Constr
$ctoConstr :: forall a. Data a => Braille a -> Constr
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Braille a)
$cgunfold :: forall a (c :: * -> *).
Data a =>
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Braille a)
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Braille a -> c (Braille a)
$cgfoldl :: forall a (c :: * -> *).
Data a =>
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Braille a -> c (Braille a)
Data, Braille a -> Braille a -> Bool
forall a. Eq a => Braille a -> Braille a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Braille a -> Braille a -> Bool
$c/= :: forall a. Eq a => Braille a -> Braille a -> Bool
== :: Braille a -> Braille a -> Bool
$c== :: forall a. Eq a => Braille a -> Braille a -> Bool
Eq, forall a. Eq a => a -> Braille a -> Bool
forall a. Num a => Braille a -> a
forall a. Ord a => Braille a -> a
forall m. Monoid m => Braille m -> m
forall a. Braille a -> Bool
forall a. Braille a -> Int
forall a. Braille a -> [a]
forall a. (a -> a -> a) -> Braille a -> a
forall m a. Monoid m => (a -> m) -> Braille a -> m
forall b a. (b -> a -> b) -> b -> Braille a -> b
forall a b. (a -> b -> b) -> b -> Braille a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: forall a. Num a => Braille a -> a
$cproduct :: forall a. Num a => Braille a -> a
sum :: forall a. Num a => Braille a -> a
$csum :: forall a. Num a => Braille a -> a
minimum :: forall a. Ord a => Braille a -> a
$cminimum :: forall a. Ord a => Braille a -> a
maximum :: forall a. Ord a => Braille a -> a
$cmaximum :: forall a. Ord a => Braille a -> a
elem :: forall a. Eq a => a -> Braille a -> Bool
$celem :: forall a. Eq a => a -> Braille a -> Bool
length :: forall a. Braille a -> Int
$clength :: forall a. Braille a -> Int
null :: forall a. Braille a -> Bool
$cnull :: forall a. Braille a -> Bool
toList :: forall a. Braille a -> [a]
$ctoList :: forall a. Braille a -> [a]
foldl1 :: forall a. (a -> a -> a) -> Braille a -> a
$cfoldl1 :: forall a. (a -> a -> a) -> Braille a -> a
foldr1 :: forall a. (a -> a -> a) -> Braille a -> a
$cfoldr1 :: forall a. (a -> a -> a) -> Braille a -> a
foldl' :: forall b a. (b -> a -> b) -> b -> Braille a -> b
$cfoldl' :: forall b a. (b -> a -> b) -> b -> Braille a -> b
foldl :: forall b a. (b -> a -> b) -> b -> Braille a -> b
$cfoldl :: forall b a. (b -> a -> b) -> b -> Braille a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> Braille a -> b
$cfoldr' :: forall a b. (a -> b -> b) -> b -> Braille a -> b
foldr :: forall a b. (a -> b -> b) -> b -> Braille a -> b
$cfoldr :: forall a b. (a -> b -> b) -> b -> Braille a -> b
foldMap' :: forall m a. Monoid m => (a -> m) -> Braille a -> m
$cfoldMap' :: forall m a. Monoid m => (a -> m) -> Braille a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> Braille a -> m
$cfoldMap :: forall m a. Monoid m => (a -> m) -> Braille a -> m
fold :: forall m. Monoid m => Braille m -> m
$cfold :: forall m. Monoid m => Braille m -> m
Foldable, forall a b. a -> Braille b -> Braille a
forall a b. (a -> b) -> Braille a -> Braille b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> Braille b -> Braille a
$c<$ :: forall a b. a -> Braille b -> Braille a
fmap :: forall a b. (a -> b) -> Braille a -> Braille b
$cfmap :: forall a b. (a -> b) -> Braille a -> Braille b
Functor, forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Braille a) x -> Braille a
forall a x. Braille a -> Rep (Braille a) x
$cto :: forall a x. Rep (Braille a) x -> Braille a
$cfrom :: forall a x. Braille a -> Rep (Braille a) x
Generic, forall a. Rep1 Braille a -> Braille a
forall a. Braille a -> Rep1 Braille a
forall k (f :: k -> *).
(forall (a :: k). f a -> Rep1 f a)
-> (forall (a :: k). Rep1 f a -> f a) -> Generic1 f
$cto1 :: forall a. Rep1 Braille a -> Braille a
$cfrom1 :: forall a. Braille a -> Rep1 Braille a
Generic1, Braille a -> Braille a -> Bool
Braille a -> Braille a -> Ordering
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {a}. Ord a => Eq (Braille a)
forall a. Ord a => Braille a -> Braille a -> Bool
forall a. Ord a => Braille a -> Braille a -> Ordering
forall a. Ord a => Braille a -> Braille a -> Braille a
min :: Braille a -> Braille a -> Braille a
$cmin :: forall a. Ord a => Braille a -> Braille a -> Braille a
max :: Braille a -> Braille a -> Braille a
$cmax :: forall a. Ord a => Braille a -> Braille a -> Braille a
>= :: Braille a -> Braille a -> Bool
$c>= :: forall a. Ord a => Braille a -> Braille a -> Bool
> :: Braille a -> Braille a -> Bool
$c> :: forall a. Ord a => Braille a -> Braille a -> Bool
<= :: Braille a -> Braille a -> Bool
$c<= :: forall a. Ord a => Braille a -> Braille a -> Bool
< :: Braille a -> Braille a -> Bool
$c< :: forall a. Ord a => Braille a -> Braille a -> Bool
compare :: Braille a -> Braille a -> Ordering
$ccompare :: forall a. Ord a => Braille a -> Braille a -> Ordering
Ord, ReadPrec [Braille a]
ReadPrec (Braille a)
ReadS [Braille a]
forall a. Read a => ReadPrec [Braille a]
forall a. Read a => ReadPrec (Braille a)
forall a. Read a => Int -> ReadS (Braille a)
forall a. Read a => ReadS [Braille a]
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
readListPrec :: ReadPrec [Braille a]
$creadListPrec :: forall a. Read a => ReadPrec [Braille a]
readPrec :: ReadPrec (Braille a)
$creadPrec :: forall a. Read a => ReadPrec (Braille a)
readList :: ReadS [Braille a]
$creadList :: forall a. Read a => ReadS [Braille a]
readsPrec :: Int -> ReadS (Braille a)
$creadsPrec :: forall a. Read a => Int -> ReadS (Braille a)
Read, Int -> Braille a -> ShowS
forall a. Show a => Int -> Braille a -> ShowS
forall a. Show a => [Braille a] -> ShowS
forall a. Show a => Braille a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Braille a] -> ShowS
$cshowList :: forall a. Show a => [Braille a] -> ShowS
show :: Braille a -> String
$cshow :: forall a. Show a => Braille a -> String
showsPrec :: Int -> Braille a -> ShowS
$cshowsPrec :: forall a. Show a => Int -> Braille a -> ShowS
Show, Functor Braille
Foldable Braille
forall (t :: * -> *).
Functor t
-> Foldable t
-> (forall (f :: * -> *) a b.
    Applicative f =>
    (a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a. Monad m => Braille (m a) -> m (Braille a)
forall (f :: * -> *) a.
Applicative f =>
Braille (f a) -> f (Braille a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Braille a -> m (Braille b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Braille a -> f (Braille b)
sequence :: forall (m :: * -> *) a. Monad m => Braille (m a) -> m (Braille a)
$csequence :: forall (m :: * -> *) a. Monad m => Braille (m a) -> m (Braille a)
mapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Braille a -> m (Braille b)
$cmapM :: forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Braille a -> m (Braille b)
sequenceA :: forall (f :: * -> *) a.
Applicative f =>
Braille (f a) -> f (Braille a)
$csequenceA :: forall (f :: * -> *) a.
Applicative f =>
Braille (f a) -> f (Braille a)
traverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Braille a -> f (Braille b)
$ctraverse :: forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Braille a -> f (Braille b)
Traversable)

instance Eq1 Braille where
  liftEq :: forall a b. (a -> b -> Bool) -> Braille a -> Braille b -> Bool
liftEq a -> b -> Bool
cmp ~(Braille Row a
a1 Row a
a2 Row a
a3 Row a
a4) ~(Braille Row b
b1 Row b
b2 Row b
b3 Row b
b4) = Row a -> Row b -> Bool
cmp' Row a
a1 Row b
b1 Bool -> Bool -> Bool
&& Row a -> Row b -> Bool
cmp' Row a
a2 Row b
b2 Bool -> Bool -> Bool
&& Row a -> Row b -> Bool
cmp' Row a
a3 Row b
b3 Bool -> Bool -> Bool
&& Row a -> Row b -> Bool
cmp' Row a
a4 Row b
b4
    where
      cmp' :: Row a -> Row b -> Bool
cmp' = forall (f :: * -> *) a b.
Eq1 f =>
(a -> b -> Bool) -> f a -> f b -> Bool
liftEq a -> b -> Bool
cmp

instance Hashable1 Braille

instance Hashable a => Hashable (Braille a)

instance MirrorHorizontal (Braille a) where
  mirrorHorizontal :: Braille a -> Braille a
mirrorHorizontal (Braille Row a
a Row a
b Row a
c Row a
d) = forall a. Row a -> Row a -> Row a -> Row a -> Braille a
Braille Row a
d Row a
c Row a
b Row a
a

instance MirrorVertical (Braille a) where
  mirrorVertical :: Braille a -> Braille a
mirrorVertical (Braille Row a
a Row a
b Row a
c Row a
d) = forall a. Row a -> Row a -> Row a -> Row a -> Braille a
Braille (forall a. MirrorVertical a => a -> a
mirrorVertical Row a
a) (forall a. MirrorVertical a => a -> a
mirrorVertical Row a
b) (forall a. MirrorVertical a => a -> a
mirrorVertical Row a
c) (forall a. MirrorVertical a => a -> a
mirrorVertical Row a
d)

instance NFData a => NFData (Braille a)

instance NFData1 Braille

instance Ord1 Braille where
  liftCompare :: forall a b.
(a -> b -> Ordering) -> Braille a -> Braille b -> Ordering
liftCompare a -> b -> Ordering
cmp ~(Braille Row a
a1 Row a
a2 Row a
a3 Row a
a4) ~(Braille Row b
b1 Row b
b2 Row b
b3 Row b
b4) = Row a -> Row b -> Ordering
cmp' Row a
a1 Row b
b1 forall a. Semigroup a => a -> a -> a
<> Row a -> Row b -> Ordering
cmp' Row a
a2 Row b
b2 forall a. Semigroup a => a -> a -> a
<> Row a -> Row b -> Ordering
cmp' Row a
a3 Row b
b3 forall a. Semigroup a => a -> a -> a
<> Row a -> Row b -> Ordering
cmp' Row a
a4 Row b
b4
    where
      cmp' :: Row a -> Row b -> Ordering
cmp' = forall (f :: * -> *) a b.
Ord1 f =>
(a -> b -> Ordering) -> f a -> f b -> Ordering
liftCompare a -> b -> Ordering
cmp

-- | Convert a 'Braille6' value to a 'Braille' character, by putting in a given
-- value at the two values at the bottom row.
toBraille' ::
  -- | The value to put in the cells of the bottom row.
  a ->
  -- | The given 'Braille6' value to convert.
  Braille6 a ->
  -- | A 'Braille' value that uses as bottom two values given as first parameter.
  Braille a
toBraille' :: forall a. a -> Braille6 a -> Braille a
toBraille' a
d (Braille6 Row a
r0 Row a
r1 Row a
r2) = forall a. Row a -> Row a -> Row a -> Row a -> Braille a
Braille Row a
r0 Row a
r1 Row a
r2 (forall a. a -> a -> Row a
Row a
d a
d)

-- | Convert a 'Braille6' value to a 'Braille6' character by setting the bottom
-- row with two 'False' values.
toBraille ::
  -- | The given 'Braille6' value to convert.
  Braille6 Bool ->
  -- | A 'Braille' value that uses as bottom two times 'False'.
  Braille Bool
toBraille :: Braille6 Bool -> Braille Bool
toBraille = forall a. a -> Braille6 a -> Braille a
toBraille' Bool
False

-- | Convert the given 'Char'acter to a 'Braille' object of 'Bool's. If the
-- given character is not a /Braille/ character, the result is unspecified.
fromBraille' ::
  -- | The given 'Char'acter to convert.
  Char ->
  -- | The corresponding 'Braille' object of 'Bool's.
  Braille Bool
fromBraille' :: Char -> Braille Bool
fromBraille' Char
c = forall a. Row a -> Row a -> Row a -> Row a -> Braille a
Braille (Int -> Row Bool
go Int
0x00) (Int -> Row Bool
go Int
0x01) (Int -> Row Bool
go Int
0x02) (forall a. a -> a -> Row a
Row (Int -> Bool
tB' Int
0x03) (Int -> Bool
tB' Int
0x04))
  where
    b :: Int
b = Char -> Int
ord Char
c forall a. Bits a => a -> a -> a
.&. Int
0xff
    tB :: Int -> Bool
tB = forall a. Bits a => a -> Int -> Bool
testBit Int
b
    tB' :: Int -> Bool
tB' = forall a. Bits a => a -> Int -> Bool
testBit (forall a. Bits a => a -> Int -> a
shiftR Int
b Int
3)
    go :: Int -> Row Bool
go Int
n = forall a. a -> a -> Row a
Row (Int -> Bool
tB Int
n) (Int -> Bool
tB' Int
n)

-- | Convert the given 'Char'acter to a 'Braille6' object of 'Bool's. If the
-- given character is not a /Braille/ character, or a /Braille/ character where
-- the lowest row contains filled dots, then the result is unspecified.
fromBraille6' ::
  -- | The given 'Char'acter to convert.
  Char ->
  -- | The corresponding 'Braille6' object of 'Bool's.
  Braille6 Bool
fromBraille6' :: Char -> Braille6 Bool
fromBraille6' Char
c = forall a. Row a -> Row a -> Row a -> Braille6 a
Braille6 (Int -> Row Bool
go Int
0x00) (Int -> Row Bool
go Int
0x01) (Int -> Row Bool
go Int
0x02)
  where
    b :: Int
b = Char -> Int
ord Char
c forall a. Bits a => a -> a -> a
.&. Int
0x3f
    go :: Int -> Row Bool
go Int
n = forall a. a -> a -> Row a
Row (forall a. Bits a => a -> Int -> Bool
testBit Int
b Int
n) (forall a. Bits a => a -> Int -> Bool
testBit (forall a. Bits a => a -> Int -> a
shiftR Int
b Int
3) Int
n)

-- | Convert the given 'Char'acter to a 'Braille' object of 'Bool's wrapped in
-- a 'Just'. If the given character is not a /Braille/ character, 'Nothing' is
-- returned.
fromBraille ::
  -- | The given 'Char'acter to convert.
  Char ->
  -- | The equivalent 'Braille6' object of 'Bool's wrapped in a 'Just' if it exists; 'Nothing' otherwise.
  Maybe (Braille Bool)
fromBraille :: Char -> Maybe (Braille Bool)
fromBraille Char
c
  | Char
'\x2800' forall a. Ord a => a -> a -> Bool
> Char
c Bool -> Bool -> Bool
|| Char
c forall a. Ord a => a -> a -> Bool
> Char
'\x28ff' = forall a. Maybe a
Nothing
  | Bool
otherwise = forall a. a -> Maybe a
Just (Char -> Braille Bool
fromBraille' Char
c)

-- | Convert the given 'Char'acter to a 'Braille6' object of 'Bool's wrapped in
-- a 'Just'. If the given character is not a /Braille/ character, or a /Braille/
-- character where the lowest row contains filled dots, 'Nothing' is returned.
fromBraille6 ::
  -- | The given 'Char'acter to convert.
  Char ->
  -- | The equivalent 'Braille6' object of 'Bool's wrapped in a 'Just' if it exists; 'Nothing' otherwise.
  Maybe (Braille6 Bool)
fromBraille6 :: Char -> Maybe (Braille6 Bool)
fromBraille6 Char
c
  | Char
'\x2800' forall a. Ord a => a -> a -> Bool
> Char
c Bool -> Bool -> Bool
|| Char
c forall a. Ord a => a -> a -> Bool
> Char
'\x283f' = forall a. Maybe a
Nothing
  | Bool
otherwise = forall a. a -> Maybe a
Just (Char -> Braille6 Bool
fromBraille6' Char
c)

instance Arbitrary a => Arbitrary (Braille6 a) where
  arbitrary :: Gen (Braille6 a)
arbitrary = forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => Gen (f a)
arbitrary1

instance Arbitrary1 Braille6 where
  liftArbitrary :: forall a. Gen a -> Gen (Braille6 a)
liftArbitrary Gen a
arb = forall a. Row a -> Row a -> Row a -> Braille6 a
Braille6 forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Row a)
arb' forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (Row a)
arb' forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (Row a)
arb'
    where
      arb' :: Gen (Row a)
arb' = forall (f :: * -> *) a. Arbitrary1 f => Gen a -> Gen (f a)
liftArbitrary Gen a
arb

instance Arbitrary a => Arbitrary (Braille a) where
  arbitrary :: Gen (Braille a)
arbitrary = forall (f :: * -> *) a. (Arbitrary1 f, Arbitrary a) => Gen (f a)
arbitrary1

instance Arbitrary1 Braille where
  liftArbitrary :: forall a. Gen a -> Gen (Braille a)
liftArbitrary Gen a
arb = forall a. Row a -> Row a -> Row a -> Row a -> Braille a
Braille forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen (Row a)
arb' forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (Row a)
arb' forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (Row a)
arb' forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Gen (Row a)
arb'
    where
      arb' :: Gen (Row a)
arb' = forall (f :: * -> *) a. Arbitrary1 f => Gen a -> Gen (f a)
liftArbitrary Gen a
arb

_rowValue' :: Int -> Row Bool -> Int
_rowValue' :: Int -> Row Bool -> Int
_rowValue' Int
d (Row Bool
b0 Bool
b1) = forall a. a -> a -> Bool -> a
bool Int
0 Int
1 Bool
b0 forall a. Bits a => a -> a -> a
.|. forall a. a -> a -> Bool -> a
bool Int
0 Int
d Bool
b1

_rowValue :: Row Bool -> Int
_rowValue :: Row Bool -> Int
_rowValue = Int -> Row Bool -> Int
_rowValue' Int
8

-- | Convert the given 'Braille6' value to a unicode character representing this
-- Braille value.
braille6 :: Braille6 Bool -> Char
braille6 :: Braille6 Bool -> Char
braille6 = Braille Bool -> Char
braille forall b c a. (b -> c) -> (a -> b) -> a -> c
. Braille6 Bool -> Braille Bool
toBraille

-- | Convert the given 'Braille' value to a unicode character representing this
-- braille value.
braille :: Braille Bool -> Char
braille :: Braille Bool -> Char
braille (Braille Row Bool
r1 Row Bool
r2 Row Bool
r3 Row Bool
r4) = Int -> Char
chr (Int
0x2800 forall a. Bits a => a -> a -> a
.|. Row Bool -> Int
_rowValue Row Bool
r1 forall a. Bits a => a -> a -> a
.|. forall a. Bits a => a -> Int -> a
shiftL (Row Bool -> Int
_rowValue Row Bool
r2) Int
1 forall a. Bits a => a -> a -> a
.|. forall a. Bits a => a -> Int -> a
shiftL (Row Bool -> Int
_rowValue Row Bool
r3) Int
2 forall a. Bits a => a -> a -> a
.|. forall a. Bits a => a -> Int -> a
shiftL (Int -> Row Bool -> Int
_rowValue' Int
2 Row Bool
r4) Int
6)

instance UnicodeCharacter (Braille Bool) where
  toUnicodeChar :: Braille Bool -> Char
toUnicodeChar = Braille Bool -> Char
braille
  fromUnicodeChar :: Char -> Maybe (Braille Bool)
fromUnicodeChar = Char -> Maybe (Braille Bool)
fromBraille
  fromUnicodeChar' :: Char -> Braille Bool
fromUnicodeChar' = Char -> Braille Bool
fromBraille'
  isInCharRange :: Char -> Bool
isInCharRange Char
c = Char
'\x2800' forall a. Ord a => a -> a -> Bool
<= Char
c Bool -> Bool -> Bool
&& Char
c forall a. Ord a => a -> a -> Bool
<= Char
'\x28ff'

instance UnicodeCharacter (Braille6 Bool) where
  toUnicodeChar :: Braille6 Bool -> Char
toUnicodeChar = Braille6 Bool -> Char
braille6
  fromUnicodeChar :: Char -> Maybe (Braille6 Bool)
fromUnicodeChar = Char -> Maybe (Braille6 Bool)
fromBraille6
  fromUnicodeChar' :: Char -> Braille6 Bool
fromUnicodeChar' = Char -> Braille6 Bool
fromBraille6'
  isInCharRange :: Char -> Bool
isInCharRange Char
c = Char
'\x2800' forall a. Ord a => a -> a -> Bool
<= Char
c Bool -> Bool -> Bool
&& Char
c forall a. Ord a => a -> a -> Bool
<= Char
'\x283f'

instance UnicodeText (Braille Bool) where
  isInTextRange :: Text -> Bool
isInTextRange = forall a. UnicodeCharacter a => Text -> Bool
generateIsInTextRange' @(Braille Bool)

instance UnicodeText (Braille6 Bool) where
  isInTextRange :: Text -> Bool
isInTextRange = forall a. UnicodeCharacter a => Text -> Bool
generateIsInTextRange' @(Braille6 Bool)