{-# LANGUAGE BlockArguments      #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications    #-}
{-# LANGUAGE ViewPatterns        #-}

module Dovetail.Core.Data.Array.NonEmpty.Internal where

import Data.Foldable (fold)
import Data.Vector (Vector)
import Data.Vector qualified as Vector
import Dovetail
import Dovetail.Evaluate (builtIn)
import Language.PureScript qualified as P

env :: forall ctx. Env ctx
env :: Env ctx
env = do
  let _ModuleName :: ModuleName
_ModuleName = Text -> ModuleName
P.ModuleName Text
"Data.Array.NonEmpty.Internal"

  [Env ctx] -> Env ctx
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold
    [ -- foldr1Impl :: forall a. (a -> a -> a) -> NonEmptyArray a -> a
      ModuleName
-> Text
-> ((Value ctx -> Value ctx -> Eval ctx (Value ctx))
    -> Vector (Value ctx) -> Eval ctx (Value ctx))
-> Env ctx
forall ctx a. ToValue ctx a => ModuleName -> Text -> a -> Env ctx
builtIn @ctx @((Value ctx -> Value ctx -> Eval ctx (Value ctx)) -> Vector (Value ctx) -> Eval ctx (Value ctx))
        ModuleName
_ModuleName Text
"foldr1Impl"
        \Value ctx -> Value ctx -> Eval ctx (Value ctx)
f -> 
          (Value ctx -> Value ctx -> Eval ctx (Value ctx))
-> Vector (Value ctx) -> Eval ctx (Value ctx)
forall (m :: * -> *) a.
Monad m =>
(a -> a -> m a) -> Vector a -> m a
Vector.fold1M ((Value ctx -> Value ctx -> Eval ctx (Value ctx))
-> Value ctx -> Value ctx -> Eval ctx (Value ctx)
forall a b c. (a -> b -> c) -> b -> a -> c
flip Value ctx -> Value ctx -> Eval ctx (Value ctx)
f) (Vector (Value ctx) -> Eval ctx (Value ctx))
-> (Vector (Value ctx) -> Vector (Value ctx))
-> Vector (Value ctx)
-> Eval ctx (Value ctx)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector (Value ctx) -> Vector (Value ctx)
forall a. Vector a -> Vector a
Vector.reverse
      -- foldl1Impl :: forall a. (a -> a -> a) -> NonEmptyArray a -> a
    , ModuleName
-> Text
-> ((Value ctx -> Value ctx -> Eval ctx (Value ctx))
    -> Vector (Value ctx) -> Eval ctx (Value ctx))
-> Env ctx
forall ctx a. ToValue ctx a => ModuleName -> Text -> a -> Env ctx
builtIn @ctx @((Value ctx -> Value ctx -> Eval ctx (Value ctx)) -> Vector (Value ctx) -> Eval ctx (Value ctx))
        ModuleName
_ModuleName Text
"foldl1Impl"
        (Value ctx -> Value ctx -> Eval ctx (Value ctx))
-> Vector (Value ctx) -> Eval ctx (Value ctx)
forall (m :: * -> *) a.
Monad m =>
(a -> a -> m a) -> Vector a -> m a
Vector.fold1M
      -- traverse1Impl
      --  :: forall m a b
      --   . (forall a' b'. (m (a' -> b') -> m a' -> m b'))
      --  -> (forall a' b'. (a' -> b') -> m a' -> m b')
      --  -> (a -> m b)
      --  -> NonEmptyArray a
      --  -> m (NonEmptyArray b)
    , ModuleName
-> Text
-> ((Value ctx -> Value ctx -> Eval ctx (Value ctx))
    -> ((Vector (Value ctx)
         -> Value ctx -> Eval ctx (Vector (Value ctx)))
        -> Value ctx -> Eval ctx (Value ctx))
    -> (Value ctx -> Eval ctx (Value ctx))
    -> Vector (Value ctx)
    -> Eval ctx (Value ctx))
-> Env ctx
forall ctx a. ToValue ctx a => ModuleName -> Text -> a -> Env ctx
builtIn @ctx @(
           (Value ctx -> Value ctx -> Eval ctx (Value ctx))
        -> ((Vector (Value ctx) -> Value ctx -> Eval ctx (Vector (Value ctx))) -> Value ctx -> Eval ctx (Value ctx))
        -> (Value ctx -> Eval ctx (Value ctx))
        -> Vector (Value ctx)
        -> Eval ctx (Value ctx)
        )
        ModuleName
_ModuleName Text
"traverse1Impl"
        \Value ctx -> Value ctx -> Eval ctx (Value ctx)
_apply (Vector (Value ctx) -> Value ctx -> Eval ctx (Vector (Value ctx)))
-> Value ctx -> Eval ctx (Value ctx)
_fmap Value ctx -> Eval ctx (Value ctx)
f Vector (Value ctx)
xs -> do
          let _cons :: Value ctx -> Value ctx -> Eval ctx (Value ctx)
              _cons :: Value ctx -> Value ctx -> Eval ctx (Value ctx)
_cons Value ctx
bs Value ctx
a = do
                Value ctx
b <- Value ctx -> Eval ctx (Value ctx)
f Value ctx
a
                (Vector (Value ctx) -> Value ctx -> Eval ctx (Vector (Value ctx)))
-> Value ctx -> Eval ctx (Value ctx)
_fmap (\Vector (Value ctx)
ys Value ctx
y -> Vector (Value ctx) -> Eval ctx (Vector (Value ctx))
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Vector (Value ctx) -> Value ctx -> Vector (Value ctx)
forall a. Vector a -> a -> Vector a
Vector.snoc Vector (Value ctx)
ys Value ctx
y)) Value ctx
bs Eval ctx (Value ctx)
-> (Value ctx -> Eval ctx (Value ctx)) -> Eval ctx (Value ctx)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (Value ctx -> Value ctx -> Eval ctx (Value ctx)
`_apply` Value ctx
b)
          (Value ctx -> Value ctx -> Eval ctx (Value ctx))
-> Vector (Value ctx) -> Eval ctx (Value ctx)
forall (m :: * -> *) a.
Monad m =>
(a -> a -> m a) -> Vector a -> m a
Vector.fold1M Value ctx -> Value ctx -> Eval ctx (Value ctx)
_cons Vector (Value ctx)
xs
    ]