{-# LANGUAGE DeriveDataTypeable #-}
module Data.Encoding.ASCII where

import Control.Throws
import Data.Char
import Data.Encoding.Base
import Data.Encoding.ByteSource
import Data.Encoding.ByteSink
import Data.Encoding.Exception
import Data.Typeable

data ASCII = ASCII deriving (Int -> ASCII -> ShowS
[ASCII] -> ShowS
ASCII -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ASCII] -> ShowS
$cshowList :: [ASCII] -> ShowS
show :: ASCII -> String
$cshow :: ASCII -> String
showsPrec :: Int -> ASCII -> ShowS
$cshowsPrec :: Int -> ASCII -> ShowS
Show,ASCII -> ASCII -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ASCII -> ASCII -> Bool
$c/= :: ASCII -> ASCII -> Bool
== :: ASCII -> ASCII -> Bool
$c== :: ASCII -> ASCII -> Bool
Eq,Typeable)

instance Encoding ASCII where
    decodeChar :: forall (m :: * -> *). ByteSource m => ASCII -> m Char
decodeChar ASCII
_ = do
      Word8
w <- forall (m :: * -> *). ByteSource m => m Word8
fetchWord8
      forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Int -> Char
chr forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral Word8
w
    encodeChar :: forall (m :: * -> *). ByteSink m => ASCII -> Char -> m ()
encodeChar ASCII
enc Char
c
      | forall enc. Encoding enc => enc -> Char -> Bool
encodeable ASCII
enc Char
c = forall (m :: * -> *). ByteSink m => Word8 -> m ()
pushWord8 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Integral a, Num b) => a -> b
fromIntegral forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Int
ord forall a b. (a -> b) -> a -> b
$ Char
c
      | Bool
otherwise        = forall e (m :: * -> *) a. Throws e m => e -> m a
throwException forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> EncodingException
HasNoRepresentation forall a b. (a -> b) -> a -> b
$ Char
c
    encodeable :: ASCII -> Char -> Bool
encodeable ASCII
_ Char
c = Char
c forall a. Ord a => a -> a -> Bool
< Char
'\128'