module Synthesizer.ChunkySize.Cut where
import qualified Synthesizer.ChunkySize as ChunkySize
import qualified Synthesizer.Generic.Cut as Cut
import qualified Synthesizer.Generic.Signal as SigG
import qualified Synthesizer.State.Signal as SigS
import qualified Data.StorableVector.Lazy.Pattern as SigStV
import qualified Data.StorableVector.Lazy as Vector
import Foreign.Storable (Storable)
import qualified Number.NonNegativeChunky as Chunky
import qualified Data.List.Match as Match
import qualified Data.List as List
import Data.Tuple.HT (mapPair, )
import Data.Monoid (Monoid, )
import NumericPrelude.Numeric
import NumericPrelude.Base hiding (splitAt, Read, )
import Prelude ()
class Cut.Read sig => Read sig where
length :: sig -> ChunkySize.T
class (Read sig, Monoid sig) => Transform sig where
take :: ChunkySize.T -> sig -> sig
drop :: ChunkySize.T -> sig -> sig
splitAt :: ChunkySize.T -> sig -> (sig, sig)
instance Storable y => Read (Vector.Vector y) where
{-# INLINE length #-}
length :: Vector y -> T
length = LazySize -> T
ChunkySize.fromStorableVectorSize forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Vector a -> LazySize
SigStV.length
instance Storable y => Transform (Vector.Vector y) where
{-# INLINE take #-}
take :: T -> Vector y -> Vector y
take = forall a. Storable a => LazySize -> Vector a -> Vector a
SigStV.take forall b c a. (b -> c) -> (a -> b) -> a -> c
. T -> LazySize
ChunkySize.toStorableVectorSize
{-# INLINE drop #-}
drop :: T -> Vector y -> Vector y
drop = forall a. Storable a => LazySize -> Vector a -> Vector a
SigStV.drop forall b c a. (b -> c) -> (a -> b) -> a -> c
. T -> LazySize
ChunkySize.toStorableVectorSize
{-# INLINE splitAt #-}
splitAt :: T -> Vector y -> (Vector y, Vector y)
splitAt = forall a.
Storable a =>
LazySize -> Vector a -> (Vector a, Vector a)
SigStV.splitAt forall b c a. (b -> c) -> (a -> b) -> a -> c
. T -> LazySize
ChunkySize.toStorableVectorSize
instance Read ([] y) where
{-# INLINE length #-}
length :: [y] -> T
length [y]
xs =
forall a. C a => [a] -> T a
Chunky.fromChunks forall a b. (a -> b) -> a -> b
$ forall a b. [a] -> b -> [b]
Match.replicate [y]
xs forall a b. (a -> b) -> a -> b
$ Int -> LazySize
SigG.LazySize forall a. C a => a
one
instance Transform ([] y) where
{-# INLINE take #-}
take :: T -> [y] -> [y]
take T
ns =
forall b a. [b] -> [a] -> [a]
Match.take (T -> [()]
ChunkySize.toNullList T
ns)
{-# INLINE drop #-}
drop :: T -> [y] -> [y]
drop T
ns [y]
xs =
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl
(\[y]
x (SigG.LazySize Int
n) -> forall a. Int -> [a] -> [a]
List.drop Int
n [y]
x)
[y]
xs (forall a. C a => T a -> [a]
Chunky.toChunks T
ns)
{-# INLINE splitAt #-}
splitAt :: T -> [y] -> ([y], [y])
splitAt T
ns =
forall b a. [b] -> [a] -> ([a], [a])
Match.splitAt (T -> [()]
ChunkySize.toNullList T
ns)
instance Read (SigS.T y) where
{-# INLINE length #-}
length :: T y -> T
length =
forall a. C a => [a] -> T a
Chunky.fromChunks forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall y. T y -> [y]
SigS.toList forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall a b. (a -> b) -> T a -> T b
SigS.map (forall a b. a -> b -> a
const (Int -> LazySize
SigG.LazySize forall a. C a => a
one))
instance Transform (SigS.T y) where
{-# INLINE take #-}
take :: T -> T y -> T y
take T
size0 =
forall x acc y. (x -> acc -> Maybe (y, acc)) -> acc -> T x -> T y
SigS.crochetL
(\y
x (Int
n,[LazySize]
ns) ->
if Int
nforall a. Ord a => a -> a -> Bool
>forall a. C a => a
zero
then forall a. a -> Maybe a
Just (y
x, (forall a. Enum a => a -> a
pred Int
n, [LazySize]
ns))
else
case [LazySize]
ns of
SigG.LazySize Int
m : [LazySize]
ms -> forall a. a -> Maybe a
Just (y
x, (forall a. Enum a => a -> a
pred Int
m, [LazySize]
ms))
[] -> forall a. Maybe a
Nothing)
(forall a. C a => a
zero, forall a. C a => T a -> [a]
Chunky.toChunks forall a b. (a -> b) -> a -> b
$ forall a. C a => T a -> T a
Chunky.normalize T
size0)
{-# INLINE drop #-}
drop :: T -> T y -> T y
drop T
ns T y
xs =
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
List.foldl
(\T y
x (SigG.LazySize Int
n) -> forall a. Int -> T a -> T a
SigS.drop Int
n T y
x)
T y
xs (forall a. C a => T a -> [a]
Chunky.toChunks T
ns)
{-# INLINE splitAt #-}
splitAt :: T -> T y -> (T y, T y)
splitAt T
n =
forall a c b d. (a -> c, b -> d) -> (a, b) -> (c, d)
mapPair (forall y. [y] -> T y
SigS.fromList, forall y. [y] -> T y
SigS.fromList) forall b c a. (b -> c) -> (a -> b) -> a -> c
.
forall sig. Transform sig => T -> sig -> (sig, sig)
splitAt T
n forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall y. T y -> [y]
SigS.toList