In Progress ...
Bolic is a functionally designed science based fitness training app — built with Azure Functions, LanguageExt v5, and C# functional programming principles.
The goal of Bolic is to create a fully composable, type-safe, and scalable backend that models real-world training structures (meso / macro cycles, training days, and volume tracking).
It's designed in a way to allow for quick iterations to always use what's "most optimal," staying up to date with current literature. I wanted something specifically for SBLs (Science Based Lifters) and people who want to track their lifts in the most optimal way.
Core functional and runtime abstractions.
This is the foundation of the project. It defines the core types, effects, and runtime configuration used throughout the Bolic ecosystem.
Runtime— provides access to core dependencies similar to DI (e.g.,CosmosClient,ILogger).Has<>implementations — allows type-safe dependency extraction viaEffandAsk.Utils— functional helpers for parsing HTTP requests (Option<T>, JSON deserialization, etc.).- Global
usingimports for:LanguageExtAzure.IdentityMicrosoft.Azure.Cosmos- Logging abstractions (
ILogger,NullLogger)
Input processing and request mapping layer.
The Tap package ("Transform and Process") is responsible for handling incoming Azure Function HTTP requests, extracting data, and converting it into strongly-typed functional models, domain types in the future.
TapResult<T>— request box.Tap.Process<T>— convertsHttpRequestDatainto aTapResult<T>using composable functional effects.- Integration with
Utilsfor reading and decoding JSON bodies.
Bolic.Shared.Core
Cosmos DB access layer.
Encapsulates all database interactions using LanguageExt Eff effects and explicit error handling through Either.
Create,Read,Query, and futureUpdate/Deletefunctions.DatabaseError— functional error type for Cosmos operations.CreateRequest<T>,CreateResponse<T>— structured request/response models.- Lazy and eager query helpers using
FeedIterator<T>.
All database actions are modeled as pure functions:
Eff<Runtime, Either<DatabaseError, CreateResponse<T>>>