-- |
-- Module      :  DobutokO.Sound.Effects.Splice
-- Copyright   :  (c) OleksandrZhabenko 2020
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  olexandr543@yahoo.com
--
-- Helps to create experimental music. 
-- Can be used for applying the SoX \"splice\" effect. 
-- 

{-# OPTIONS_GHC -threaded #-}
{-# LANGUAGE FlexibleInstances #-}

module DobutokO.Sound.Effects.Splice where

import Data.List (intersperse)
import DobutokO.Sound.Effects.Timespec
import DobutokO.Sound.One (One3(..))


data SpliceP = N0 | H | T | Q deriving SpliceP -> SpliceP -> Bool
(SpliceP -> SpliceP -> Bool)
-> (SpliceP -> SpliceP -> Bool) -> Eq SpliceP
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SpliceP -> SpliceP -> Bool
$c/= :: SpliceP -> SpliceP -> Bool
== :: SpliceP -> SpliceP -> Bool
$c== :: SpliceP -> SpliceP -> Bool
Eq

instance Show SpliceP where
  show :: SpliceP -> String
show SpliceP
H = String
"-h "
  show SpliceP
T = String
"-t "
  show SpliceP
Q = String
"-q "
  show SpliceP
_ = String
""

data Splice2 a b = SL a [One3 b] deriving Splice2 a b -> Splice2 a b -> Bool
(Splice2 a b -> Splice2 a b -> Bool)
-> (Splice2 a b -> Splice2 a b -> Bool) -> Eq (Splice2 a b)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b. (Eq a, Eq b) => Splice2 a b -> Splice2 a b -> Bool
/= :: Splice2 a b -> Splice2 a b -> Bool
$c/= :: forall a b. (Eq a, Eq b) => Splice2 a b -> Splice2 a b -> Bool
== :: Splice2 a b -> Splice2 a b -> Bool
$c== :: forall a b. (Eq a, Eq b) => Splice2 a b -> Splice2 a b -> Bool
Eq

instance Show (Splice2 SpliceP TSpecification) where
  show :: Splice2 SpliceP TSpecification -> String
show (SL SpliceP
x [One3 TSpecification]
ys) 
    | [One3 TSpecification] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [One3 TSpecification]
ys = String
""
    | Bool
otherwise = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"splice ", SpliceP -> String
forall a. Show a => a -> String
show SpliceP
x, [String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String)
-> ([One3 TSpecification] -> [String])
-> [One3 TSpecification]
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [String] -> [String]
forall a. a -> [a] -> [a]
intersperse String
" " ([String] -> [String])
-> ([One3 TSpecification] -> [String])
-> [One3 TSpecification]
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (One3 TSpecification -> String)
-> [One3 TSpecification] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map One3 TSpecification -> String
forall a. Show a => a -> String
show ([One3 TSpecification] -> String)
-> [One3 TSpecification] -> String
forall a b. (a -> b) -> a -> b
$ [One3 TSpecification]
ys]

type Splice = Splice2 SpliceP TSpecification

splice21 :: Splice2 a b -> a
splice21 :: Splice2 a b -> a
splice21 (SL a
x [One3 b]
_) = a
x

splice22 :: Splice2 a b -> [One3 b]
splice22 :: Splice2 a b -> [One3 b]
splice22 (SL a
_ [One3 b]
ys) = [One3 b]
ys

splice2Set1 :: a -> Splice2 a b -> Splice2 a b
splice2Set1 :: a -> Splice2 a b -> Splice2 a b
splice2Set1 a
x (SL a
_ [One3 b]
ys) = a -> [One3 b] -> Splice2 a b
forall a b. a -> [One3 b] -> Splice2 a b
SL a
x [One3 b]
ys

splice2Set2 :: [One3 b] -> Splice2 a b -> Splice2 a b
splice2Set2 :: [One3 b] -> Splice2 a b -> Splice2 a b
splice2Set2 [One3 b]
ys (SL a
x [One3 b]
_) = a -> [One3 b] -> Splice2 a b
forall a b. a -> [One3 b] -> Splice2 a b
SL a
x [One3 b]
ys

showSLQ :: Splice -> [String]
showSLQ :: Splice2 SpliceP TSpecification -> [String]
showSLQ = String -> [String]
words (String -> [String])
-> (Splice2 SpliceP TSpecification -> String)
-> Splice2 SpliceP TSpecification
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Splice2 SpliceP TSpecification -> String
forall a. Show a => a -> String
show