from collections.abc import Iterable
from typing import Self
from pyautd3.derive import builder
from pyautd3.derive import datagram
from pyautd3.derive import modulation
from pyautd3.derive.derive_datagram import datagram_with_segment
from pyautd3.driver.datagram.modulation import Modulation
from pyautd3.modulation.sine import Sine
from pyautd3.native_methods.autd3capi_driver import ModulationPtr
from pyautd3.modulation.cache import Cache
from pyautd3.modulation.fir import Fir
from collections.abc import Iterable
from pyautd3.modulation.radiation_pressure import RadiationPressure
from datetime import timedelta
from pyautd3.driver.datagram.with_timeout import DatagramWithTimeout
from pyautd3.driver.datagram.with_parallel_threshold import DatagramWithParallelThreshold
from pyautd3.native_methods.autd3capi_driver import Segment, TransitionModeWrap
from pyautd3.driver.datagram.with_segment import DatagramWithSegment



class Fourier(Modulation):
    _components: list[Sine]
    def __init__(self: Fourier, iterable: Iterable[Sine]) -> None: ...
    def _modulation_ptr(self: Fourier, ) -> ModulationPtr: ...
    def with_clamp(self: Fourier, clamp: bool) -> Fourier: ...
    def with_scale_factor(self: Fourier, scale_factor: float | None) -> Fourier: ...
    def with_offset(self: Fourier, offset: int) -> Fourier: ...
    def with_cache(self: Fourier, ) -> Cache[Fourier]: ...
    def with_fir(self: Fourier, iterable: Iterable[float]) -> Fir[Fourier]: ...
    def with_radiation_pressure(self: Fourier, ) -> RadiationPressure[Fourier]: ...
    def with_timeout(self: Fourier, timeout: timedelta | None) -> DatagramWithTimeout[Fourier]: ...
    def with_parallel_threshold(self: Fourier, threshold: int | None) -> DatagramWithParallelThreshold[Fourier]: ...
    def with_segment(self: Fourier, segment: Segment, transition_mode: TransitionModeWrap | None) -> DatagramWithSegment[Fourier]: ...
    @property
    def clamp(self: Fourier) -> bool: ...
    @property
    def scale_factor(self: Fourier) -> float | None: ...
    @property
    def offset(self: Fourier) -> int: ...
