module ELynx.Data.Character.Character
(
Character (..)
, fromChar
, toChar
, fromString
, toString
, CharacterX (..)
, isGap
, CharacterI (..)
, isUnknown
, isIUPAC
, isStandard
, convert
) where
import qualified Data.Set as S
import Data.Vector.Unboxed.Base (Unbox)
import Data.Word8 (Word8)
import ELynx.Tools.ByteString (c2w, w2c)
class (Show a, Read a, Eq a, Ord a, Enum a, Bounded a, Unbox a) => Character a where
toWord :: a -> Word8
fromWord :: Word8 -> a
toChar :: Character a => a -> Char
toChar = w2c . toWord
fromChar :: Character a => Char -> a
fromChar = fromWord . c2w
toString :: Character a => [a] -> String
toString = map toChar
fromString :: Character a => String -> [a]
fromString = map fromChar
class Character a => CharacterX a where
gap :: a
isGap :: CharacterX a => a -> Bool
isGap c = c == gap
class CharacterX a => CharacterI a where
unknown :: a
iupac :: [a]
toStandard :: a -> [a]
isUnknown :: CharacterI a => a -> Bool
isUnknown c = c == unknown
iupacLookup :: CharacterI a => S.Set a
iupacLookup = S.fromList iupac
isIUPAC :: CharacterI a => a -> Bool
isIUPAC c = c `S.member` iupacLookup
isStandard :: CharacterI a => a -> Bool
isStandard c = not $ isIUPAC c
convert :: (Character a, Character b) => a -> b
convert = fromWord . toWord