diff --git a/array/monoid.go b/array/monoid.go index ef87f5e..68fcc10 100644 --- a/array/monoid.go +++ b/array/monoid.go @@ -24,10 +24,10 @@ import ( func concat[T any](left, right []T) []T { // some performance checks ll := len(left) - lr := len(right) if ll == 0 { return right } + lr := len(right) if lr == 0 { return left } diff --git a/ioeither/generic/logging.go b/ioeither/generic/logging.go new file mode 100644 index 0000000..b57237d --- /dev/null +++ b/ioeither/generic/logging.go @@ -0,0 +1,43 @@ +// Copyright (c) 2023 IBM Corp. +// All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package generic + +import ( + "encoding/json" + "log" + + B "github.com/IBM/fp-go/bytes" + ET "github.com/IBM/fp-go/either" + F "github.com/IBM/fp-go/function" +) + +// LogJson converts the argument to JSON and then logs it via the format string +// Can be used with [ChainFirst] +func LogJson[GA ~func() ET.Either[error, any], A any](prefix string) func(A) GA { + return func(a A) GA { + // log this + return F.Pipe3( + ET.TryCatchError(json.MarshalIndent(a, "", " ")), + ET.Map[error](B.ToString), + FromEither[func() ET.Either[error, string]], + Chain[func() ET.Either[error, string], GA](func(data string) GA { + return FromImpure[GA](func() { + log.Printf(prefix, data) + }) + }), + ) + } +} diff --git a/ioeither/logging.go b/ioeither/logging.go new file mode 100644 index 0000000..2a72195 --- /dev/null +++ b/ioeither/logging.go @@ -0,0 +1,26 @@ +// Copyright (c) 2023 IBM Corp. +// All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ioeither + +import ( + G "github.com/IBM/fp-go/ioeither/generic" +) + +// LogJson converts the argument to pretty printed JSON and then logs it via the format string +// Can be used with [ChainFirst] +func LogJson[A any](prefix string) func(A) IOEither[error, any] { + return G.LogJson[IOEither[error, any], A](prefix) +} diff --git a/ioeither/logging_test.go b/ioeither/logging_test.go new file mode 100644 index 0000000..0bb91f0 --- /dev/null +++ b/ioeither/logging_test.go @@ -0,0 +1,42 @@ +// Copyright (c) 2023 IBM Corp. +// All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ioeither + +import ( + "testing" + + E "github.com/IBM/fp-go/either" + F "github.com/IBM/fp-go/function" + "github.com/stretchr/testify/assert" +) + +func TestLogging(t *testing.T) { + + type SomeData struct { + Key string `json:"key"` + Value string `json:"value"` + } + + src := &SomeData{Key: "key", Value: "value"} + + res := F.Pipe1( + Of[error](src), + ChainFirst(LogJson[*SomeData]("Data: \n%s")), + ) + + dst := res() + assert.Equal(t, E.Of[error](src), dst) +}