midi 0.2.2.1 → 0.2.2.2
raw patch · 6 files changed
+48/−32 lines, 6 filesdep +semigroupsdep ~basedep ~binarydep ~bytestring
Dependencies added: semigroups
Dependency ranges changed: base, binary, bytestring, monoid-transformer, transformers
Files
- midi.cabal +13/−16
- src/Sound/MIDI/File/Save.hs +2/−2
- src/Sound/MIDI/Monoid.hs +9/−7
- src/Sound/MIDI/Writer/Basic.hs +17/−5
- src/Sound/MIDI/Writer/Status.hs +6/−1
- test/Main.hs +1/−1
midi.cabal view
@@ -1,13 +1,13 @@ Name: midi-Version: 0.2.2.1+Version: 0.2.2.2 License: GPL License-File: LICENSE Author: Henning Thielemann <haskell@henning-thielemann.de> Maintainer: Henning Thielemann <haskell@henning-thielemann.de> Homepage: http://www.haskell.org/haskellwiki/MIDI Category: Sound, Music-Tested-With: GHC==6.4.1, GHC==6.8.2, GHC==6.10.4, GHC==6.12.3 Tested-With: GHC==7.0.4, GHC==7.2.2, GHC==7.4.2, GHC==7.6.3, GHC==7.8.4, GHC==7.10.1+Tested-With: GHC==8.4.1 Cabal-Version: >=1.14 Build-Type: Simple Synopsis: Handling of MIDI messages and files@@ -30,29 +30,22 @@ Source-Repository this type: darcs location: http://hub.darcs.net/thielema/midi/- tag: 0.2.2.1--Flag splitBase- description: Choose the new smaller, split-up base package.+ tag: 0.2.2.2 Library Build-Depends:- event-list >=0.0.9 && < 0.2,+ event-list >=0.0.9 && <0.2, non-negative >=0.0.1 && <0.2,+ semigroups >=0.1 && <1.0, utility-ht >=0.0.10 && <0.1, explicit-exception >=0.1 && <0.2, bytestring >=0.9.0.1 && <0.11, binary >=0.4.2 && <0.9, transformers >=0.2 && <0.6,- monoid-transformer >=0.0.1 && <0.1,- QuickCheck >=2.1 && <3- If flag(splitBase)- Build-Depends:- random >=1 && <2,- base >=3 && <5- Else- Build-Depends:- base >=1.0 && <3+ monoid-transformer >=0.0.4 && <0.1,+ QuickCheck >=2.1 && <3,+ random >=1 && <2,+ base >=3 && <5 Default-Language: Haskell2010 GHC-Options: -Wall@@ -129,3 +122,7 @@ Example Parser Common+ Sound.MIDI.Parser.Class+ Sound.MIDI.Parser.Exception+ Sound.MIDI.Parser.Stream+ Sound.MIDI.Parser.Warning
src/Sound/MIDI/File/Save.hs view
@@ -19,10 +19,10 @@ import qualified Sound.MIDI.Writer.Status as StatusWriter import qualified Sound.MIDI.Writer.Basic as Writer-import qualified Sound.MIDI.Monoid as M import Sound.MIDI.Monoid ((+#+)) import qualified Data.Monoid.Transformer as Trans+import Data.Foldable (foldMap, ) import Sound.MIDI.IO (ByteList, writeBinaryFile, ) @@ -88,7 +88,7 @@ Writer.putInt 2 (fromEnum mft) +#+ -- format (type 0, 1 or 2) Writer.putInt 2 (length trks) +#+ -- number of tracks to come putDivision divisn) -- time unit- +#+ M.concatMap putTrack trks+ +#+ foldMap putTrack trks putDivision :: Writer.C writer => Division -> writer putDivision (Ticks nticks) =
src/Sound/MIDI/Monoid.hs view
@@ -1,7 +1,9 @@ module Sound.MIDI.Monoid where -import Data.Monoid (Monoid, mappend, mconcat, )-import Prelude hiding (concatMap, )+import Data.Foldable (foldMap, )+import Data.Monoid (Monoid, mappend, )+import Data.Semigroup (Semigroup, sconcat, )+import Data.List.NonEmpty (NonEmpty, ) @@ -19,9 +21,9 @@ genConcat :: (Monoid m) => (m -> a) -> (a -> m) -> [a] -> a genConcat cons decons =- cons . concatMap decons+ cons . foldMap decons --- foldMap-concatMap :: (Monoid m) =>- (a -> m) -> [a] -> m-concatMap f = mconcat . map f+nonEmptyConcat :: (Semigroup m) =>+ (m -> a) -> (a -> m) -> NonEmpty a -> a+nonEmptyConcat cons decons =+ cons . sconcat . fmap decons
src/Sound/MIDI/Writer/Basic.hs view
@@ -4,13 +4,14 @@ import qualified Sound.MIDI.Bit as Bit import qualified Sound.MIDI.IO as MIO-import qualified Sound.MIDI.Monoid as M import qualified Data.Monoid as Monoid import Data.Bits ((.|.)) import Sound.MIDI.IO (listByteFromChar, )+import Sound.MIDI.Monoid ((+#+), genAppend, genConcat, nonEmptyConcat, )+import Data.Foldable (foldMap, ) import Data.Monoid (Monoid, mempty, mappend, mconcat, )-import Sound.MIDI.Monoid ((+#+), genAppend, genConcat, )+import Data.Semigroup (Semigroup(sconcat, (<>)), ) import Control.Monad.Trans.Reader (ReaderT, runReaderT, ask, ) import Control.Monad.Trans.Class (lift, )@@ -44,6 +45,10 @@ -- differences list newtype ByteList = ByteList {unByteList :: Monoid.Endo MIO.ByteList} +instance Semigroup ByteList where+ (<>) = genAppend ByteList unByteList+ sconcat = nonEmptyConcat ByteList unByteList+ instance Monoid ByteList where mempty = ByteList mempty mappend = genAppend ByteList unByteList@@ -70,6 +75,10 @@ newtype ByteString = ByteString {unByteString :: Builder} +instance Semigroup ByteString where+ (<>) = genAppend ByteString unByteString+ sconcat = nonEmptyConcat ByteString unByteString+ instance Monoid ByteString where mempty = ByteString $ mempty mappend = genAppend ByteString unByteString@@ -95,10 +104,13 @@ newtype SeekableFile = SeekableFile {unSeekableFile :: ReaderT Handle IO ()} +instance Semigroup SeekableFile where+ x <> y = SeekableFile $ unSeekableFile x >> unSeekableFile y+ instance Monoid SeekableFile where mempty = SeekableFile $ return ()- mappend x y = SeekableFile $ unSeekableFile x >> unSeekableFile y- mconcat xs = SeekableFile $ mapM_ unSeekableFile xs+ mappend = (<>)+ mconcat = SeekableFile . mapM_ unSeekableFile instance C SeekableFile where putByte c =@@ -146,7 +158,7 @@ putIntAsByte x = putByte $ fromIntegral x putByteList :: C writer => MIO.ByteList -> writer-putByteList = M.concatMap putByte+putByteList = foldMap putByte putLenByteList :: C writer => MIO.ByteList -> writer putLenByteList bytes =
src/Sound/MIDI/Writer/Status.hs view
@@ -11,7 +11,8 @@ import qualified Data.Monoid.HT as MonoidHT import Data.Monoid (Monoid, mempty, mappend, mconcat, )-import Sound.MIDI.Monoid (genAppend, genConcat, )+import Data.Semigroup (Semigroup, sconcat, (<>), )+import Sound.MIDI.Monoid (genAppend, genConcat, nonEmptyConcat, ) data Uncompressed = Uncompressed@@ -25,6 +26,10 @@ -} newtype T compress writer = Cons {decons :: State.T compress writer} ++instance Semigroup writer => Semigroup (T compress writer) where+ Cons x <> Cons y = Cons $ x<>y+ sconcat = nonEmptyConcat Cons decons instance Monoid writer => Monoid (T compress writer) where mempty = Cons $ mempty
test/Main.hs view
@@ -116,7 +116,7 @@ compressible :: MidiFile.T -> Bool compressible = any (or . ListHT.mapAdjacent equalStatus . EventList.getBodies) .- MidiFile.getTracks+ MidiFile.getTracks . MidiFile.implicitNoteOff compressionStrictlyShortens :: MidiFile.T -> QC.Property compressionStrictlyShortens midi =