{-# LANGUAGE Safe #-}

{-|
Module      : Data.Char.Number.Segmented
Description : A module used to render segmented numbers.
Maintainer  : hapytexeu+gh@gmail.com
Stability   : experimental
Portability : POSIX

The <https://www.unicode.org/charts/PDF/U1FB00.pdf 1FB00 Unicode block> contains symbols for legacy computing
and among them segmented digits: &#x1fbf0;&#x1fbf2;&#x1fbf3;&#x1fbf4;&#x1fbf5;&#x1fbf6;&#x1fbf7;&#x1fbf8;&#x1fbf9;
-}

module Data.Char.Number.Segmented (
    -- * Convert numbers to a seven-segmented display
    segmentedDigit, segmentedDigit'
  ) where

import Data.Char(chr)

_segmentedDigit :: Int -> Char
_segmentedDigit :: Int -> Char
_segmentedDigit Int
n
  | Int
0 forall a. Ord a => a -> a -> Bool
<= Int
n Bool -> Bool -> Bool
&& Int
n forall a. Ord a => a -> a -> Bool
<= Int
9 = Int -> Char
chr (Int
0x1fbf0 forall a. Num a => a -> a -> a
+ Int
n)
  | Bool
otherwise = Char
'\xfffd'

-- | Convert the given 'Integral' number to its Unicode character. In case the
-- value is less than @0@, or greater than @9@, the behavior is unspecified.
segmentedDigit' :: Integral i
  => i  -- ^ The given number to convert.
  -> Char  -- ^ A Unicode character that represents this digit.
segmentedDigit' :: forall i. Integral i => i -> Char
segmentedDigit' = Int -> Char
_segmentedDigit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral

-- | Convert the given 'Integral' number to its Unicode character wrapped in a
-- 'Just' data constructor. In case the value is less than @0@ or greater than
-- @9@, 'Nothing' is returned.
segmentedDigit :: Integral i
  => i  -- ^ The given number to convert.
  -> Maybe Char  -- ^ A Unicode character that represents the given digit on a /seven-segment display/ wrapped in a 'Just' data constructor. If the number is outside the @0-9@ range, then 'Nothing' is returned.
segmentedDigit :: forall i. Integral i => i -> Maybe Char
segmentedDigit i
n
  | i
n forall a. Ord a => a -> a -> Bool
>= i
0 Bool -> Bool -> Bool
&& i
n forall a. Ord a => a -> a -> Bool
<= i
9 = forall a. a -> Maybe a
Just (forall i. Integral i => i -> Char
segmentedDigit' i
n)
  | Bool
otherwise = forall a. Maybe a
Nothing