// Generated by purs version 0.14.5
"use strict";
var Control_Comonad_Cofree = require("../Control.Comonad.Cofree/index.js");
var Control_Comonad_Env_Trans = require("../Control.Comonad.Env.Trans/index.js");
var Control_Comonad_Store_Trans = require("../Control.Comonad.Store.Trans/index.js");
var Control_Comonad_Traced_Trans = require("../Control.Comonad.Traced.Trans/index.js");
var Data_Functor = require("../Data.Functor/index.js");
var Data_Tuple = require("../Data.Tuple/index.js");
var unwrapCofree = function (dict) {
    return dict.unwrapCofree;
};
var comonadCofreeTracedT = function (dictFunctor) {
    return function (dictComonadCofree) {
        return function (dictMonoid) {
            return {
                unwrapCofree: function (v) {
                    return Data_Functor.map(dictComonadCofree.Functor0())(Control_Comonad_Traced_Trans.TracedT)(unwrapCofree(dictComonadCofree)(v));
                },
                Functor0: dictComonadCofree.Functor0,
                Comonad1: function () {
                    return Control_Comonad_Traced_Trans.comonadTracedT(dictComonadCofree.Comonad1())(dictMonoid);
                }
            };
        };
    };
};
var comonadCofreeStoreT = function (dictFunctor) {
    return function (dictComonadCofree) {
        return {
            unwrapCofree: function (v) {
                return Data_Functor.map(dictComonadCofree.Functor0())(function (x) {
                    return new Data_Tuple.Tuple(x, v.value1);
                })(unwrapCofree(dictComonadCofree)(v.value0));
            },
            Functor0: dictComonadCofree.Functor0,
            Comonad1: function () {
                return Control_Comonad_Store_Trans.comonadStoreT(dictComonadCofree.Comonad1());
            }
        };
    };
};
var comonadCofreeEnvT = function (dictFunctor) {
    return function (dictComonadCofree) {
        return {
            unwrapCofree: function (v) {
                return Data_Functor.map(dictComonadCofree.Functor0())(function (x) {
                    return new Data_Tuple.Tuple(v.value0, x);
                })(unwrapCofree(dictComonadCofree)(v.value1));
            },
            Functor0: dictComonadCofree.Functor0,
            Comonad1: function () {
                return Control_Comonad_Env_Trans.comonadEnvT(dictComonadCofree.Comonad1());
            }
        };
    };
};
var comonadCofreeCofree = function (dictFunctor) {
    return {
        unwrapCofree: Control_Comonad_Cofree.tail,
        Functor0: function () {
            return dictFunctor;
        },
        Comonad1: function () {
            return Control_Comonad_Cofree.comonadCofree(dictFunctor);
        }
    };
};
module.exports = {
    unwrapCofree: unwrapCofree,
    comonadCofreeCofree: comonadCofreeCofree,
    comonadCofreeEnvT: comonadCofreeEnvT,
    comonadCofreeStoreT: comonadCofreeStoreT,
    comonadCofreeTracedT: comonadCofreeTracedT
};
