packages feed

tidal-1.10.3: src/Sound/Tidal/Safe/Context.hs

{-
    Safe/Context.hs - wraps UI functions
    Copyright (C) 2021 Johannes Waldmann and contributors

    Forked from:
    https://github.com/jwaldmann/safe-tidal-cli/

    This library is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this library.  If not, see <http://www.gnu.org/licenses/>.
-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# OPTIONS_GHC -Wno-missing-signatures #-}
{-# OPTIONS_GHC -Wno-unused-top-binds #-}

module Sound.Tidal.Safe.Context
  ( Op (), -- do not export constructor,
  -- so the user has no way of putting arbitraty IO stuff
  -- in "Op", and below "run"
    exec,
    streamReplace,
    streamHush,
    streamList,
    streamMute,
    streamUnmute,
    streamSolo,
    streamUnsolo,
    streamOnce,
    streamFirst,
    streamNudgeAll,
    streamAll,
    streamResetCycles,
    streamSetI,
    streamSetF,
    streamSetS,
    streamSetR,
    streamSetB,
    transition,
    module C,
    Target (..),
  )
where

-- import Sound.Tidal.Transition as C

import Control.Monad.Catch
import Control.Monad.Reader
import Data.Ratio as C
import Sound.Tidal.Config as C
import Sound.Tidal.Context (Stream)
import qualified Sound.Tidal.Context as C
import Sound.Tidal.Control as C
import Sound.Tidal.Core as C
import Sound.Tidal.Params as C
import Sound.Tidal.ParseBP as C
import Sound.Tidal.Pattern as C
import Sound.Tidal.Scales as C
import Sound.Tidal.Simple as C
import Sound.Tidal.Stream.Main (startTidal)
import Sound.Tidal.Stream.Target (superdirtTarget)
import Sound.Tidal.Stream.Types (Target (..))
import Sound.Tidal.UI as C
import Sound.Tidal.Version as C

newtype Op r = Op (ReaderT Stream IO r)
  deriving (Functor, Applicative, Monad, MonadCatch, MonadThrow)

exec :: Stream -> Op r -> IO r
exec stream (Op m) = runReaderT m stream

op1 f = Op $ do a <- ask; lift $ f a

op2 f b = Op $ do a <- ask; lift $ f a b

op3 f b c = Op $ do a <- ask; lift $ f a b c

op4 f b c d = Op $ do a <- ask; lift $ f a b c d

op5 f b c d e = Op $ do a <- ask; lift $ f a b c d e

streamReplace = op3 C.streamReplace

streamHush = op1 C.streamHush

streamList = op1 C.streamList

streamMute = op2 C.streamMute

streamUnmute = op2 C.streamUnmute

streamSolo = op2 C.streamSolo

streamUnsolo = op2 C.streamUnsolo

streamOnce = op2 C.streamOnce

streamFirst = op2 C.streamFirst

streamNudgeAll = op2 C.streamNudgeAll

streamAll = op2 C.streamAll

streamResetCycles = op1 C.streamResetCycles

transition = op5 C.transition

streamSetI = op3 C.streamSetI

streamSetF = op3 C.streamSetF

streamSetS = op3 C.streamSetS

streamSetR = op3 C.streamSetR

streamSetB = op3 C.streamSetB