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

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

module DobutokO.Sound.Effects.Hilbert 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

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

data Hilbert a = H | HI a deriving Hilbert a -> Hilbert a -> Bool
(Hilbert a -> Hilbert a -> Bool)
-> (Hilbert a -> Hilbert a -> Bool) -> Eq (Hilbert a)
forall a. Eq a => Hilbert a -> Hilbert a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Hilbert a -> Hilbert a -> Bool
$c/= :: forall a. Eq a => Hilbert a -> Hilbert a -> Bool
== :: Hilbert a -> Hilbert a -> Bool
$c== :: forall a. Eq a => Hilbert a -> Hilbert a -> Bool
Eq

instance Show (Hilbert Int) where
  show :: Hilbert Int -> String
show (HI Int
n) 
    | Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
n Int
2 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
GT Bool -> Bool -> Bool
&& Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
n Int
32768 Ordering -> Ordering -> Bool
forall a. Eq a => a -> a -> Bool
== Ordering
LT = [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
"hilbert -n ",Int -> String
forall a. Show a => a -> String
show Int
n]
    | Bool
otherwise = String
""
  show Hilbert Int
_ = String
"hilbert "

type Hlbrt = Hilbert Int

hilbertC :: Hilbert a -> String
hilbertC :: Hilbert a -> String
hilbertC Hilbert a
H = String
"H"
hilbertC Hilbert a
_ = String
"HI"

hilbert1 :: Hilbert a -> Maybe a
hilbert1 :: Hilbert a -> Maybe a
hilbert1 (HI a
x) = a -> Maybe a
forall a. a -> Maybe a
Just a
x
hilbert1 Hilbert a
_ = Maybe a
forall a. Maybe a
Nothing

hilbertSet1 :: a -> Hilbert a
hilbertSet1 :: a -> Hilbert a
hilbertSet1 = a -> Hilbert a
forall a. a -> Hilbert a
HI

showHIQ :: Hlbrt -> [String]
showHIQ :: Hilbert Int -> [String]
showHIQ = String -> [String]
words (String -> [String])
-> (Hilbert Int -> String) -> Hilbert Int -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Hilbert Int -> String
forall a. Show a => a -> String
show