{-# 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 =>
  -- | The given number to convert.
  i ->
  -- | A Unicode character that represents this digit.
  Char
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 =>
  -- | The given number to convert.
  i ->
  -- | 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.
  Maybe Char
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