cue-sheet 0.1.0 → 0.1.1
raw patch · 11 files changed
+88/−200 lines, 11 filesdep ~cue-sheetdep ~megaparsecPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: cue-sheet, megaparsec
API changes (from Hackage documentation)
- Text.CueSheet.Types: instance Data.Data.Data Text.CueSheet.Types.CueFile
- Text.CueSheet.Types: instance Data.Data.Data Text.CueSheet.Types.CueFileType
- Text.CueSheet.Types: instance Data.Data.Data Text.CueSheet.Types.CueSheet
- Text.CueSheet.Types: instance Data.Data.Data Text.CueSheet.Types.CueSheetException
- Text.CueSheet.Types: instance Data.Data.Data Text.CueSheet.Types.CueText
- Text.CueSheet.Types: instance Data.Data.Data Text.CueSheet.Types.CueTime
- Text.CueSheet.Types: instance Data.Data.Data Text.CueSheet.Types.CueTrack
- Text.CueSheet.Types: instance Data.Data.Data Text.CueSheet.Types.CueTrackType
- Text.CueSheet.Types: instance Data.Data.Data Text.CueSheet.Types.Isrc
- Text.CueSheet.Types: instance Data.Data.Data Text.CueSheet.Types.Mcn
Files
- CHANGELOG.md +6/−0
- LICENSE.md +1/−1
- README.md +12/−6
- Text/CueSheet.hs +2/−5
- Text/CueSheet/Parser.hs +35/−26
- Text/CueSheet/Render.hs +6/−6
- Text/CueSheet/Types.hs +20/−23
- cue-sheet.cabal +6/−37
- tests/Text/CueSheet/ParserSpec.hs +0/−32
- tests/Text/CueSheet/RenderSpec.hs +0/−32
- tests/Text/CueSheet/TypesSpec.hs +0/−32
CHANGELOG.md view
@@ -1,3 +1,9 @@+## CUE sheet 0.1.1++* Improved documentation.++* Improved the parser using the newest features of Megaparsec 5.3.0.+ ## CUE sheet 0.1.0 * Initial release.
LICENSE.md view
@@ -1,4 +1,4 @@-Copyright © 2016 Mark Karpov+Copyright © 2016–2017 Mark Karpov All rights reserved.
README.md view
@@ -18,21 +18,27 @@ > authoring applications and media players. [Read more on Wikipedia](https://en.wikipedia.org/wiki/Cue_sheet_(computing)).-The description of the format can be-found+The description of the format can be found [here](https://wayback.archive.org/web/20070614044112/http://www.goldenhawk.com/download/cdrwin.pdf),-scroll to Appendix A (it's closest we get to a “specification”).+scroll to the appendix A (it's closest we get to a “specification”). ## Quick start [Read the Haddocks](https://hackage.haskell.org/package/cue-sheet). In short, you parse a `CueSheet` with `parseCueSheet` function and render a-`CueSheet` with `renderCueSheet` function, pretty straightforward, eh? Of-course you still can construct a `CueSheet` manually. The data types are+`CueSheet` with `renderCueSheet` function—pretty straightforward, eh? Of+course, you still can construct a `CueSheet` manually. The data types are defined in such a way that incorrect CUE sheets are impossible to represent. +## Contribution++Issues, bugs, and questions may be reported in [the GitHub issue tracker for+this project](https://github.com/mrkkrp/cue-sheet/issues).++Pull requests are also welcome and will be reviewed quickly.+ ## License -Copyright © 2016 Mark Karpov+Copyright © 2016–2017 Mark Karpov Distributed under BSD 3 clause license.
Text/CueSheet.hs view
@@ -1,9 +1,9 @@ -- | -- Module : Text.CueSheet--- Copyright : © 2016 Mark Karpov+-- Copyright : © 2016–2017 Mark Karpov -- License : BSD 3 clause ----- Maintainer : Mark Karpov <markkarpov@openmailbox.org>+-- Maintainer : Mark Karpov <markkarpov92@gmail.com> -- Stability : experimental -- Portability : portable --@@ -11,9 +11,6 @@ -- types are defined in such a way that incorrect CUE sheets are impossible -- to represent. See 'parseCueSheet' for parsing of plain text CUE sheet -- files and 'renderCueSheet' for rendering.------ If you need to embed\/extract a CUE sheet in a FLAC file, see the @flac@--- package <https://hackage.haskell.org/package/flac>. module Text.CueSheet ( -- * Types
Text/CueSheet/Parser.hs view
@@ -1,13 +1,13 @@ -- | -- Module : Text.CueSheet.Parser--- Copyright : © 2016 Mark Karpov+-- Copyright : © 2016–2017 Mark Karpov -- License : BSD 3 clause ----- Maintainer : Mark Karpov <markkarpov@openmailbox.org>+-- Maintainer : Mark Karpov <markkarpov92@gmail.com> -- Stability : experimental -- Portability : portable ----- The modules contains just CUE sheet parser. You probably want to import+-- The modules contains a CUE sheet parser. You probably want to import -- "Text.CueSheet" instead. {-# LANGUAGE DeriveDataTypeable #-}@@ -26,7 +26,7 @@ import Control.Monad.State.Strict import Data.Data (Data) import Data.List.NonEmpty (NonEmpty (..))-import Data.Maybe (isJust)+import Data.Maybe (isJust, fromMaybe) import Data.Text (Text) import Data.Typeable (Typeable) import GHC.Generics@@ -61,19 +61,28 @@ maybe "" ((++ "\n") . showErrorComponent) mfailure ++ maybe "" (\n -> "in declaration of the track " ++ show n) mtrack --- | Enumeration of all failures that may happen during run of+-- | The enumeration of all failures that may happen during running of -- 'parseCueSheet'. data CueParserFailure = CueParserFail String+ -- ^ 'fail' was used (should not happen) | CueParserIndentation Ordering Pos Pos+ -- ^ Incorrect indentation (should not happen) | CueParserInvalidCatalog Text+ -- ^ We ran into an invalid media catalog number | CueParserInvalidCueText Text+ -- ^ We ran into an invalid text literal | CueParserTrackOutOfOrder+ -- ^ We spotted a track out of order | CueParserInvalidTrackIsrc Text+ -- ^ We ran into an invalid ISRC | CueParserInvalidSeconds Natural+ -- ^ We ran into an invalid number of seconds | CueParserInvalidFrames Natural+ -- ^ We ran into an invalid number of frames | CueParserTrackIndexOutOfOrder+ -- ^ We spotted a track index out of order deriving (Show, Eq, Ord, Data, Typeable, Generic) instance ShowErrorComponent CueParserFailure where@@ -102,7 +111,7 @@ type Parser a = StateT Context (Parsec Eec BL.ByteString) a -- | Context of parsing. This is passed around in 'StateT'. We need all of--- this to signal parse errors on duplicate declaration of things that+-- this to signal parse errors on duplicate declarations of things that -- should only be declared once according to description of the format, to -- validate track numbers, etc. @@ -129,7 +138,7 @@ parseCueSheet :: String -- ^ File name to include in error messages- -> BL.ByteString -- ^ CUE sheet to parsec as a lazy 'BL.ByteString'+ -> BL.ByteString -- ^ CUE sheet to parse as a lazy 'BL.ByteString' -> Either (ParseError Char Eec) CueSheet -- ^ 'ParseError' or result parseCueSheet = parse (contextCueSheet <$> execStateT pCueSheet initContext) where@@ -148,7 +157,7 @@ , contextIndices = [] , contextIndexCount = 0 } --- | Parse a 'CueSheet'. The result is not returned, but written in+-- | Parse a 'CueSheet'. The result is not returned, but written in the -- 'Context'. pCueSheet :: Parser ()@@ -314,7 +323,7 @@ failAtIf already "FLAGS" void (some pFlag) <* eol <* scn --- | A helper data type.+-- | A helper data type for track flags. data CueTrackFlag = DCP | FourCH | PRE | SCMS @@ -439,11 +448,15 @@ withCheck :: (a -> Either CueParserFailure b) -> Parser a -> Parser b withCheck check p = do- r <- lookAhead p+ cpos <- getPosition+ npos <- fromMaybe cpos <$> getNextTokenPosition+ r <- p case check r of- Left custom -> failure E.empty E.empty $- E.singleton (Eec Nothing (Just custom))- Right x -> x <$ p+ Left custom -> do+ setPosition npos+ failure E.empty E.empty $+ E.singleton (Eec Nothing (Just custom))+ Right x -> return x -- | If the first argument is 'True' and we can parse the given command, -- fail pointing at the beginning of the command and report it as something@@ -457,22 +470,18 @@ then empty else p --- | Indicate that the inner parser belongs to declaration of track with--- given index. The index of the track will be added to 'ParseError's to--- help user find where the error happened.+-- | Indicate that the inner parser belongs to declaration of a track with+-- the given index. The index of the track will be added to 'ParseError's to+-- help the user find where the error happened. inTrack :: Natural -> Parser a -> Parser a-inTrack n m = do- r <- observing m- case r of- Left ParseError {..} ->- failure errorUnexpected errorExpected $+inTrack n = region f+ where+ f e@ParseError {..} = if E.null errorCustom- then E.singleton (Eec (Just n) Nothing)- else E.map f errorCustom- where- f (Eec mn x) = Eec (mn <|> Just n) x- Right x -> return x+ then e { errorCustom = E.singleton (Eec (Just n) Nothing) }+ else e { errorCustom = E.map g errorCustom }+ g (Eec mn x) = Eec (mn <|> Just n) x -- | A labelled literal (a helper for common case).
Text/CueSheet/Render.hs view
@@ -1,13 +1,13 @@ -- | -- Module : Text.CueSheet.Render--- Copyright : © 2016 Mark Karpov+-- Copyright : © 2016–2017 Mark Karpov -- License : BSD 3 clause ----- Maintainer : Mark Karpov <markkarpov@openmailbox.org>+-- Maintainer : Mark Karpov <markkarpov92@gmail.com> -- Stability : experimental -- Portability : portable ----- The module contains just CUE sheet render. You probably want to import+-- The module contains a CUE sheet render. You probably want to import -- "Text.CueSheet" instead. {-# LANGUAGE FlexibleContexts #-}@@ -34,7 +34,7 @@ import qualified Data.Text as T import qualified Data.Text.Encoding as T --- | Render a CUE sheet to a lazy 'BL.ByteString'. All 'Text' values in the+-- | Render a CUE sheet as a lazy 'BL.ByteString'. All 'Text' values in the -- 'CueSheet' will be UTF-8 encoded. renderCueSheet@@ -136,7 +136,7 @@ formatNat :: Natural -> Text formatNat = T.pack . printf "%02d" --- | Render file type as per the CUE specs.+-- | Render a 'CueFileType' as per the CUE specs. renderFileType :: CueFileType -> Text renderFileType Binary = "BINARY"@@ -145,7 +145,7 @@ renderFileType Wave = "WAVE" renderFileType MP3 = "MP3" --- | Render track type as per the CUE specs.+-- | Render a 'CueTrackType' as per the CUE specs. renderTrackType :: CueTrackType -> Text renderTrackType CueTrackAudio = "AUDIO"
Text/CueSheet/Types.hs view
@@ -1,18 +1,17 @@ -- | -- Module : Text.CueSheet.Types--- Copyright : © 2016 Mark Karpov+-- Copyright : © 2016–2017 Mark Karpov -- License : BSD 3 clause ----- Maintainer : Mark Karpov <markkarpov@openmailbox.org>+-- Maintainer : Mark Karpov <markkarpov92@gmail.com> -- Stability : experimental -- Portability : portable -- -- Types describing structure of a CUE sheet. You probably want to import -- "Text.CueSheet" instead. -{-# LANGUAGE CPP #-}-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveGeneric #-} module Text.CueSheet.Types ( CueSheet (..)@@ -38,11 +37,9 @@ import Control.Monad.Catch import Data.Char (isDigit, isAscii, isLetter)-import Data.Data (Data) import Data.List.NonEmpty (NonEmpty (..)) import Data.Monoid ((<>)) import Data.Text (Text)-import Data.Typeable (Typeable) import GHC.Generics import Numeric.Natural import Test.QuickCheck@@ -71,7 +68,7 @@ -- ^ Number of the first track. Typically 1, but may be greater than 1. , cueFiles :: !(NonEmpty CueFile) -- ^ Collection of files to be written.- } deriving (Show, Eq, Ord, Data, Typeable, Generic)+ } deriving (Show, Eq, Ord, Generic) instance Arbitrary CueSheet where arbitrary = CueSheet@@ -97,7 +94,7 @@ -- ^ Type of file. , cueFileTracks :: !(NonEmpty CueTrack) -- ^ Collection of tracks in the file.- } deriving (Show, Eq, Ord, Data, Typeable, Generic)+ } deriving (Show, Eq, Ord, Generic) instance Arbitrary CueFile where arbitrary = CueFile@@ -124,7 +121,7 @@ -- ^ Audio WAVE file (44.1 kHz, 16 bit stereo). | MP3 -- ^ Audio MP3 file (44.1 kHz 16 bit stereo).- deriving (Show, Read, Eq, Ord, Bounded, Enum, Data, Typeable, Generic)+ deriving (Show, Read, Eq, Ord, Bounded, Enum, Generic) instance Arbitrary CueFileType where arbitrary = elements [minBound..maxBound]@@ -161,7 +158,7 @@ -- only index that's stored in the disc's table of contents. , cueTrackPostgap :: !(Maybe CueTime) -- ^ Track's postgap.- } deriving (Show, Eq, Ord, Data, Typeable, Generic)+ } deriving (Show, Eq, Ord, Generic) instance Arbitrary CueTrack where arbitrary = CueTrack@@ -194,16 +191,16 @@ | CueTrackMode2_2352 -- ^ CD-ROM XA Mode2 data. | CueTrackCdi2336 -- ^ CD-I Mode2 data. | CueTrackCdi2352 -- ^ CD-I Mode2 data.- deriving (Show, Read, Eq, Ord, Bounded, Enum, Data, Typeable, Generic)+ deriving (Show, Read, Eq, Ord, Bounded, Enum, Generic) instance Arbitrary CueTrackType where arbitrary = elements [minBound..maxBound] -- | This datatype is used to indicate duration and position in time. It--- contains number of frames. There is 75 frames in one second.+-- contains number of frames. There are 75 frames in one second. newtype CueTime = CueTime Natural- deriving (Show, Read, Eq, Ord, Data, Typeable, Generic)+ deriving (Show, Read, Eq, Ord, Generic) instance Arbitrary CueTime where arbitrary = CueTime <$> arbitrary@@ -244,7 +241,7 @@ -- characters must be numeric. newtype Mcn = Mcn Text- deriving (Eq, Ord, Data, Typeable, Generic)+ deriving (Eq, Ord, Generic) instance Show Mcn where show = show . unMcn@@ -272,7 +269,7 @@ -- to escape them properly. newtype CueText = CueText Text- deriving (Eq, Ord, Data, Typeable, Generic)+ deriving (Eq, Ord, Generic) instance Show CueText where show = show . unCueText@@ -299,7 +296,7 @@ -- last seven are numeric only. newtype Isrc = Isrc Text- deriving (Eq, Ord, Data, Typeable, Generic)+ deriving (Eq, Ord, Generic) instance Show Isrc where show = show . unIsrc@@ -310,7 +307,7 @@ post <- vectorOf 7 (arbitrary `suchThat` isDigit) (return . Isrc . T.pack) (pre <> post) --- | Make a 'Isrc', if the provided 'Text' value is not a valid ISRC, throw+-- | Make an 'Isrc', if the provided 'Text' value is not a valid ISRC, throw -- the 'InvalidIsrc' exception. mkIsrc :: MonadThrow m => Text -> m Isrc@@ -326,7 +323,7 @@ unIsrc :: Isrc -> Text unIsrc (Isrc x) = x --- | Exception type for bad things that may happen while you use the+-- | Exception type for the bad things that may happen while you use the -- library. data CueSheetException@@ -340,20 +337,20 @@ -- ^ Provided text wasn't a valid CUE text. | InvalidIsrc Text -- ^ Provided text wasn't a valid ISRC.- deriving (Eq, Ord, Show, Read, Data, Typeable, Generic)+ deriving (Eq, Ord, Show, Read, Generic) instance Exception CueSheetException ---------------------------------------------------------------------------- -- Helpers --- | Check if given 'Text' is a valid MCN.+-- | Check if the given 'Text' is a valid MCN. isValidMcn :: Text -> Bool isValidMcn x = T.length x == 13 && T.all isDigit x --- | Check if given 'Text' has valid length to be used in a CUE sheet as--- performer, title, etc.+-- | Check if the given 'Text' has valid length and contents to be used in a+-- CUE sheet as performer, title, etc. isValidCueText :: Text -> Bool isValidCueText x = l >= 1 && l <= 80 && T.all f x
cue-sheet.cabal view
@@ -1,42 +1,11 @@------ Cabal configuration for ‘cue-sheet’ package.------ Copyright © 2016 Mark Karpov <markkarpov@openmailbox.org>------ Redistribution and use in source and binary forms, with or without--- modification, are permitted provided that the following conditions are--- met:------ * Redistributions of source code must retain the above copyright notice,--- this list of conditions and the following disclaimer.------ * Redistributions in binary form must reproduce the above copyright--- notice, this list of conditions and the following disclaimer in the--- documentation and/or other materials provided with the distribution.------ * Neither the name Mark Karpov nor the names of contributors may be used--- to endorse or promote products derived from this software without--- specific prior written permission.------ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS “AS IS” AND ANY--- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED--- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE--- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY--- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL--- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS--- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)--- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,--- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN--- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE--- POSSIBILITY OF SUCH DAMAGE.- name: cue-sheet-version: 0.1.0+version: 0.1.1 cabal-version: >= 1.10+tested-with: GHC==7.10.3, GHC==8.0.2, GHC==8.2.1 license: BSD3 license-file: LICENSE.md-author: Mark Karpov <markkarpov@openmailbox.org>-maintainer: Mark Karpov <markkarpov@openmailbox.org>+author: Mark Karpov <markkarpov92@gmail.com>+maintainer: Mark Karpov <markkarpov92@gmail.com> homepage: https://github.com/mrkkrp/cue-sheet bug-reports: https://github.com/mrkkrp/cue-sheet/issues category: Audio@@ -63,7 +32,7 @@ , containers >= 0.5.6.2 && < 0.6 , data-default-class , exceptions >= 0.6 && < 0.9- , megaparsec >= 5.1.1 && < 6.0+ , megaparsec >= 5.3 && < 6.0 , mtl >= 2.0 && < 3.0 , text >= 0.2 && < 1.3 if !impl(ghc >= 8.0)@@ -89,7 +58,7 @@ build-depends: QuickCheck >= 2.4 && < 3.0 , base >= 4.8 && < 5.0 , bytestring >= 0.10.8 && < 0.11- , cue-sheet >= 0.1+ , cue-sheet , exceptions >= 0.6 && < 0.9 , hspec >= 2.0 && < 3.0 , hspec-megaparsec >= 0.3 && < 0.4
tests/Text/CueSheet/ParserSpec.hs view
@@ -1,35 +1,3 @@------ Parser tests for the ‘cue-sheet’ package.------ Copyright © 2016 Mark Karpov <markkarpov@openmailbox.org>------ Redistribution and use in source and binary forms, with or without--- modification, are permitted provided that the following conditions are--- met:------ * Redistributions of source code must retain the above copyright notice,--- this list of conditions and the following disclaimer.------ * Redistributions in binary form must reproduce the above copyright--- notice, this list of conditions and the following disclaimer in the--- documentation and/or other materials provided with the distribution.------ * Neither the name Mark Karpov nor the names of contributors may be used--- to endorse or promote products derived from this software without--- specific prior written permission.------ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS “AS IS” AND ANY--- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED--- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE--- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY--- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL--- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS--- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)--- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,--- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN--- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE--- POSSIBILITY OF SUCH DAMAGE.- {-# LANGUAGE OverloadedStrings #-} module Text.CueSheet.ParserSpec
tests/Text/CueSheet/RenderSpec.hs view
@@ -1,35 +1,3 @@------ Render tests for the ‘cue-sheet’ package.------ Copyright © 2016 Mark Karpov <markkarpov@openmailbox.org>------ Redistribution and use in source and binary forms, with or without--- modification, are permitted provided that the following conditions are--- met:------ * Redistributions of source code must retain the above copyright notice,--- this list of conditions and the following disclaimer.------ * Redistributions in binary form must reproduce the above copyright--- notice, this list of conditions and the following disclaimer in the--- documentation and/or other materials provided with the distribution.------ * Neither the name Mark Karpov nor the names of contributors may be used--- to endorse or promote products derived from this software without--- specific prior written permission.------ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS “AS IS” AND ANY--- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED--- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE--- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY--- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL--- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS--- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)--- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,--- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN--- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE--- POSSIBILITY OF SUCH DAMAGE.- {-# LANGUAGE OverloadedStrings #-} module Text.CueSheet.RenderSpec
tests/Text/CueSheet/TypesSpec.hs view
@@ -1,35 +1,3 @@------ Test for ‘Text.CueSheet.Types’.------ Copyright © 2016 Mark Karpov <markkarpov@openmailbox.org>------ Redistribution and use in source and binary forms, with or without--- modification, are permitted provided that the following conditions are--- met:------ * Redistributions of source code must retain the above copyright notice,--- this list of conditions and the following disclaimer.------ * Redistributions in binary form must reproduce the above copyright--- notice, this list of conditions and the following disclaimer in the--- documentation and/or other materials provided with the distribution.------ * Neither the name Mark Karpov nor the names of contributors may be used--- to endorse or promote products derived from this software without--- specific prior written permission.------ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS “AS IS” AND ANY--- EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED--- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE--- DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY--- DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL--- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS--- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)--- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,--- STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN--- ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE--- POSSIBILITY OF SUCH DAMAGE.- {-# LANGUAGE OverloadedStrings #-} module Text.CueSheet.TypesSpec