packages feed

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 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