-- |
-- Module      :  DobutokO.Sound.Effects.Timespec
-- Copyright   :  (c) OleksandrZhabenko 2020
-- License     :  MIT
-- Stability   :  Experimental
-- Maintainer  :  olexandr543@yahoo.com
--
-- Helps to create experimental music. 
-- Can be used for applying the SoX effects with the needed time specifications. 
-- 

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

module DobutokO.Sound.Effects.Timespec where

#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__>=710
/* code that applies only to GHC 7.10.* and higher versions */
import GHC.Base (mconcat)
#endif
#endif
import Numeric (showFFloat)
import DobutokO.Sound.One

#ifdef __GLASGOW_HASKELL__
#if __GLASGOW_HASKELL__==708
/* code that applies only to GHC 7.8.* */
mconcat = concat
#endif
#endif

data Position = P | M | E deriving Position -> Position -> Bool
(Position -> Position -> Bool)
-> (Position -> Position -> Bool) -> Eq Position
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Position -> Position -> Bool
$c/= :: Position -> Position -> Bool
== :: Position -> Position -> Bool
$c== :: Position -> Position -> Bool
Eq

instance Show Position where
  show :: Position -> String
show Position
P = String
"+"
  show Position
M = String
"-"
  show Position
E = String
"="

data TSpec a b c = Ts a c | Tm a b c | Th a b b c | S a b deriving TSpec a b c -> TSpec a b c -> Bool
(TSpec a b c -> TSpec a b c -> Bool)
-> (TSpec a b c -> TSpec a b c -> Bool) -> Eq (TSpec a b c)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b c.
(Eq a, Eq c, Eq b) =>
TSpec a b c -> TSpec a b c -> Bool
/= :: TSpec a b c -> TSpec a b c -> Bool
$c/= :: forall a b c.
(Eq a, Eq c, Eq b) =>
TSpec a b c -> TSpec a b c -> Bool
== :: TSpec a b c -> TSpec a b c -> Bool
$c== :: forall a b c.
(Eq a, Eq c, Eq b) =>
TSpec a b c -> TSpec a b c -> Bool
Eq

instance Show (TSpec Position Int Float) where 
  show :: TSpec Position Int Float -> String
show (Ts Position
x Float
y) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [Position -> String
forall a. Show a => a -> String
show Position
x,Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (Float -> Float
forall a. Num a => a -> a
abs Float
y) String
"t"]
  show (Tm Position
x Int
y Float
z) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [Position -> String
forall a. Show a => a -> String
show Position
x,Int -> String
forall a. Show a => a -> String
show (Int -> Int
forall a. Num a => a -> a
abs Int
y),String
":",Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (Float -> Float
forall a. Num a => a -> a
abs Float
z) String
"t"]
  show (Th Position
x Int
y1 Int
y2 Float
z) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [Position -> String
forall a. Show a => a -> String
show Position
x,Int -> String
forall a. Show a => a -> String
show (Int -> Int
forall a. Num a => a -> a
abs Int
y1),String
":",Int -> String
forall a. Show a => a -> String
show (Int -> Int
forall a. Num a => a -> a
abs Int
y2),String
":",Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (Float -> Float
forall a. Num a => a -> a
abs Float
z) String
"t"]
  show (S Position
x Int
y) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [Position -> String
forall a. Show a => a -> String
show Position
x,Int -> String
forall a. Show a => a -> String
show (Int -> Int
forall a. Num a => a -> a
abs Int
y),String
"s"]

type FirstTSpec = TSpec Position Int Float

isTime :: TSpec a b c -> Bool
isTime :: TSpec a b c -> Bool
isTime (S a
_ b
_) = Bool
False
isTime TSpec a b c
_ = Bool
True

isSamples :: TSpec a b c -> Bool
isSamples :: TSpec a b c -> Bool
isSamples (S a
_ b
_) = Bool
True
isSamples TSpec a b c
_ = Bool
False

tSpecC :: FirstTSpec -> String
tSpecC :: TSpec Position Int Float -> String
tSpecC (Ts Position
_ Float
_) = String
"Ts"
tSpecC (Tm Position
_ Int
_ Float
_) = String
"Tm"
tSpecC (Th Position
_ Int
_ Int
_ Float
_) = String
"Th"
tSpecC (S Position
_ Int
_) = String
"S"

tSpecPos :: FirstTSpec -> Position
tSpecPos :: TSpec Position Int Float -> Position
tSpecPos (Ts Position
x Float
_) = Position
x
tSpecPos (Tm Position
x Int
_ Float
_) = Position
x
tSpecPos (Th Position
x Int
_ Int
_ Float
_) = Position
x
tSpecPos (S Position
x Int
_) = Position
x

seconds :: FirstTSpec -> Maybe Float
seconds :: TSpec Position Int Float -> Maybe Float
seconds (Ts Position
_ Float
x) = Float -> Maybe Float
forall a. a -> Maybe a
Just (Float -> Float
forall a. Num a => a -> a
abs Float
x)
seconds (Tm Position
_ Int
x Float
y) = Float -> Maybe Float
forall a. a -> Maybe a
Just (Float -> Float
forall a. Num a => a -> a
abs Float
y Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
60 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int -> Int
forall a. Num a => a -> a
abs Int
x))
seconds (Th Position
_ Int
x Int
y Float
z) = Float -> Maybe Float
forall a. a -> Maybe a
Just (Float -> Float
forall a. Num a => a -> a
abs Float
z Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
3600 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int -> Int
forall a. Num a => a -> a
abs Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
60 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int -> Int
forall a. Num a => a -> a
abs Int
y))
seconds TSpec Position Int Float
_ = Maybe Float
forall a. Maybe a
Nothing

minutes :: FirstTSpec -> Maybe Int
minutes :: TSpec Position Int Float -> Maybe Int
minutes (Ts Position
_ Float
x) = Int -> Maybe Int
forall a. a -> Maybe a
Just (Float -> Int
forall a b. (RealFrac a, Integral b) => a -> b
truncate (Float -> Int) -> Float -> Int
forall a b. (a -> b) -> a -> b
$ Float -> Float
forall a. Num a => a -> a
abs Float
x Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
60.0)
minutes (Tm Position
_ Int
x Float
y) = Int -> Maybe Int
forall a. a -> Maybe a
Just (Int -> Int
forall a. Num a => a -> a
abs Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Float -> Int
forall a b. (RealFrac a, Integral b) => a -> b
truncate (Float -> Float
forall a. Num a => a -> a
abs Float
y Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
60.0))
minutes (Th Position
_ Int
x Int
y Float
z) = Int -> Maybe Int
forall a. a -> Maybe a
Just (Int -> Int
forall a. Num a => a -> a
abs Int
y Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Float -> Int
forall a b. (RealFrac a, Integral b) => a -> b
truncate (Float -> Float
forall a. Num a => a -> a
abs Float
z Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
60.0) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
60 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int -> Int
forall a. Num a => a -> a
abs Int
x)
minutes TSpec Position Int Float
_ = Maybe Int
forall a. Maybe a
Nothing

hours :: FirstTSpec -> Maybe Int
hours :: TSpec Position Int Float -> Maybe Int
hours (Ts Position
_ Float
x) = Int -> Maybe Int
forall a. a -> Maybe a
Just (Float -> Int
forall a b. (RealFrac a, Integral b) => a -> b
truncate (Float -> Int) -> Float -> Int
forall a b. (a -> b) -> a -> b
$ Float -> Float
forall a. Num a => a -> a
abs Float
x Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
3600.0)
hours (Tm Position
_ Int
x Float
y) = Int -> Maybe Int
forall a. a -> Maybe a
Just (Float -> Int
forall a b. (RealFrac a, Integral b) => a -> b
truncate (Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Int
forall a. Num a => a -> a
abs Int
x) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
60.0 Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float -> Float
forall a. Num a => a -> a
abs Float
y Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
3600.0))
hours (Th Position
_ Int
x Int
y Float
z) = Int -> Maybe Int
forall a. a -> Maybe a
Just (Int -> Int
forall a. Num a => a -> a
abs Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Float -> Int
forall a b. (RealFrac a, Integral b) => a -> b
truncate (Float -> Float
forall a. Num a => a -> a
abs Float
z Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
3600.0 Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Int
forall a. Num a => a -> a
abs Int
y) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
60.0))
hours TSpec Position Int Float
_ = Maybe Int
forall a. Maybe a
Nothing

samples :: FirstTSpec -> Maybe Int
samples :: TSpec Position Int Float -> Maybe Int
samples (S Position
_ Int
x) = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
x
samples TSpec Position Int Float
_ = Maybe Int
forall a. Maybe a
Nothing

seconds2FstTSpec :: Position -> Float -> FirstTSpec
seconds2FstTSpec :: Position -> Float -> TSpec Position Int Float
seconds2FstTSpec Position
x Float
y = Position -> Float -> TSpec Position Int Float
forall a b c. a -> c -> TSpec a b c
Ts Position
x Float
y

samples2FstTSpec :: Position -> Int -> FirstTSpec
samples2FstTSpec :: Position -> Int -> TSpec Position Int Float
samples2FstTSpec Position
x Int
y = Position -> Int -> TSpec Position Int Float
forall a b c. a -> b -> TSpec a b c
S Position
x (Int -> Int
forall a. Num a => a -> a
abs Int
y)

data Position2 = P2 | M2 deriving Position2 -> Position2 -> Bool
(Position2 -> Position2 -> Bool)
-> (Position2 -> Position2 -> Bool) -> Eq Position2
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Position2 -> Position2 -> Bool
$c/= :: Position2 -> Position2 -> Bool
== :: Position2 -> Position2 -> Bool
$c== :: Position2 -> Position2 -> Bool
Eq

instance Show Position2 where
  show :: Position2 -> String
show Position2
P2 = String
"+"
  show Position2
M2 = String
"-"

instance Show (TSpec Position2 Int Float) where
  show :: TSpec Position2 Int Float -> String
show (Ts Position2
u Float
x) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [Position2 -> String
forall a. Show a => a -> String
show Position2
u,Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (Float -> Float
forall a. Num a => a -> a
abs Float
x) String
"t"]
  show (Tm Position2
u Int
x Float
y) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [Position2 -> String
forall a. Show a => a -> String
show Position2
u,Int -> String
forall a. Show a => a -> String
show (Int -> Int
forall a. Num a => a -> a
abs Int
x),String
":",Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (Float -> Float
forall a. Num a => a -> a
abs Float
y) String
"t"]
  show (Th Position2
u Int
x0 Int
x Float
y) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [Position2 -> String
forall a. Show a => a -> String
show Position2
u,Int -> String
forall a. Show a => a -> String
show (Int -> Int
forall a. Num a => a -> a
abs Int
x0),String
":",Int -> String
forall a. Show a => a -> String
show (Int -> Int
forall a. Num a => a -> a
abs Int
x),String
":",Maybe Int -> Float -> ShowS
forall a. RealFloat a => Maybe Int -> a -> ShowS
showFFloat Maybe Int
forall a. Maybe a
Nothing (Float -> Float
forall a. Num a => a -> a
abs Float
y) String
"t"]
  show (S Position2
u Int
x) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [Position2 -> String
forall a. Show a => a -> String
show Position2
u,Int -> String
forall a. Show a => a -> String
show (Int -> Int
forall a. Num a => a -> a
abs Int
x),String
"s"]

type NextTSpec = TSpec Position2 Int Float  

tSpecC2 :: NextTSpec -> String
tSpecC2 :: TSpec Position2 Int Float -> String
tSpecC2 (Ts Position2
_ Float
_) = String
"Ts"
tSpecC2 (Tm Position2
_ Int
_ Float
_) = String
"Tm"
tSpecC2 (Th Position2
_ Int
_ Int
_ Float
_) = String
"Th"
tSpecC2 (S Position2
_ Int
_) = String
"S"

tSpecPos2 :: NextTSpec -> Position2
tSpecPos2 :: TSpec Position2 Int Float -> Position2
tSpecPos2 (Ts Position2
x Float
_) = Position2
x
tSpecPos2 (Tm Position2
x Int
_ Float
_) = Position2
x
tSpecPos2 (Th Position2
x Int
_ Int
_ Float
_) = Position2
x
tSpecPos2 (S Position2
x Int
_) = Position2
x

seconds2 :: NextTSpec -> Maybe Float
seconds2 :: TSpec Position2 Int Float -> Maybe Float
seconds2 (Ts Position2
_ Float
x) = Float -> Maybe Float
forall a. a -> Maybe a
Just (Float -> Float
forall a. Num a => a -> a
abs Float
x)
seconds2 (Tm Position2
_ Int
x Float
y) = Float -> Maybe Float
forall a. a -> Maybe a
Just (Float -> Float
forall a. Num a => a -> a
abs Float
y Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
60 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int -> Int
forall a. Num a => a -> a
abs Int
x))
seconds2 (Th Position2
_ Int
x Int
y Float
z) = Float -> Maybe Float
forall a. a -> Maybe a
Just (Float -> Float
forall a. Num a => a -> a
abs Float
z Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int
3600 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int -> Int
forall a. Num a => a -> a
abs Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
60 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int -> Int
forall a. Num a => a -> a
abs Int
y))
seconds2 TSpec Position2 Int Float
_ = Maybe Float
forall a. Maybe a
Nothing

minutes2 :: NextTSpec -> Maybe Int
minutes2 :: TSpec Position2 Int Float -> Maybe Int
minutes2 (Ts Position2
_ Float
x) = Int -> Maybe Int
forall a. a -> Maybe a
Just (Float -> Int
forall a b. (RealFrac a, Integral b) => a -> b
truncate (Float -> Int) -> Float -> Int
forall a b. (a -> b) -> a -> b
$ Float -> Float
forall a. Num a => a -> a
abs Float
x Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
60.0)
minutes2 (Tm Position2
_ Int
x Float
y) = Int -> Maybe Int
forall a. a -> Maybe a
Just (Int -> Int
forall a. Num a => a -> a
abs Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Float -> Int
forall a b. (RealFrac a, Integral b) => a -> b
truncate (Float -> Float
forall a. Num a => a -> a
abs Float
y Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
60.0))
minutes2 (Th Position2
_ Int
x Int
y Float
z) = Int -> Maybe Int
forall a. a -> Maybe a
Just (Int -> Int
forall a. Num a => a -> a
abs Int
y Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Float -> Int
forall a b. (RealFrac a, Integral b) => a -> b
truncate (Float -> Float
forall a. Num a => a -> a
abs Float
z Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
60.0) Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
60 Int -> Int -> Int
forall a. Num a => a -> a -> a
* Int -> Int
forall a. Num a => a -> a
abs Int
x)
minutes2 TSpec Position2 Int Float
_ = Maybe Int
forall a. Maybe a
Nothing

hours2 :: NextTSpec -> Maybe Int
hours2 :: TSpec Position2 Int Float -> Maybe Int
hours2 (Ts Position2
_ Float
x) = Int -> Maybe Int
forall a. a -> Maybe a
Just (Float -> Int
forall a b. (RealFrac a, Integral b) => a -> b
truncate (Float -> Int) -> Float -> Int
forall a b. (a -> b) -> a -> b
$ Float -> Float
forall a. Num a => a -> a
abs Float
x Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
3600.0)
hours2 (Tm Position2
_ Int
x Float
y) = Int -> Maybe Int
forall a. a -> Maybe a
Just (Float -> Int
forall a b. (RealFrac a, Integral b) => a -> b
truncate (Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Int
forall a. Num a => a -> a
abs Int
x) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
60.0 Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Float -> Float
forall a. Num a => a -> a
abs Float
y Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
3600.0))
hours2 (Th Position2
_ Int
x Int
y Float
z) = Int -> Maybe Int
forall a. a -> Maybe a
Just (Int -> Int
forall a. Num a => a -> a
abs Int
x Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Float -> Int
forall a b. (RealFrac a, Integral b) => a -> b
truncate (Float -> Float
forall a. Num a => a -> a
abs Float
z Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
3600.0 Float -> Float -> Float
forall a. Num a => a -> a -> a
+ Int -> Float
forall a b. (Integral a, Num b) => a -> b
fromIntegral (Int -> Int
forall a. Num a => a -> a
abs Int
y) Float -> Float -> Float
forall a. Fractional a => a -> a -> a
/ Float
60.0))
hours2 TSpec Position2 Int Float
_ = Maybe Int
forall a. Maybe a
Nothing

samples2 :: NextTSpec -> Maybe Int
samples2 :: TSpec Position2 Int Float -> Maybe Int
samples2 (S Position2
_ Int
x) = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
x
samples2 TSpec Position2 Int Float
_ = Maybe Int
forall a. Maybe a
Nothing

seconds2NextTSpec :: Position2 -> Float -> NextTSpec
seconds2NextTSpec :: Position2 -> Float -> TSpec Position2 Int Float
seconds2NextTSpec Position2
x Float
y = Position2 -> Float -> TSpec Position2 Int Float
forall a b c. a -> c -> TSpec a b c
Ts Position2
x Float
y

samples2NextTSpec :: Position2 -> Int -> NextTSpec
samples2NextTSpec :: Position2 -> Int -> TSpec Position2 Int Float
samples2NextTSpec Position2
x Int
y = Position2 -> Int -> TSpec Position2 Int Float
forall a b c. a -> b -> TSpec a b c
S Position2
x (Int -> Int
forall a. Num a => a -> a
abs Int
y)

data TimeSpec a b = TS1 a | TS2 a [b] deriving TimeSpec a b -> TimeSpec a b -> Bool
(TimeSpec a b -> TimeSpec a b -> Bool)
-> (TimeSpec a b -> TimeSpec a b -> Bool) -> Eq (TimeSpec a b)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall a b. (Eq a, Eq b) => TimeSpec a b -> TimeSpec a b -> Bool
/= :: TimeSpec a b -> TimeSpec a b -> Bool
$c/= :: forall a b. (Eq a, Eq b) => TimeSpec a b -> TimeSpec a b -> Bool
== :: TimeSpec a b -> TimeSpec a b -> Bool
$c== :: forall a b. (Eq a, Eq b) => TimeSpec a b -> TimeSpec a b -> Bool
Eq

isFirstTS :: TimeSpec a b -> Bool
isFirstTS :: TimeSpec a b -> Bool
isFirstTS (TS1 a
_) = Bool
True
isFirstTS TimeSpec a b
_ = Bool
False

isExtTS :: TimeSpec a b -> Bool
isExtTS :: TimeSpec a b -> Bool
isExtTS (TS2 a
_ [b]
_) = Bool
True
isExtTS TimeSpec a b
_ = Bool
False

timeSpecC :: TimeSpec a b -> String
timeSpecC :: TimeSpec a b -> String
timeSpecC (TS1 a
_) = String
"TS1"
timeSpecC (TS2 a
_ [b]
_) = String
"TS2"

timeSpec1 :: TimeSpec a b -> a
timeSpec1 :: TimeSpec a b -> a
timeSpec1 (TS1 a
x) = a
x
timeSpec1 (TS2 a
x [b]
_) = a
x

timeSpec2 :: TimeSpec a b -> Maybe [b]
timeSpec2 :: TimeSpec a b -> Maybe [b]
timeSpec2 (TS2 a
_ [b]
ys) = [b] -> Maybe [b]
forall a. a -> Maybe a
Just [b]
ys
timeSpec2 TimeSpec a b
_ = Maybe [b]
forall a. Maybe a
Nothing

timeSpecSet1 :: a -> TimeSpec a b -> TimeSpec a b
timeSpecSet1 :: a -> TimeSpec a b -> TimeSpec a b
timeSpecSet1 a
x (TS1 a
_) = a -> TimeSpec a b
forall a b. a -> TimeSpec a b
TS1 a
x
timeSpecSet1 a
x (TS2 a
_ [b]
ys) = a -> [b] -> TimeSpec a b
forall a b. a -> [b] -> TimeSpec a b
TS2 a
x [b]
ys

timeSpecSet2 :: [b] -> TimeSpec a b -> TimeSpec a b
timeSpecSet2 :: [b] -> TimeSpec a b -> TimeSpec a b
timeSpecSet2 [b]
xs (TS1 a
y) = a -> [b] -> TimeSpec a b
forall a b. a -> [b] -> TimeSpec a b
TS2 a
y [b]
xs
timeSpecSet2 [b]
xs (TS2 a
y [b]
_) = a -> [b] -> TimeSpec a b
forall a b. a -> [b] -> TimeSpec a b
TS2 a
y [b]
xs

instance Show (TimeSpec FirstTSpec NextTSpec) where
  show :: TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
-> String
show (TS1 TSpec Position Int Float
x) = TSpec Position Int Float -> String
forall a. Show a => a -> String
show TSpec Position Int Float
x
  show (TS2 TSpec Position Int Float
x [TSpec Position2 Int Float]
ys) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [TSpec Position Int Float -> String
forall a. Show a => a -> String
show TSpec Position Int Float
x,[String] -> String
forall a. Monoid a => [a] -> a
mconcat ([String] -> String)
-> ([TSpec Position2 Int Float] -> [String])
-> [TSpec Position2 Int Float]
-> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TSpec Position2 Int Float -> String)
-> [TSpec Position2 Int Float] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map TSpec Position2 Int Float -> String
forall a. Show a => a -> String
show ([TSpec Position2 Int Float] -> String)
-> [TSpec Position2 Int Float] -> String
forall a b. (a -> b) -> a -> b
$ [TSpec Position2 Int Float]
ys]

type TSpecification = TimeSpec FirstTSpec NextTSpec

instance Show (One3 TSpecification) where
  show :: One3
  (TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float))
-> String
show (O31 TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
x) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
-> String
forall a. Show a => a -> String
show TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
x, String
" "]
  show (O32 TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
x TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
y) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
-> String
forall a. Show a => a -> String
show TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
x, String
",", TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
-> String
forall a. Show a => a -> String
show TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
y, String
" "]
  show (O33 TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
x TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
y TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
z) = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
-> String
forall a. Show a => a -> String
show TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
x, String
",", TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
-> String
forall a. Show a => a -> String
show TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
y, String
",", TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
-> String
forall a. Show a => a -> String
show TimeSpec (TSpec Position Int Float) (TSpec Position2 Int Float)
z, String
" "]