module Sound.HTagLib.Type
( Title
, mkTitle
, getTitle
, Artist
, mkArtist
, getArtist
, Album
, mkAlbum
, getAlbum
, Comment
, mkComment
, getComment
, Genre
, mkGenre
, getGenre
, Year
, mkYear
, getYear
, TrackNumber
, mkTrackNumber
, getTrackNumber
, Duration
, mkDuration
, getDuration
, BitRate
, mkBitRate
, getBitRate
, SampleRate
, mkSampleRate
, getSampleRate
, Channels
, mkChannels
, getChannels )
where
import Data.String
newtype Title = Title
{
getTitle :: String }
deriving (Show, Eq, Ord)
instance IsString Title where
fromString = mkTitle
mkTitle :: String -> Title
mkTitle = Title . avoidNulls
newtype Artist = Artist
{
getArtist :: String }
deriving (Show, Eq, Ord)
instance IsString Artist where
fromString = mkArtist
mkArtist :: String -> Artist
mkArtist = Artist . avoidNulls
newtype Album = Album
{
getAlbum :: String }
deriving (Show, Eq, Ord)
instance IsString Album where
fromString = mkAlbum
mkAlbum :: String -> Album
mkAlbum = Album . avoidNulls
newtype Comment = Comment
{
getComment :: String }
deriving (Show, Eq, Ord)
instance IsString Comment where
fromString = mkComment
mkComment :: String -> Comment
mkComment = Comment . avoidNulls
newtype Genre = Genre
{
getGenre :: String }
deriving (Show, Eq, Ord)
instance IsString Genre where
fromString = mkGenre
mkGenre :: String -> Genre
mkGenre = Genre . avoidNulls
newtype Year = Year
{
getYear :: Int }
deriving (Show, Eq, Ord)
mkYear :: Int -> Maybe Year
mkYear = fmap Year . atLeast 1
newtype TrackNumber = TrackNumber
{
getTrackNumber :: Int }
deriving (Show, Eq, Ord)
mkTrackNumber :: Int -> Maybe TrackNumber
mkTrackNumber = fmap TrackNumber . atLeast 1
newtype Duration = Duration
{
getDuration :: Int }
deriving (Show, Eq, Ord)
mkDuration :: Int -> Maybe Duration
mkDuration = fmap Duration . atLeast 0
newtype BitRate = BitRate
{
getBitRate :: Int }
deriving (Show, Eq, Ord)
mkBitRate :: Int -> Maybe BitRate
mkBitRate = fmap BitRate . atLeast 0
newtype SampleRate = SampleRate
{
getSampleRate :: Int }
deriving (Show, Eq, Ord)
mkSampleRate :: Int -> Maybe SampleRate
mkSampleRate = fmap SampleRate . atLeast 1
newtype Channels = Channels
{
getChannels :: Int }
deriving (Show, Eq, Ord)
mkChannels :: Int -> Maybe Channels
mkChannels = fmap Channels . atLeast 1
avoidNulls :: String -> String
avoidNulls = let f x = if x == '\0' then ' ' else x in fmap f
atLeast :: Int -> Int -> Maybe Int
atLeast a b = if b >= a then Just b else Nothing