diff --git a/samples/mostly-adequate/chapter06_exampleapplication_test.go b/samples/mostly-adequate/chapter06_exampleapplication_test.go new file mode 100644 index 0000000..2f9ad02 --- /dev/null +++ b/samples/mostly-adequate/chapter06_exampleapplication_test.go @@ -0,0 +1,115 @@ +// 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 mostlyadequate + +import ( + "context" + "fmt" + "net/http" + "regexp" + + A "github.com/IBM/fp-go/array" + E "github.com/IBM/fp-go/either" + F "github.com/IBM/fp-go/function" + J "github.com/IBM/fp-go/json" + S "github.com/IBM/fp-go/string" + + R "github.com/IBM/fp-go/context/readerioeither" + H "github.com/IBM/fp-go/context/readerioeither/http" +) + +type ( + FlickrMedia struct { + Link string `json:"m"` + } + + FlickrItem struct { + Media FlickrMedia `json:"media"` + } + + FlickrFeed struct { + Items []FlickrItem `json:"items"` + } +) + +func (f FlickrMedia) getLink() string { + return f.Link +} + +func (f FlickrItem) getMedia() FlickrMedia { + return f.Media +} + +func (f FlickrFeed) getItems() []FlickrItem { + return f.Items +} + +func Example_application() { + // pure + host := "api.flickr.com" + path := "/services/feeds/photos_public.gne" + query := S.Format[string]("?tags=%s&format=json&jsoncallback=?") + url := F.Flow2( + query, + S.Format[string](fmt.Sprintf("https://%s%s%%s", host, path)), + ) + // flick returns jsonP, we extract the JSON body, this is handled by jquery in the original code + sanitizeJsonP := Replace(regexp.MustCompile(`(?s)^\s*\((.*)\)\s*$`))("$1") + // parse jsonP + parseJsonP := F.Flow3( + sanitizeJsonP, + S.ToBytes, + J.Unmarshal[FlickrFeed], + ) + // markup + img := S.Format[string]("") + // lenses + mediaUrl := F.Flow2( + FlickrItem.getMedia, + FlickrMedia.getLink, + ) + mediaUrls := F.Flow2( + FlickrFeed.getItems, + A.Map(mediaUrl), + ) + images := F.Flow2( + mediaUrls, + A.Map(img), + ) + + client := H.MakeClient(http.DefaultClient) + + // func(string) R.ReaderIOEither[[]string] + app := F.Flow5( + url, + H.MakeGetRequest, + H.ReadText(client), + R.ChainEitherK(parseJsonP), + R.Map(images), + ) + + // R.ReaderIOEither[[]string] + // this is the managed effect that can be called to download and render the images + catImageEffect := app("cats") + + // impure, actually executes the effect + catImages := catImageEffect(context.TODO())() + fmt.Println(E.IsRight(catImages)) + + // Output: + // true + +}