88OK-FP is a small, focused functional programming toolkit for TypeScript. It provides composable, type-safe wrappers for optional values, errors, and async computations. If you're new to Effect Data Types, the video below gives a quick introduction to the core ideas behind the library.
99
1010<div class =" video-wrapper " >
11- <iframe width = " 560 " height = " 315 " src =" https://www.youtube.com/embed/-aNP5pisXWY?start=21 " title =" Introduction to OK-FP (Riga Frontend Meetup) " frameborder =" 0 " allow =" accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share " allowfullscreen class =" video-iframe " ></iframe >
11+ <iframe src =" https://www.youtube.com/embed/-aNP5pisXWY?start=21 " title =" Introduction to OK-FP (Riga Frontend Meetup) " frameborder =" 0 " allow =" accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share " allowfullscreen class =" video-iframe " ></iframe >
1212 <p class =" video-caption " >Introduction to OK-FP (FrontEnd Meetup Riga)</p >
1313</div >
1414
@@ -36,7 +36,7 @@ $ yarn add ok-fp
3636
3737<div class =" effect-card " >
3838
39- <a href =" ./ option.html " class =" effect-title " >Option</a >
39+ <a href =" /ok-fp/ option" class =" effect-title " >Option</a >
4040
4141A value that might not exist, a type-safe alternative to ` null ` checks.
4242
@@ -50,7 +50,7 @@ some("Alice")
5050
5151<div class =" effect-card " >
5252
53- <a href =" ./ either.html " class =" effect-title " >Either</a >
53+ <a href =" /ok-fp/ either" class =" effect-title " >Either</a >
5454
5555Success or typed error. Stops at the first failure.
5656
@@ -67,7 +67,7 @@ right(25)
6767
6868<div class =" effect-card " >
6969
70- <a href =" ./ validation.html " class =" effect-title " >Validation</a >
70+ <a href =" /ok-fp/ validation" class =" effect-title " >Validation</a >
7171
7272Like Either, but accumulates ** all** errors. Ideal for forms and config.
7373
@@ -80,7 +80,7 @@ map2(validateName(name), validateAge(age), (name, age) => ({ name, age }));
8080
8181<div class =" effect-card " >
8282
83- <a href =" ./ task.html " class =" effect-title " >Task</a >
83+ <a href =" /ok-fp/ task" class =" effect-title " >Task</a >
8484
8585Lazy async computation. Nothing runs until you call ` .run() ` .
8686
@@ -94,7 +94,7 @@ fromPromise(() => fetch("/api/user").then((r) => r.json()))
9494
9595<div class =" effect-card " >
9696
97- <a href =" ./ task-either.html " class =" effect-title " >TaskEither</a >
97+ <a href =" /ok-fp/ task-either" class =" effect-title " >TaskEither</a >
9898
9999Lazy async with typed errors. Combines Task + Either.
100100
@@ -107,7 +107,7 @@ const fetchUser = tryCatch(
107107
108108</div >
109109
110- <style >
110+ <style scoped >
111111.hero {
112112 text-align : center ;
113113 padding : 1rem 0 4rem ;
@@ -132,8 +132,10 @@ const fetchUser = tryCatch(
132132 gap : 0.5rem ;
133133}
134134.video-iframe {
135+ width : 100% ;
136+ max-width : 560px ;
137+ aspect-ratio : 16 / 9 ;
135138 border-radius : 8px ;
136- max-width : 100% ;
137139}
138140.video-caption {
139141 font-size : 0.95rem ;
@@ -157,6 +159,8 @@ const fetchUser = tryCatch(
157159.effect-card div [class *= " language-" ] {
158160 margin : 0.75rem -1.25rem 0 ;
159161 border-radius : 0 0 8px 8px ;
162+ position : relative ;
163+ z-index : 1 ;
160164}
161165.effect-title {
162166 font-size : 1.2rem ;
@@ -173,6 +177,7 @@ const fetchUser = tryCatch(
173177 content : " " ;
174178 position : absolute ;
175179 inset : 0 ;
180+ z-index : 0 ;
176181}
177182.effect-card > p {
178183 margin : 0.25rem 0 0 ;
0 commit comments