kBool

typedef void (^kBoolBlock)(void);
@interface kBool : kObject
{
@private
  bool value;
}

+ (kBool*)no;
+ (kBool*)yes;

- (kBool*)isEqual:(kBool*)b;

- (void)ifNo:(kBoolBlock)sn;
- (void)ifNo:(kBoolBlock)sn ifYes:(kBoolBlock)sy;
- (void)ifYes:(kBoolBlock)sy;
- (void)ifYes:(kBoolBlock)sy ifNo:(kBoolBlock)sn;

@end
kBool *kBoolNo = nil, *kBoolYes = nil;
@implementation kBool

+ (kBool*)no
{
  if(!kBoolNo)
  {
    kBoolNo = [kBool alloc];
    kBoolNo->value = false;
  }

  return kBoolNo;
}

+ (kBool*)yes
{
  if(!kBoolYes)
  {
    kBoolYes = [kBool alloc];
    kBoolYes->value = true;
  }

  return kBoolYes;
}

- (kBool*)isEqual:(kBool*)b
{
  if(self == b)
    return kBoolYes;
  else
    return kBoolNo;
}

- (void)ifNo:(kBoolBlock)sn
{
  if(!value)
    sn();
}

- (void)ifNo:(kBoolBlock)sn ifYes:(kBoolBlock)sy
{
  if(!value)
    sn();
  else
    sy();
}

- (void)ifYes:(kBoolBlock)sy
{
  if(value)
    sy();
}

- (void)ifYes:(kBoolBlock)sy ifNo:(kBoolBlock)sn
{
  if(value)
    sy();
  else
    sn();
}

@end