module Data.FuzzySet.Utils
  ( (<$$>)
  , (<$$$>)
  , safeHead
  , enclosedIn
  , substr
  ) where

import Data.Text (Text, cons, snoc)
import qualified Data.Text as Text

(<$$>) :: (Functor f, Functor g) => (a -> b) -> f (g a) -> f (g b)
<$$> :: forall (f :: * -> *) (g :: * -> *) a b.
(Functor f, Functor g) =>
(a -> b) -> f (g a) -> f (g b)
(<$$>) = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap

infixr 8 <$$>

(<$$$>) :: (Functor f, Functor g, Functor h) => (a -> b) -> f (g (h a)) -> f (g (h b))
<$$$> :: forall (f :: * -> *) (g :: * -> *) (h :: * -> *) a b.
(Functor f, Functor g, Functor h) =>
(a -> b) -> f (g (h a)) -> f (g (h b))
(<$$$>) = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap

infixr 8 <$$$>

safeHead :: [a] -> Maybe a
safeHead :: forall a. [a] -> Maybe a
safeHead [] = forall a. Maybe a
Nothing
safeHead (a
h : [a]
_) = forall a. a -> Maybe a
Just a
h

enclosedIn :: Text -> Char -> Text
enclosedIn :: Text -> Char -> Text
enclosedIn Text
str Char
char = Char
char Char -> Text -> Text
`cons` Text
str Text -> Char -> Text
`snoc` Char
char

substr :: Int -> Int -> Text -> Text
substr :: Int -> Int -> Text -> Text
substr Int
n Int
m = Int -> Text -> Text
Text.take Int
n forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> Text -> Text
Text.drop Int
m