-- |
-- Module      :  DobutokO.Sound.One
-- 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. 
-- 

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

module DobutokO.Sound.One where

data One2 a = O21 a | O22 a a deriving Eq

one2C :: One2 a -> String
one2C (O21 _) = "O21"
one2C (O22 _ _) = "O22"

one21 :: One2 a -> [a]
one21 (O21 x) = [x]
one21 (O22 x y) = [x,y]

one2Set1 :: a -> One2 a -> One2 a
one2Set1 x (O21 _) = O21 x
one2Set1 x (O22 _ y) = O22 x y

one2Set2 :: a -> One2 a -> One2 a
one2Set2 y (O21 x) = O22 x y
one2Set2 y (O22 x _) = O22 x y

one2toList :: One2 a -> [a]
one2toList (O21 x) = [x]
one2toList (O22 x y) = [x,y]

data One3 a = O31 a | O32 a a | O33 a a a deriving Eq

one3C :: One3 a -> String
one3C (O31 _) = "O31"
one3C (O32 _ _) = "O32"
one3C (O33 _ _ _) = "O33"

one31 :: One3 a -> [a]
one31 (O31 x) = [x]
one31 (O32 x y) = [x,y]
one31 (O33 x y z) = [x,y,z]

one3Set1 :: a -> One3 a -> One3 a
one3Set1 x (O31 _) = O31 x
one3Set1 x (O32 _ y) = O32 x y
one3Set1 x (O33 _ y z) = O33 x y z

one3Set2 :: a -> One3 a -> One3 a
one3Set2 y (O31 x) = O32 x y
one3Set2 y (O32 x _) = O32 x y
one3Set2 y (O33 x _ z) = O33 x y z

one3Set3 :: a -> One3 a -> Maybe (One3 a)
one3Set3 z (O32 x y) = Just (O33 x y z)
one3Set3 z (O33 x y _) = Just (O33 x y z)
one3Set3 _ _ = Nothing

one3toList :: One3 a -> [a]
one3toList (O31 x) = [x]
one3toList (O32 x y) = [x, y]
one3toList (O33 x y z) = [x, y, z]