{-# LANGUAGE CPP                   #-}
{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE InstanceSigs          #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies          #-}
{-# LANGUAGE TypeSynonymInstances  #-}
{-# LANGUAGE UndecidableInstances  #-}
{-# OPTIONS_GHC -fno-warn-dodgy-exports #-}


module RFC.Miso.String
  ( module RFC.Miso.String
  , module Miso.String
  ) where

import           Data.String          ()
import           Miso.String          (MisoString, ToMisoString (..))
import           RFC.Data.UUID        ()
import           RFC.String           ()

#ifdef GHCJS
import           Data.MonoTraversable
import qualified Data.Text.Lazy       as TL
import           RFC.Prelude

type instance Element MisoString = Char

instance MonoFunctor MisoString where
  omap :: (Char -> Char) -> MisoString -> MisoString
  omap f = toMisoString . omap f . toLazyText
  {-# INLINE omap #-}

instance MonoFoldable MisoString where
  ofoldMap f = ofoldr (mappend . f) mempty
  {-# INLINABLE ofoldMap #-}

  ofoldr :: (Char -> a -> a) -> a -> MisoString -> a
  ofoldr f init str = TL.foldr f init $ toLazyText str
  {-# INLINE ofoldr #-}

  ofoldl' :: (a -> Char -> a) -> a -> MisoString -> a
  ofoldl' f init str = TL.foldl' f init $ toLazyText str
  {-# INLINE ofoldl' #-}

  otoList = ofoldr (:) []
  {-# INLINABLE otoList #-}

  oall f str = TL.all f $ toLazyText str
  {-# INLINE oall #-}

  oany :: (Char -> Bool) -> MisoString -> Bool
  oany f str = TL.any f $ toLazyText str
  {-# INLINE oany #-}

  onull = TL.null . toLazyText
  {-# INLINE onull #-}

  olength64 = TL.length . toLazyText
  {-# INLINE olength64 #-}

  ofoldr1Ex :: (Char -> Char -> Char) -> MisoString -> Char
  ofoldr1Ex f str = TL.foldr1 f $ toLazyText str
  {-# INLINE ofoldr1Ex #-}

  ofoldl1Ex' :: (Char -> Char -> Char) -> MisoString -> Char
  ofoldl1Ex' f str = TL.foldl1' f $ toLazyText str
  {-# INLINE ofoldl1Ex' #-}

  headEx = TL.head . toLazyText
  {-# INLINE headEx #-}

  lastEx = TL.last . toLazyText
  {-# INLINE lastEx #-}

instance {-# OVERLAPPING #-} FromText MisoString where
  fromText :: Text -> MisoString
  fromText = toMisoString
  {-# INLINE fromText #-}

instance {-# OVERLAPPING #-} ToText MisoString where
  toText :: MisoString -> Text
  toText = fromMisoString
  {-# INLINE toText #-}

#endif